«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP 79 Аноним 2016/07/11 19:12:16  №793705 1
14682535369120.png (32, 500x500)
500x500
14682535369121.jpg (132, 1024x683)
683x1024
14682535369162.png (188, 853x480)
480x853
14682535369203.jpg (118, 1024x768)
768x1024
Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что почитать

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

Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Важно Аноним 2016/07/11 19:13:25  №793707 2
14682536057420.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/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md


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

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

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

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

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

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

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

Объясняй

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

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

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

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

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Калькулятор Аноним 2016/07/11 22:16:09  №793836 3
14682645694320.png (3, 535x192)
192x535
>> $this->sign ^= true;
> ^ это не булев, а целочисленный (побитовый) оператор. Он работает с числами а не true/false.

У меня была идея использовать его вот так: вот есть знак, допустимое множество принимаемых им значений: ['+', '-']. В таком случае логичнее знак выразить через булевый оператор, да и в PHP нет enum'ов. Знак дроби нужно будет менять. Для смены знака можно использовать код вроде "Если знак true, выставить ему false, если знак false - выставить true".
А можно сделать без условий вот так: $this->sign ^= true; Этот код будет всегда менять знак на противоположный, пример на пике [NUMBER]
На пике часть его таблицы истинности.
XOR ведь ещё для шифрования из-за обратимости используется, поскольку false ^ true ^ true даст false. Если знак инвертировать 2 раза, то мы получим тот же знак, что и был у нас изначально. Я в упор не вижу какого-то более простого и очевидного решения?
В любом случае, как я и говорил, это подразумевает необходимость возиться со знаками. Хотя ещё была идея абсолютно все действия выражать через Addition (Power выражается через Multiplication, который в свою очередь выражается через Addition). Это позволило бы возню со знаками сконцентрировать в одном месте, в классе Addition.

> Чему равен корень из 2? Это так называемая бесконечная дробь, которую нельзя представить в виде рационального числа.
Получается, надо либо запретить возводить в дробные степени, либо запретить возводить в степени, которые дают иррациональное число (метод Роскомнадзора), либо придумать метод выразить результат приближенно (увы, теряя точность).
> Неплохо бы помечать полученные в результате округления значения специальной пометкой.
То есть делать для каждой SimpleFraction флаг, отвечающий за точность/неточность? И исходить из того, что точная дробь оператор неточная дробь даст неточную дробь?
Всё-таки склоняюсь к тому, чтобы запретить возводить число в степень дроби, предварительно делая проверку на логарифм.
То есть 9 ^ 1/2 возводить можно, потому что 2 - логарифм 9-и по основанию 3.
9 ^ 1/3 возводить уже нельзя, потому что ни одно число в 3-й степени не равно 9-и.

>> return (string) floatval(bcdiv(...))
> floatval делает преобразование в float. float даже в 64-битном пхп сохраняет не более 14 значащих цифр
Там precision у bcdiv 20, то есть он всегда дробную часть добивает нулями. Тогда нули убирать регулярками/фунциями для манипуляций со строками?

И ещё раз спасибо большое за дельные советы по остальному.
Алсо, ссылка на https://swtch.com/~rsc/regexp/ не работает.
Аноним 2016/07/11 23:30:35  №793885 4
>>793705 (OP)
Привет, аноны-мастера. Есть тут кто-то, кто поможет не опытному разобраться с проблемой? Суть, собственно вот в чем:
делаю сайт на Codeigniter(ТЗ, на должность джуниора) и все в общем хорошо получается, но вот не могу раздуплиться с Базой Данных. Мне нужно создать БД с тремя таблицами - не вопрос. создал (написал запрос SQL и отправил на сервак) и дальше прекрасно с ней работаю, но я не пойму как мене отправить это работодателю. Просто вложенный файл с запросом, или написать дополнительный метод метод и объяснить им что он делает. Собственно не имея опыта я и хочу разобраться как лучше сделать
Аноним 2016/07/12 00:08:53  №793926 5
>>793885
Напиши отдельный скрипт, с названием что-то типа sql-shema , который будет накатывать таблицы, если их нет.
Аноним 2016/07/12 00:17:02  №793930 6
>>793885
Отправляй дамп базы вместе с кодом.
Аноним 2016/07/12 00:37:40  №793935 7
Аноним 2016/07/12 06:48:02  №794034 8
Аноним 2016/07/12 10:21:55  №794105 9
Аноним 2016/07/12 14:18:24  №794246 10
Лиличка, считалка Аноним 2016/07/12 14:19:45  №794248 11
someApprentice 2016/07/12 14:24:34  №794250 12
github.com/someApprentice/Students

>>773648
https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Helper.php
https://github.com/someApprentice/Students/blob/master/app/Model/Helper/LoginHelper.php
>Далее, нет логики в наследовании хелперов. Вот у тебя есть Helper и есть LoginHelper, который его наследует. Непонятно, а зачем? Там все равно почти все методы статические. Точнее, часть статическая, а часть нет, и почему, непонятно.
В контроллерах нужны оба этих класса. Если наследовать их, то можно будет обойтись только одним.


>>773648
>И наконец, в некоторых местах, ты обращаешься к массивам вроде $_GET или $_COOKIE, не проверяя перед этим, есть ли в них такой элемент:

>Helper::redirect($_GET['go']);

>Но ведь он может и отсутствовать. Лучше использовать функцию, вроде $this->getQuery('go'), которая делает нужную проверку.
А куда поместить метод getCookie('cookieName')? Мы скорее обращаемся к ним и на заглавной странице и в хелперах, а не в контроллере.
И нужен ли метод getPost('postName')? Все равно данные пришедшие из $_POST обрабатываются в классе формы: https://github.com/someApprentice/Students/blob/master/app/Model/Entity/Forms/RegisterStudentForm.php#L19

>>773648
https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Helper.php#L6
>Редирект, кстати, я подумал, логичнее было бы поместить в базовый класс контроллера. Тогда редиректить можно будет только из контроллеров.
А это разве не задача модели? Контроллер же должен только работать с пришедшими данными и обращаться к модели.


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

<button type="button">Exit</button>
<form method="POST" action="/logout">
<input type="hidden" name="token" value="...">
</form>

Как это сделано? Ведь тэг button и форма никак не связанны. С помощью js? А если пользователь отключил его то такой способ не подходит? Почему нельзя просто добавить <input type="button"> внутри формы?
Аноним 2016/07/12 16:35:20  №794374 13
Нужно ли знать пыхомакаке жс и хтмл не на базовом уровне?
Аноним 2016/07/12 16:38:50  №794378 14
>>794374
Макаке, я думаю вообще переживать не стоит по этому поводу, а специалисту - конечно нужно.
Аноним 2016/07/12 16:44:13  №794384 15
14683310532410.png (43, 1098x592)
592x1098
Ребята, столкнулся с проблемой с CRON
Есть скрипт который добавляет строку в таблицу Базы Данных.
Запускаю чего через CRON каждую минуту. Настройки выставлены правильно, техподдерка моего хостинга так же говорит что проблема с моей стороны.
Итак как видно на пике, я выставляю как положено настройки чтобы скрипт запускался каждую минуту, но вот каждый час скрипт запускается лишний раз. Я так понимаю, скорее всего и каждый день\месяц и т.д. будет лишний запуск.
Возможно я неправильно пишу команду? Может wget здесь нужно заменить на что-то другое? С кроном никогда не работал, гугл молчит, схожих проблем я там не смог найти, как починить не знаю, уже отчаялся, спасайте.
Аноним 2016/07/12 16:51:28  №794393 16
>>794378
>Пыха
>Специалисты
Аноним 2016/07/12 17:34:54  №794418 17
Посоветуйте годные книги по пхп
Аноним 2016/07/12 17:37:05  №794420 18
>>794418
Читать шапку ты не хочешь из принципа?
mysql Аноним 2016/07/12 18:47:35  №794471 19
Поясните чем плоха такая конструкция в контексте производительности:
(SELECT FROM `filmmeta`
WHERE id =10) union (select
,null,null,null from filmfields where filmid=10)
Аноним 2016/07/12 19:35:27  №794531 20
Аноним 2016/07/12 21:56:06  №794736 21
Правда что хохлоджунам в похапе платят 200 баксов?
Ответы в старом треде Аноним 2016/07/12 22:06:18  №794745 22
Проверил в старом треде решения за конец июня:

Сапер https://jsfiddle.net/mayzx8qt/ >>794739
Антикризисные меры, вектор http://ideone.com/IXqHnc >>794740
https://github.com/never3ver/studentslist >>794742
Вектор | http://ideone.com/H5DCfT >>794743

Зайдите, посмотрите.

Если про вас забыли - можете напомнить тут о себе в этом треде.

Напомню себе что надо будет глянуть https://github.com/applejacky/students
Аноним 2016/07/12 22:14:31  №794748 23
>>793836

> А можно сделать без условий вот так: $this->sign ^= true;
Нельзя, попробуй сдампить var_dump(true ^ false ) - будет число а не булевое значение. Можешь еще заодно посмотреть например чему равно 35 ^ 63. ^ работает с числами.

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

> Хотя ещё была идея абсолютно все действия выражать через Addition (Power выражается через Multiplication, который в свою очередь выражается через Addition).
Это будет нереально медленно.

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

> Всё-таки склоняюсь к тому, чтобы запретить возводить число в степень дроби, предварительно делая проверку на логарифм.
А нельзя проверять что получилось целое число? Хотя, при работе с float гарантий что оно дейсивтельно целое, нету... Можно попробовать получившееся число возвести обратно в квадрат с bcmul и проверить что ответ совпадает с исходным, точным числом.

> Там precision у bcdiv 20, то есть он всегда дробную часть добивает нулями. Тогда нули убирать регулярками/фунциями для манипуляций со строками?
У тебя по идее знаменатель и числитель целые ведь. Зачем что-то добивать?

> Алсо, ссылка на https://swtch.com/~rsc/regexp/ не работает.
У меня работает. Попробуй чрез гуглокеш ( http://webcache.googleusercontent.com/search?q=cache:https://swtch.com/~rsc/regexp/&ie=UTF-8&gws_rd=cr&ei=gUGFV4yrCsifsgGQpLnoBQ ) или прокси открть или другим браузером - в фаерфоксе у меня 100% работает.

Аноним 2016/07/12 22:19:47  №794749 24
>>794736
Вообще больше, от $400, в Киеве может больше.
Аноним 2016/07/12 22:20:24  №794751 25
>>794250

> В контроллерах нужны оба этих класса. Если наследовать их, то можно будет обойтись только одним.
Это не повод для наследования. Наследование это отношения вида "А является Б" и тут это явно 2 отдельных не связанных друг с другом класса.

> А куда поместить метод getCookie('cookieName')?
В хелпер например.

> И нужен ли метод getPost('postName')?
Можешь сделать если хочешь.

>>Редирект, кстати, я подумал, логичнее было бы поместить в базовый класс контроллера. Тогда редиректить можно будет только из контроллеров.
> А это разве не задача модели? Контроллер же должен только работать с пришедшими данными и обращаться к модели.
ты не понимаешь MVC. Модель не взаимодействует с внешним миром и не отвечает за интерфейс пользователя. Она управляет данными, внутренним состоянием программы (в твоем случае - списком стдентов).

Редирект это взаимодейсвтие с браузером пользователя, это интерфейс. Вот представь что мы работаем с твоей программой из командной строки. Какой смысл имеет в командной строке редирект? Никакого, это часть протокола HTTP. Значит, в модели ему делать нечего так как модель - это код, который не зависит от способа взаимодействия пользоваетля с программой.

> Как это сделано? Ведь тэг button и форма никак не связанны. С помощью js? А если пользователь отключил его то такой способ не подходит?
Да, наверно через js. Хотя в HTML5 вроде есть какой-то атрибут чтобы привязать кнопку к форме по id.

> Почему нельзя просто добавить <input type="button"> внутри формы?
Не знаю, спроси у автора кода.

Аноним 2016/07/12 22:29:12  №794753 26
>>794749
А хуле в вакансиях пишут по 5-8к хрювен? Или я что то не так делаю и не там смотрю(смотрю сайты типа работы.юа, доу.юа и т.д.)? Как "правильно" искать первую работу? Мб есть какие-то вакансии о которых я не знаю? Мне говорят в моем городе есть дохуя вакансий и типа все ищут но на том же доу и работе нихуя нет вообще.
Аноним 2016/07/12 22:45:20  №794768 27
>>794753
1) Джун это 0.5-1 год опыта работы, зп обычно 600-800
2) Тебе нужна стажировка/интернатура/трейни, там как раз платят 300 баксов и тебя скорее УЧАТ чем ты работаешь

Где искать? В любой крупной компании. Циклум, люкс, софтсерв, епам и глобал по 200-400 человек в год набирают.
Аноним 2016/07/12 22:48:56  №794772 28
>>794768
Упс, слегонца тредом ошибся, думал это в МЫ ВАМ ПЕРЕЗВОНИМ, лол.
Ну, на пхпшников они набирают заметно меньше, но если ты хорошо знаешь жс, то можно найти и там нечто подобное. Обычно на пхп набирают компании попроще, ибо в сириус интерпрайз говне пхп особо не живёт.
Аноним 2016/07/12 22:52:59  №794778 29
>>794753
Значит город у тебя маленький или ты смотришь вакансии на которых оформляют по трудовой. Нормальная ЗП джуна в украинском городе с населением от миллиона это начиная от $500.
Есть еще вакансии стажеров, но это вообще рабский труд, не рекомендую.
Аноним 2016/07/12 22:54:03  №794780 30
>>794768
А если у меня есть какие то свои проектики то это в плюс?
Аноним 2016/07/12 22:58:19  №794789 31
>>794780
Это пиздец какой плюс, особенно если ты можешь по ним всё объяснить и это не хеллоу ворлд.
Проектик на фреймворке, с тестиками и прочим в глазах работодателя будет выглядеть просто збс.
Аноним 2016/07/12 23:33:18  №794808 32
В таблице mysql записи вида
user (id, name) values
(1, 'Иванов Иван Иванович'),
(2, 'Иван Иванович Иванов'),
...
(33, 'иван(несколько пробелов)иванович иванов')

Задача: как убрать повторяющиеся записи, если они не посимвольно совпадают?
Аноним 2016/07/12 23:47:02  №794818 33
>>794808
explode()? Разбиваешь записи на слова и сравниваешь.
Аноним 2016/07/12 23:55:34  №794822 34
>>794818
Хорошо хоть не регулярки.
Нет, это делается средствами sql.
Возможно полнотекстовый поиск, затем удалять по релевантности.
Аноним 2016/07/13 08:03:21  №794930 35
Аноним 2016/07/13 08:08:18  №794931 36
Если я тупой и не могу собираться и решать большие задачи, то стоит ли начать налегать на книги?
Аноним 2016/07/13 08:22:45  №794934 37
Есть ли книги по пыхе для НОВИЧКОВ? Писать хеллоуворлды для школьников по смищному найду из народа сру не хочу, меня все же интересует архитектура языка, веб-сервера, взаимодействие с бд и т.д. То что в оп-посте нацелено на уже знающих пыху.
Мимо собираюсь учить пыху паралельно с джавой аналог книги которую я хочу это хуйня по джаве от Г. Шилдта
Аноним 2016/07/13 10:32:20  №794978 38
Оп, как доставать превьюшки, если они в папке file_sharing/uploads/2016/месяц/день/thumbnails, а корень сервера, где лежит индекс и ксс, в file-sharing/public? Перенести их в public (корень сервера)? Перенести не только их, а все загруженные файлы в public?
Аноним 2016/07/13 11:15:22  №794994 39
>>794931
То чувство, когда пошел качать книги порекомендованные оп-ом, они в формате djvu, полез качать ридер под это дело, зашел на первый в списке гугла сайт с приятной наружностью. Скачал их читалку, а эти пидоры поимели меня, установив кучу параши уровня амиго, мейл.ру, одноклассников и вообще блядь просто реально около 10 софтин без спроса в том числе новый какой-то сраный браузер и блядь сломали старые браузеры. Сука я от злобы нахуй аж винду снес блядь.
Аноним 2016/07/13 11:48:15  №795007 40
>>794994
То чувство, когда дибил не может скачать простой windjview с сайта разработчика
Аноним 2016/07/13 12:05:12  №795019 41
>>794994

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

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

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

Для чтения djvu есть windjview.
Аноним 2016/07/13 12:38:26  №795038 42
>>794934
Робин Никсон "Создаём динамические сайты на Вашей досточтимой матушке".
А вообще учебник ОПа как раз для новичков.
Аноним 2016/07/13 13:01:38  №795060 43
Посоветуйте какую-нибудь библиотеку для написания парсера. Типа чтобы удобно было вытаскивать нужный контент со странички. Где-то видел название одной, но забыл.
Аноним 2016/07/13 13:09:15  №795066 44
Есть строка.
SELECT * FROM stat WHERE datetime_now = (SELECT max(datetime_now) FROM stat)
Достает из базы строку с последней датой.
Как мне достать теперь строку с датой на минуту меньше? Всякие dateadd не работают, ну или я рукожоп.
Тип DATETIME если что.
Аноним 2016/07/13 13:42:13  №795081 45
>>795066
SELECT * FROM stat order by datetime_now limit 1,1
Аноним 2016/07/13 13:54:16  №795088 46
>>795060
Зачем тебе парсер, если PHP сам парсер?
Аноним 2016/07/13 15:19:05  №795134 47
>>795081
Спасибо, но не совсем то, вроде как.
А через DATEADD это как бы выглядело?
Аноним 2016/07/13 16:11:03  №795180 48
14684154637570.jpg (81, 332x500)
500x332
Котаны, нужно сделать сайт риелтору.
На сайте должен быть каталог с его недвигой и собственно поиск по этому каталогу с помощью ключевых тегов.
Самому риелтору нужна админка, чтобы добавлять и удалять недвигу из каталога.

Какая цмс для такого лучше подойдёт?
Аноним 2016/07/13 17:04:14  №795239 49
14684186549720.png (25, 263x89)
89x263
>>794748

> попробуй сдампить var_dump(true ^ false )
Я забыл скастовать в bool. Примеры на пике. Но я таки увидел простое и очевидное решение - это оператор отрицания.
В таком случае операция смены знака могла бы выглядеть так: $this->sign = !$this->sign.
Стыдно, что раньше не заметил, сам оператор даже называется "отрицание".

>> Всё-таки склоняюсь к тому, чтобы запретить возводить число в степень дроби, предварительно делая проверку на логарифм.
> А нельзя проверять что получилось целое число? Хотя, при работе с float гарантий что оно дейсивтельно целое, нету...
Да, var_dump(pow(9, 1/2)) выдаёт float(3).
А вот JavaScript для Number.isInteger(Math.pow(9, 1/2)) выдаёт true.

> Можно попробовать получившееся число возвести обратно в квадрат с bcmul и проверить что ответ совпадает с исходным, точным числом.
Не понял что значит "возвести обратно в квадрат с bcmul" и зачем там bcmul.
Возьмём пример 9^1/2
Исходное число 9 нужно возвести в степень 1/2, делается только так: pow(9, 1/2). Как я уже писал раннее, функция pow - единственная функция, которая может возводить в дробные степени, но она ограничена битностью ОС, на которой запущена.
Короче от pow(9, 1/2) получили float(3). Теперь нужно проверить, что 3^2 === 9. Опять берём pow, bcpow не подходит, так как:
1) Отдаёт результат в строке, проверка float(3) === string(3) не пройдёт;
2) Мы изначально пользовались pow, может возникнуть ситуация, когда pow(очень_длинное_число) != bcpow(то_же_самое_очень_длинное_число)

Вот взял я pow, но pow(3, 2) !== int(9), так как pow возвращает float. Использовать нестрогое равенство (==) нельзя, так как pow(pow(9, 1/3), 3) == 9, что неправильно.
Вот здесь подробнее: https://ideone.com/I6onbw
Да и что делать с очень большими числами, которые pow не может обработать?
Чувствую, что во мне говорит леность и слабость, но всё-таки: может PHP не самый удачный язык для настолько точных расчётов и больших чисел?
Алсо, если вводить ограничение на длину вводимых чисел, как определять, что число слишком большое для данной битности ОС?
Аноним 2016/07/13 17:24:09  №795255 50
>>795239

У меня идея такая:

$a = '9';
$b = '1'/'2';

// $a и $b преобразуются во float - возможная потеря точности
$result = pow($a, $b);

// $result имеет тип float - он неточный

Затем мы делаем такой трюк: возводим $result в квадрат с помощью bcpow (без потерь точности). Сравниваем результат возведения (строку) с $a (строкой). Если они совпали - результат (после преобразования в строку) оказался точный, если нет - мы потеряли где-то на конвертации во флоат или при взятии корня и имеем приблизительный результат.

Вообще, конечно, правильнее не писать это самому, а искать готовую библиотеку. Но с дробями сложность в том что корень из некоторых чисел (например корень из 2) в принципе невозможно посчитать точно. Он будет бесконечной непериодичной дробью, иррациональным числом, не представимым в виде a/b. Потому библиотека вроде bcmath ничем помочь не может.

Я уже писал выше, что чтобы работать с иррациональными числами, нам нужно хранить их как есть, то есть "корень степени a из b" и это приведет нас к тому что надо оперировать не числами, а выражениями вида "корень из 3 плюс корень из 2".

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

> Да и что делать с очень большими числами, которые pow не может обработать?
Ничего не поделать. Хотя имея точное представление числа можно определять что оно выходит за диапазон флоата.

> Чувствую, что во мне говорит леность и слабость, но всё-таки: может PHP не самый удачный язык для настолько точных расчётов и больших чисел?
Сам по себе - не удачный, нужна мат. библиотека.

> Алсо, если вводить ограничение на длину вводимых чисел, как определять, что число слишком большое для данной битности ОС?
Посмотреть пределы в мануале или погуглить IEEE 754. на хабре есть статья.

Аноним 2016/07/13 17:24:56  №795257 51
>>795239

Я уже написал что знак числа удобнее представлять не в виде true/false а в виде +1/-1 и делать с ним нужные операции. Но тебе это не нужно.
Аноним 2016/07/13 18:03:13  №795292 52
>>795060
Сам пиши библиотеку. Все говно
Аноним 2016/07/13 18:37:51  №795321 53
14684242719210.png (56, 1207x732)
732x1207
Решил вместо работы над ошибками в задаче Кошки-мышки, систематизировать все свои ошибки в предыдущих задачах, на которые указывал ОП. Вот что получилось.
Аноним 2016/07/13 19:34:51  №795352 54
14684276915220.png (2, 356x119)
119x356
>>795255
> то есть "корень степени a из b" и это приведет нас к тому что надо оперировать не числами, а выражениями вида "корень из 3 плюс корень из 2".

Я не смогу это реализовать. Даже если я добавлю объект "Иррациональное число" с дробью и подкоренным выражением. Как вклинить, например, выражение "V(2) + V(3)" (Корень из 2-х + корень из 3-х) в алгоритм сортировочной станции, это выражение не вычисляется.
Просто игнорировать сортировочная станция его не может, так как потом может появится ещё один корень из 3-х и его уже нужно будет считать вместе с предыдущим V(3).
Может быть более сложное выражение, вроде того, что на пике, нужно из начального 3-х этажного корня получить упрощённый.
Аноним 2016/07/13 21:13:26  №795415 55
оп. здровья тебе
хороший ты парень
Аноним 2016/07/13 22:02:22  №795451 56
Я на опенкарте такое делал, точнее портировал с yii2
Аноним 2016/07/13 22:03:07  №795452 57
Аноним 2016/07/14 05:27:06  №795608 58
Ребят, накидайте каких-нибудь задач небольших, для нереального тупого человека, что бы заставить мозг немного думать. Что-то уровня вывести Х звездочками в прошлом треде, что бы нормальный человек справлялся за 5 минут.

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


Если что, то заача с иксом:

Дано число на ввод например 5, нужно на выходе сделать вот такую хуйню:
|
|
|
|

|
*
Аноним 2016/07/14 05:28:53  №795609 59
>>795608
топ_разметка_еу, кароче вот такое что-то там было.


| х х
| х х
| х
| х х
| х х
Аноним 2016/07/14 05:29:25  №795610 60
Впизду блядь, уже и пробелы нельзя ставить, вообще охуеть блядь
Аноним 2016/07/14 05:50:53  №795612 61
Сап.
В общем решил вкатиться в PHP. И посему ищу себе для этого дела наставника\преподавателя который обьяснит мне что к чему и куда идти. Мои навыки довольно плачевны и опыт работы с PHP наверное чуть больше 10 чсасов.
Моя конечная цель - написать полноценный блог.
Написать магазин. Написать форум.

Если кто-то из местных заинтересован, пожалуйста отзовитесь.

За работу плачу деньгами. Связь будем держать по скайпу или RC. Для наставничества есть TeamViever. Если кто-то заинтересован - отпишитесь пожалуйста.
Аноним 2016/07/14 07:57:53  №795630 62
>>795612
Почему бы тебе не посмотреть видеокурсы "Специалист"

бесплатно без смс с торрентов? Они как раз там в процессе пишут бложек вроде и интернет-магазин примитивный.
Аноним 2016/07/14 10:16:01  №795670 63
Есть SVG
<symbol id="svg-5-star" viewBox="0 0 5120 1024">
<path d="M0,1v1024h1024V1H0z M982.029,44.....
в таком виде, добавил их в футер, почему отображается только на главном домене и на поддоменах без параметров в адрессе? (Только на site.com, *.site.com и соответственно не отображаются уже если site.com/index.php или site.com/?blabla=x)
Аноним 2016/07/14 14:12:34  №795879 64
>>795670
Почему то когда удаляю в <head></head>
<base href="site.com/" /> всё работает как надо
Аноним 2016/07/14 15:11:41  №795940 65
Аноним 2016/07/14 16:00:08  №795978 66
Аноним 2016/07/14 16:03:46  №795982 67
>>795978
Вторая неверно. Там надо в обратном порядке корни выводить. С последнего к первому.
Аноним 2016/07/14 16:04:04  №795984 68
14685014447820.jpg (54, 588x381)
381x588
>>793705 (OP)
Прошел учебник в ОП-посте, очень понятный и оформлен круто, жаль что там мало. Спасибо тому кто это сделал. Перешел к задаче с абитуриентами, возник вопрос какую sql-api мне юзать? mysql, говорят, устарел и к применению не рекомендуется.
Аноним 2016/07/14 16:30:23  №796003 69
>>795984
Остановился на mysqli, он как то проще выглядит. Чет я немного подохуел с резкого скачка сложности между уроками ОП-поста и документацией sql-api. Но в целом норм.
Аноним 2016/07/14 17:00:34  №796029 70
>>795984

PDO лучше. mysqli не умеет выбрасывать исключения.
Аноним 2016/07/14 19:23:26  №796168 71
Аноним 2016/07/14 23:27:51  №796357 72
Привет, программач.
Как правильно сделать переменную глобальной?

Если так, то Enchant выводится только в теле цикла.

global $items_userdata;
while( $items_userdata = mysqli_fetch_assoc($item) ){
...
}
echo $items_userdata['Enchant'];
Аноним 2016/07/14 23:40:55  №796370 73
>>795612
Пиши обсудим, чего да, как.
Говорят, наставничество хороший способ держать себя в форме
[email protected]
Аноним 2016/07/15 00:31:22  №796407 74
>>794751
>Редирект это взаимодейсвтие с браузером пользователя, это интерфейс.
Я не знал об этом. Хоть это и логично, я не смотрел на это с такой стороны. Спасибо.


https://github.com/codedokode/pasta/blob/master/student-list.md#Постраничная-навигация
>Можно сделать удобный класс для расчета числа страниц и формирования ссылок на переход на нужную страницу. В конструктор мы передаем общее число записей, число записей на странице, шаблон для ссылки, после чего может генерировать ссылки для перехода:
>$pager = new Pager($totalPages, $recordsPerPage, 'index.php?page={page}');
А обязательно шаблон для ссылки передавать? Ведь можно в самом шаблоне писать <a href="?page=<?= $page ?>">, и ссылка будет перенаправлять на текущую страницу + запрос с гетом.
Аноним 2016/07/15 00:37:33  №796419 75
>>794768
Какой пиздец.
Аноны, расскажите какой верх мечтаний у пхп погромиста? 99% вакансий это гавностудии, что поддерживают интернет магазины с женским бельем и штопают разовые сайты-визитки.
Аноним 2016/07/15 01:44:49  №796445 76
>>796419
Завтра ищешь в интернете книжку Джанед Вайленд "PHP5 для чайников" - полное руководство, похуй если ничего не поймешь. Затем идешь на http://php.net/manual/ru/ и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь конвенцию по написанию питоньего кода - PSR-2, чтобы от зубов отскакивало. Когда напишешь свою первую имиджборду, по пути изучив верстку на html+css, скачиваешь и изучаешь любой асинхронный вебсервер, рекомендую nginx. Как переделаешь имиджборду, чтобы выдавала по крайней мере 5 тысяч запросов в секунду, можешь идти дальше - тебя ждет увлекательный мир фриланса. CRM'ки, стартапы, сверхбыстрые HTML5 браузерные игры, MySQL. Отсос хиккующих выблядков / просто неудачников типа рейфага или сисярп/джава-хуесосов, которые сосут хуй по жизни не заставит себя ждать и уже через пол года ты будешь получать такие суммы, что любая баба будет теч при одном упоминании твоей зарплаты.
Аноним 2016/07/15 03:51:27  №796470 77
Аноним 2016/07/15 03:58:38  №796473 78
Аноним 2016/07/15 06:21:16  №796490 79
>>794753
расскажи нахуя программисту искать вакансии только в родном городе/стране?
тебя забанили на upwork?
не умеешь в английский? пиздуй вон из профессии
даже это не беда!
hh.ru яндекс.работа | grep поргомист | grep удаленка
...
PROFIT
Аноним 2016/07/15 06:40:12  №796491 80
>>796419
Работать в Facebook конечно же! И коммитить в ядро HHVM за деньги, но это уже не пхп.
Аноним 2016/07/15 06:43:18  №796492 81
>>796419
Можешь пойти и автоматизировать производство разовых сайтов-визиток, и хуяк - у тебя компания с оборотом 203.52 млн долларов, например: https://en.wikipedia.org/w/index.php?oldid=729054498
Аноним 2016/07/15 12:59:48  №796652 82
Аноним 2016/07/15 14:31:56  №796712 83
как локально ставить фреймвоки (на готовую сборку типа денвера. Я юзаю "Eleanor Server"). В первую очередь интересуют Yii,cake, sompfony
Аноним 2016/07/15 14:45:22  №796715 84
>>796712
Composer де-факто стандарт. Либо качать архив с исходниками.

>sompfony
Symfony

>>796470
Там автотестов (когда твоё решение проверяется на сайте) нет что ли? Или решения на PHP не поддерживаются сайтом?
Попробуй leetcode ещё. Там PHP нет, я на JS решаю, но разница в задачках на алгоритмы небольшая.

>>796357
Да никак, если это твой проект и ты пишешь всё с нуля, а не за кем-то говно чистишь, то лучше перепроектируй с нуля так, чтобы глобальные переменные вообще не использовались. И возьмись за PDO.
Если интересно, то про глобальные состояния ОП писал в пасте про DI.

>>795984
У ОПа в задании: https://github.com/codedokode/pasta/blob/master/student-list.md
всё расписано. Перед тем, как задавать вопрос по студентам, убедись, что в пасте нет ответа. Я так когда-то тоже с багом PDO::FETCH_CLASS сглупил, хотя в пасте всё было написано.

>>796473
Ну предоставь сразу ссылки на рабочие версии (пусть и на англ, раз других нет), внесёшь вклад в общее дело.
Аноним 2016/07/15 15:07:46  №796731 85
Написал едва рабочий и очень простой вариант кошек-мышек.
Такое даже стыдно наверное показывать должно быть, но ничего, придется через этот стыд пройти.
http://ideone.com/GF79ti

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


В общем я пытался сделать так, что бы животные друг с другом воздействовали через "мир", ведь они что бы видеть друг друга, должны как бы смотреть вокруг себя, ну вы поняли. А делать так что бы животные смотрели на всех других животных перебирая массивы - как-то НЕРЕАЛИСТИЧНО ЧТО ЛИ Поэтому попытался вот такое вот реализовать. Ну а дальше весь этот бред оттуда и вытекает.
Аноним 2016/07/15 15:40:00  №796749 86
>>796712
научись в vagrant, или хотя бы nginx конфигурять, выброси денвер.
все зависимости ставь через composer
Аноним 2016/07/15 19:47:56  №796940 87
14686012771390.jpg (40, 355x520)
520x355
Я не понимаю, почему композер скачивает там много файлов на библиотеки js, если я буду пользоваться двумя файлами (в данном случае video-js.min.css и video.min.js? Что мне делать с этой папкой? Искать эти два файла и копировать в корень сервера?
Аноним 2016/07/15 19:50:25  №796942 88
>>796940
Чтоб было.
Я по этой причине никак за бутсрап не возмусь - разгребать кучи говн ради двух кнопочек и трех талбиц.
Аноним 2016/07/15 19:56:35  №796949 89
>>796942
В голос, какое ты там говно разгребать собрался? Подключить бутстрап: прописать две ссылки - на стиль бутстрапа и жквери.
Аноним 2016/07/15 20:12:01  №796963 90
>>794978
Такой же вопрос опу теперь по видео. С превьюшки я думаю еще допустимо хранить в корне сервера, но куда видео то ложить, если папка с загрузками выше корня сервера.
someApprentice 2016/07/15 21:36:26  №797037 91
https://github.com/codedokode/pasta/blob/master/student-list.md#Постраничная-навигация
>Некоторые пытаются возложить на объект Pager лишние функции, например чтение параметров поиска из $_GET или подсчет числа записей в базе.
Значит этим должен заниматься контроллер?

$records = $studentGataway->getAllStudents();

$pager = new Pager($records, $currentPage = $this->getQuery('page'), $recordsPerPage = 10);

...


У меня getQuery($query) вбросит исключение если запроса не будет существовать, но ведь этого запроса может и не быть. Например, если мы только открываем страницу, то запроса о номере страницы быть не должно, и по стандарту должны выводиться записи с первой страницы. Я не правильно написал метод getQuery и не понимаю когда должны вбрасываться исключения?
Аноним 2016/07/15 23:08:31  №797127 92
Аноны, вопрос, как вообще разобраться сколько контроллеров нужно использовать?

К примеру, я пишу файлообменник. Там 3 страницы, проще будет сделать один контроллер, но с другой стороны было бы логичней под одну страничку один контроллер, вообще не понятно
Аноним 2016/07/15 23:10:04  №797129 93
14686134042290.png (115, 1366x576)
576x1366
>>796949
Не люблю, когда куча говна, которое не используется никак.
Вот часть файла, которая идет с бутстрапом.
Вся эта лапша вида .style-1, .style-2, style-3{} - какое же говно говняное и говнистое.
Ради пары колонок, нескольких таблиц и кнопок держать всю эту парашу ебааааную? Чтобы просто былО?
Приходится, потому что потом можно взять и что-то ещё использовать, но бесит такое.
Аноним 2016/07/15 23:26:14  №797150 94
>>794374
пыхомакака на то и макака, так что обязан уметь и во фронтэнд
Аноним 2016/07/16 01:07:20  №797253 95
В старом треде овтетил на оставшиеся вопросы. Если я кого-то пропустил, напомните о себе тут.

>>797241 | Задача про номера телефонов (+7 меня смущает), А не проще вкаорячить в htaccess Deny from All, задачи по регуляркам >>783071 ,

>>797242 | регулярка для номеров >>785910 , Как правильно проводить валидацию, лиличка

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

>>797127

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

Если ты используешь микрофреймворк слим то все контроллеры - это функции в index.php

>>797129

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

Более того, там есть веб-конфигуратор: http://getbootstrap.com/customize/

Ты можешь сделать свою сборку только с нужными тебе вещами (всем советую делать именно так).

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

>>797150

Ты пишешь как будто это что-то плохое. Я наоборот считаю что плохо не уметь верстать. Ленивые и некомпетентные разработчики любят придумывать предлгоги чтобы что-нибудь не изучать.
Аноним 2016/07/16 01:15:01  №797257 96
>>797037

>>Некоторые пытаются возложить на объект Pager лишние функции, например чтение параметров поиска из $_GET или подсчет числа записей в базе.
> Значит этим должен заниматься контроллер?
Да. Надо уметь писать более универсальнй код. Не надо писать функции которые берут данные из GET - лучше писать функцию которая получает на вход аргументы.

> $pager = new Pager($records, $currentPage = $this->getQuery('page'), $recordsPerPage = 10);
Не надо так писать. $currentPage = $this->getQuery('page') это отдельная команда которая должна быть на отдельной строке.

> У меня getQuery($query) вбросит исключение если запроса не будет существовать
Тебе нужна другая функция которая не выбросит исключение, а вернет 1.

> Я не правильно написал метод getQuery и не понимаю когда должны вбрасываться исключения?
Скорее всего неправильно. Все GET параметры приходят от пользователя и могут отсутствовать.

>>796963

Либо держать файлы в публичной папке либо настроить сервер на отдачу их из непубличной папки. Например есть расширение Апач x-sendfile которое позволяет php-скрипту выдать заголовок, апач его перехватит и начнет отдавать пользователю файл. Также можно сделать переназначение УРЛ через mod_rewrite

>>796942

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

>>796940

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

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

Ну либо есть еще вариант не использовать композер и руками загрузить нужные файлы.

Аноним 2016/07/16 01:16:58  №797260 97
14686210190260.png (66, 1366x640)
640x1366
>>797253
>Если ты используешь микрофреймворк слим то все контроллеры

нет, я решил сразу освоить нужный мне фреймворк самый популярный Laravel, хотя понимаю, что для такой задачи подойдет и простенький, но хочется убить два зайца сразу
Аноним 2016/07/16 01:28:03  №797268 98
>>796731

> public function move (World $world) {
Вместо того чтобы передавать сюда World, удобнее передавать его в животное при создании либо при размещении на карте и сохранять в свойстве.

> if ($this->dead == false && $world->field[$this->x][$this->y] != $this->icon) {
Вот тут мышь занимается не своим делом. Она лезет во внутренности мира: $world->field[$this->x][$this->y]. Но разве это задача мыши - определять, кто где находится? Очевидно, это задача мира. мышь просто должна вызывать метод вроде "есть ли кто-то на этой клетке?".

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

Также, у тебя очень плохо сделано хранение информации о расположении животных. Допустим я поменял у мыши координату x или y. Где гарантия что массив $world->field всегда отразит это изменение? У тебя информация о животных хранится сразу в 2 местах: в самом животном и в $world->field и появляется риск расхождения, в животном будет одна координата, а на карте оно будет в другом месте.

Более того, у тебя иконка животного тоже хранится в 2 местах - в world и underworld и тут точно такая же проблема синхронизации.

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

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

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

Функцию move надо разбивать на подфункции, а не писать код стеной.

> if (isset($world->field[$this->x][$this->y - 1]) and ($world->field[$this->x][$this->y - 1] == $world->filler)) {
> $directions[] = array($this->x, $this->y - 1);
> }
Это копипаста. не копипасть.

Алгоритм оценки ходов, который я рекомендовал, не рализован.
Аноним 2016/07/16 01:29:54  №797271 99
>>797260

Имей в виду что в ларавели много сомнительных вещей - например злоупотребление статическими методами и глобальными функциями, это первое что бросается в глаза. Как у них сделана работа с базой данных. мне тоже не нравится.
Аноним 2016/07/16 01:35:11  №797276 100
>>797271
может быть, но согласись, многие так же думают про php, в плане сомнительности, но ничего живет и развивается же как-то, учу из-за того, что самый популярный, а значит больше шансов найти работу

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

Вроде как очень удобно
Аноним 2016/07/16 01:40:36  №797283 101
>>796473

Спасибо. Кстати у меня есть аж 2 скрипта для контроля моих же паст:

1) проверяльщик ссылок в пастах: https://github.com/codedokode/pasta-link-checker

2) пока не опубликованный проверяльщик грамматики - ищет опечатки. По сути это скрипт-обертка вокруг hunspell

Новые ссылки:

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
Аноним 2016/07/16 01:42:47  №797285 102

только что понял, что именно из-за популярности и выбрал php, лол

анон - >>797276
Аноним 2016/07/16 01:51:30  №797289 103
>>797276

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

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

>>796652

> function inclineWord($number, $word1, $word2, $word5) {
Последний if не нужен.

> if ($number == 0)
> return "ноль";
надо ставить фигурные скобки.

> array_push($temp,$spelling[$hundreds]);
Удобнее писать $temp[] = ...

Кстати название $temp не годится, оно ничего не значит.

> $text = preg_replace("/ноль/u", "", $text);
> $text = preg_replace("/ +/u", " ", $text);
Это кривые костыли и они затрудняют понимание и поддержку кода. Если у тебя ноль сотен, не надо просто класть такое слово в массив.

> array_push($temp," (".$number.") ".inclineWord($ones,"рубль","рубля","рублей"));
> } else {
> array_push($temp," (".$number.") рублей");
Эту строчку не надо копировать 2 раза, достаточно написать один раз.

>>796470

> 2. http://ideone.com/qFJOX5
Здесь лучше разбивать preg_split с флагом PREG_SPLIT_NO_EMPTY так, что сразу получится массив только из чисел.

> 3. http://ideone.com/SA4FYT
Надо ставить фигурные скобки. Вместо копипастоы ифов лучше сделать массив с цифрами и словами и циклом искать совпадения в нем.

> 4. http://ideone.com/Of9mKI
Не читал условия, но разбивать лучше preg_split (чтобы поддерживалось любое число пробелов), а для перемножения любого числа элементов есть готовая функция array_prod по моему

Аноним 2016/07/16 02:35:30  №797303 104
>>796407

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

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

> Ведь можно в самом шаблоне писать <a href="?page=<?= $page ?>">, и ссылка будет перенаправлять на текущую страницу + запрос с гетом.
Можно но лучше вынести генерацию ссылки в отдельную функцию, тем более что там нужно добавлять параметры для сортировки и поиска. И для первой страницы параметр page не требуется.

https://github.com/TheSidSpears/Students/ Аноним 2016/07/16 02:36:39  №797305 105
>>796168

> https://github.com/TheSidSpears/Students/blob/master/students.sql#L31
> `hash` text NOT NULL,
Тут лучше подойдет varchar

https://github.com/TheSidSpears/Students/blob/master/router.json
Вот тут я не уверен что в роутере должен указываться вью. зачем? Ты планируешь один вью с несколькими контроллерами использовать? Это вряд ли получится, так как вью привязан к своему контроллеру и не совместим с другими. И даже если он совместим, при правке это легко сломать. Ангалогично мне кажется нет смысла в роутере указвать заголовок страницы (если только ты не используешь это еще например для меню - и то, наверно выгоднее как-то в контроллере это хранить).

https://github.com/TheSidSpears/Students/blob/master/public/.htaccess#L5
не очень понятно зачем тут перенаправление всех УРЛ на 503.php. Коментарий бы добавил.

https://github.com/TheSidSpears/Students/blob/master/public/errors.log
Почему лог ошибок в публичной папке? и кстати зачем вообще его было делать, если в php уже есть готовый лог?

https://github.com/TheSidSpears/Students/blob/master/public/index.php
тут странный код: ты создаешь объект и ничего с ним не делаешь:

> $frontController=new FrontController($container);

Задача конструктора - инициализировать объект, а не обрабатывать запрос.

https://github.com/TheSidSpears/Students/blob/master/app/bootstrap.php#L12
Ты используешь относительный путь который зависит например от теущего каталога. надо использовтаь абсолютный путь например с использованием __DIR__ или метода преобразования относительного пути в абсолютный.

https://github.com/TheSidSpears/Students/blob/master/app/bootstrap.php#L19
Автозагрузку можно было бы через композер сделать. И тут та же проблема с относительными путями.

https://github.com/TheSidSpears/Students/blob/master/app/container.php#L7
> return JSONLoader::config();
> return JSONLoader::router();
Статические методы это не ООП-подход. Не вижу причин тут использовать статический вызов. Также не вижу где написан путь к конфигу.

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

https://github.com/TheSidSpears/Students/blob/master/app/controllers/FrontController.php#L15
> public $isAuthorized=false;
зачем тут это публичное свойство? Контроллер это не сервис чтобы другие могли к нему обращаться. У тебя есть сервис авторизации для этого. Не надо дублировать его функции.

https://github.com/TheSidSpears/Students/blob/master/app/classes/Router.php
Роутер странный. Он называется роутер и при этом он не использует даже файл с конфигом. Что он вообще делает? По моему ты не смог изолировать функционал роутинга в одном классе и он у тебя вытек в front controller.

https://github.com/TheSidSpears/Students/blob/master/app/controllers/FrontController.php#L33
Это функционал роутера.

> https://github.com/TheSidSpears/Students/blob/master/router.json
> "controller": "Main",
Плохая идея писать имя класса не полностью. Если я захочу поискать где используется класс MainController, я не найду это место.

https://github.com/TheSidSpears/Students/blob/master/app/controllers/MainController.php#L96
> $this->viewData['students']=$this->c['table']->getStudents($this->sortBy,$this->orderBy,$this->limit,$this->offset,$this->find);
Слишком сложное выражение, плохо читается. Вместо $this->c['table'] лучше писать $this->studentTDG или $studentTDG.

https://github.com/TheSidSpears/Students/blob/master/app/controllers/MainController.php
Контроллер переусложнен. По моему он весь пишется в виде одного местода на 15-20 строк, а ты зачем-то надобавлял тут свойств и методов. У тебя как-то все выглядит переусложненно, попробуй упростить и избавиться от лишнего.

https://github.com/TheSidSpears/Students/blob/master/app/controllers/MainController.php#L31

> if ($isAuthorized) {
> $user=$this->c['auth']->getUser();
> $this->user=$this->filterUserData($user);
зачем тут filterUserData? Не понимаю.

https://github.com/TheSidSpears/Students/blob/master/app/controllers/EditController.php
https://github.com/TheSidSpears/Students/blob/master/app/controllers/RegisterController.php
Не очень удачное решение. Вместо наследования тут проще сделать один контроллер и поставить пару ифов. такой код читать будет проще, чем постоянно переключаться между 2 классами.

https://github.com/TheSidSpears/Students/blob/master/app/controllers/RegisterController.php#L29
> setcookie('hash',$student->hash,time()+360012365,'/',null,false,true);
Странно, у тебя есть класс отвечающий за авторизацию, но куку почему-то ты ставишь в контроллере.

https://github.com/TheSidSpears/Students/blob/master/app/controllers/ERController.php#L73
> protected function fillStudent(Student $student){
Непонятно что тут делает цикл ибо он ничего не меняет в массиве.

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

Метод showView тоже назван неудачно. Логчинее назвать его "обработать запрос" и сделать абстрактным в базовом контроллере.

https://github.com/TheSidSpears/Students/blob/master/app/classes/Authorization.php#L12
> function __construct($container){
перечитай урок про DI. Это service locator и это плохая вещь.

Сам класс авторизации странный, половины функций связанных с авторизацией, в нем нет, они в контроллере.

https://github.com/TheSidSpears/Students/blob/master/app/classes/JSONLoader.php
Тут зачем-то захардкожены имена файлов.

> $array=file_get_contents($filename,FILE_IGNORE_NEW_LINES);
Имя переменной не соответствует тому что она хранит

> LIMIT :y OFFSET :x");
Неудачные названия плейсхолдеров

> $rows = $this->db->prepare("SELECT FROM `students` ORDER BY $sortBy $orderBy LIMIT :y OFFSET :x");
> if (isset($search)) {
> $rows = $this->db->prepare("SELECT FROM `students` WHERE CONCAT(`name`,' ',`sname`,' ',`group_num`,' ',`points`,' ',`gender`,' ',`email`,' ',`b_year`,' ',`is_resident`) LIKE :search ORDER BY $sortBy $orderBy LIMIT :x,:y");
Получается первый prepare был сделан зря? зачем тогда его делать?

В student->addInfo есть проблема. У тебя нет фильтрации по разрешенными полям и пользователь может менять любые свойства студента в том числе те, которых нет в форме. ну например что если мы добавим колонку is_admin - пользователь сможет передать $POST['is_admin'] = 1 при редактирвоании. И кстати об этом было написано в моем уроке.

> https://github.com/TheSidSpears/Students/blob/master/app/classes/StudentValidator.php#L98
> foreach($mask['values'] as $value){
> if($s->$field=$value){
in_array()

> 'regexp'=>"/^([а-яa-z][ ']*)+$/iu",
Где буква ё? Где дефис для фамилий?

https://github.com/TheSidSpears/Students/blob/master/app/classes/StudentValidator.php#L66
> function __construct(Student $s, $container, $id=NULL){
Почему ты пишешь код валидации в конструкторе? И почему передаешь контейнер? Почитай про DI.

https://github.com/TheSidSpears/Students/blob/master/app/classes/ViewHelper.php
тут слишком много всего понамешано. Еще и контейнер.

В общем:

1) упрощай код
2) перечитай урок по DI
3) перечитай комментарии к задаче

Аноним 2016/07/16 02:44:57  №797308 106
>>795879

Значит у тебя неправильно стоит ссылка. Вот урок есть по теме https://github.com/codedokode/pasta/blob/master/network/urls.md

>>795608

Задачи учебника в ОП посте не годятся?

>>795451

Он же для интернет-магазинов.

>>795352

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

Потому варианты такие:

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

>>795321

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

>>795060

phpquery?

>>795007

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

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

>>794978

Превьюшки можно перенести в публичную папку, да и загружаемые файлы в общем тоже. Либо настраивать их скачивание: через mod_rewrite либо через x-sendfile.

Проще наверно перенести в публичную папку.

>>794934

Вообще нет, смешной сайт на народе для тех кто ничего не знает.

Про архитектуру языка советую официальный мануал с php.net

По взаимодействию с БД изучай PDO.

Аноним 2016/07/16 02:49:21  №797310 107
>>794930

Ответил в старом треде: >>797241

> https://ideone.com/t2U2f3
С "а" или "но" ненадежно сделано - перед ним может быть не только запятая, но и например двоеточие или другой знак. Пробел не обязательно будет ровно один.

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

> https://ideone.com/KohVif
Тут то же самое замечание, в остальном верно.

> https://ideone.com/0Ye4lY
в общем верно, хотя у тебя он не подсветит вторую опечатку в том же слове вроде тOпOр

>>794822
>>794808


тут выгоднее вытащить данные из базы и обработать на стороне php

>>794789

Именно такому учат в нашем треде кстати, включая тесты.

>>794471

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

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

>>794418

Официальнй мануал, хоть это и не книга.

>>794384

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

Все, я ушел.


Аноним 2016/07/16 03:44:37  №797315 108
Что делать, если не могу выучить ПХП?
Аноним 2016/07/16 03:58:15  №797318 109
Аноним 2016/07/16 04:54:48  №797323 110
>>797257
>> Я не правильно написал метод getQuery и не понимаю когда должны вбрасываться исключения?
>Скорее всего неправильно. Все GET параметры приходят от пользователя и могут отсутствовать.
Но ведь исключения нужны для программистов, которые могут неправильно написать запрос...
Аноним 2016/07/16 04:57:36  №797325 111
>>797323
>неправильно написать запрос
т.е. неправильно обратиться к запросу
Аноним 2016/07/16 05:03:20  №797327 112
>>797315
Поменять мышление: вместо "не могу" - "не хватает упорства". Затем распределить свое время на мелкие отрезки чтобы упорства хватало. Рим тоже не один день строился.
Калькулятор Аноним 2016/07/16 08:46:27  №797352 113
https://ideone.com/oLaDFT
https://github.com/applejacky/arithmetic_expression_calculator

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

>>795255
> У меня идея такая:
> Затем мы делаем такой трюк: возводим $result в квадрат с помощью bcpow (без потерь точности). Сравниваем результат возведения (строку) с $a (строкой). Если они совпали ...
Не знаю, что бы я делал без этой подсказки, спасибо. Всё упиралось в то, что pow(1.4142135623731, 2) округляет результат до двойки.

>> Там precision у bcdiv 20, то есть он всегда дробную часть добивает нулями. Тогда нули убирать регулярками/фунциями для манипуляций со строками?
> У тебя по идее знаменатель и числитель целые ведь. Зачем что-то добивать?
Мне следовало весь контекст обсуждения запостить. Суть: bc-функции не умеют сами определять, с какой точностью после запятой отображать результат. Если не указывать scale (количество знаков после запятой), то по умолчанию bc-функции отображают только целую часть ответа. Если указать scale, к примеру 50, то в bc покажет именно 50 символов после запятой, не забывая добить результат нулями справа. Я счёл логичным написать мелкую обёртку, которая эти нули с конца будет удалять.
В результате SimpleFraction будет быстрее упрощать себя, так как числа меньше. (0.1 => 1/10, а без удаления нулей было бы 0.100...N => 100...N/100...N+1, где N - кол-во нулей).

>>792629
>Ну а НОК легко считается через НОД. Реализуй алгоритм Евклида
Нашёл функцию gmp_gcd. Взял её, так как моё решение будет медленнее.

>У тебя парсинг оказался разделен на 2 части: проверка синтаксиса и сам парсинг.
Сейчас объединил парсинг и валидацию. Это позволило вообще не использовать регулярки для валидации, но код, как это обычно происходит в моём случае, стал ещё запутанней.

>> str_pad("Выражение в инфиксной нотации", 61)
> Она не умеет считать русские буквы, имей в виду.
Я так понял, это справедливо для всех str_* функций без префикса mb? А как тогда выравнивать? Сделал sprintf'ом.
Аноним 2016/07/16 10:11:53  №797377 114
14686531140930.png (14, 589x442)
442x589
В какой кодировке сохранять файл cli php или что прописывать в нём, что-бы не было такого
Какой фреймворк выбрать для проекта Аноним 2016/07/16 13:52:57  №797484 115
Привет, анон! Попался мне большой проект который я хочу выполнить качественно и хорошо (онлайн конструктор для оформления дома). Подскажи, на каком фреймворке его писать, что лучше юзать в процессе разработки над большим проектом?
Аноним 2016/07/16 15:05:01  №797544 116
>>797484
Symfony2
Но сам по себе он тебе ничего не даст. Symfony - просто инструмент, позволяющий реализовывать любые паттерны ООП. Вот они то тебе для большого проекта и нужны
Аноним 2016/07/16 15:13:22  №797549 117
>>797377

Виндовая консоль не может отображать utf-8. Какие есть варианты?

- писать код в кодировке cp1251. Минус в том что код перестанет работать с utf8. То есть ради винды придется себя ограничивать. Под линуксом который по умолчанию поддерживает utf-8, буквы выводиться не будут.

- попробовать использовать вместо консоли приложение вроде http://conemu.github.io/en/UnicodeSupport.html которое вроде как поддерживает вывод utf8 (я не проверял)

- сохранять вывод скрипта в файл и просматривать файл редактором:

php script.php > result.txt

- не использовать кириллицу

- запускать свой код под линуксом. Линукс можно установить в виртуалку либо зарегистрироваться на c9.io (бесплатно) и запускать там. PHP там уже стоит.
Аноним 2016/07/16 15:21:04  №797555 118
14686716651240.png (12, 798x271)
271x798
14686716651241.png (11, 798x309)
309x798
Блять, просто ебаный пиздец, ненавижу сука, ебанный пхпсторм, почему сука его все так любят если хуй поймешь как вообще его юзать, блять, в нетбинсе за 2 секунды настроил дебаггер, а сука в пхпшторм уже два дня ебусь с ебучим дебаггером, куча сука непонятный настроек, хуй пойми для чего.

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

Обьясните нахуя я должен заполнять два поля если сайт сука у меня один, как вообще блять правильно вписать эти два ебаных поля, да и хуй там на каждом ебаном шаге ошибки хуишибки, делаешь сука, все в точности по инструкции и нихуя не работает, говно ебаное
Аноним 2016/07/16 15:22:43  №797556 119
>>797544
а что скажешь про Yii или Zendframework2 ?
Аноним 2016/07/16 15:24:42  №797558 120
14686718829510.png (31, 773x251)
251x773
14686718829511.png (11, 558x348)
348x558
Длаешь сука все в точности как написано, заработает? Да вот хуй
Аноним 2016/07/16 15:32:49  №797567 121
>>797556
про зенд ничего не скажу
Yii идеальный фреймворк для скоростного "хуяк-хуяк и впродакшн". Но в долгой перспективе на большом проекте подобный подход до добра не довоидт
Аноним 2016/07/16 15:39:34  №797579 122
>>797567
>Yii идеальный фреймворк для скоростного "хуяк-хуяк и впродакшн"
Я думал это про ларавел
Аноним 2016/07/16 15:41:43  №797583 123
>>797567
Спасибо. У меня есть еще такой "детский" вопрос. Например на кодигнайтере я могу с легкостью построить MVC и за минуту сделать пагинацию или валидацию и остальные муторные задачи, С симфони так же все, просто ты сказал что он сам по себе ничего не даст и я немного запутался.
Аноним 2016/07/16 15:55:52  №797597 124
>>797377
>>797549
Смена кодировки виндовой консоли на юникод:
chcp 65001
Обратно на DOS:
chcp 866

Гуглится за 2 минуты.

Аноним 2016/07/16 16:08:53  №797605 125
>>797555

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

https://www.google.ru/search?q=phpstorm+server+config&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&newwindow=1&gbv=1

>>797558

А ты путь указал к публичной папке?

>>797583

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

Ты говоришь "могу настроить валиадцию" - а ты можешь валидировать не данные из POST, а например просто из массива или в объекте-модели?

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

>>797597

Ты тестировал или просто скопировал информацию которую неграмотный выложил в интернет? Это тебя самого делает неграмотным.
Аноним 2016/07/16 16:12:11  №797607 126
>>797605
Конечно тестировал. На Win10 работает.
Аноним 2016/07/16 16:12:29  №797608 127
>>797583
Это всё, само собой, есть и в Symfony
Просто там, к примеру, та же валидация сделана так, что ты с помошью симфониевского встроенного валидатора можешь валидировать ВООБЩЕ любой обьект в своём проекте
А в том же Yii - встроенным валидатором ты можешь валидировать только модели, унаследоанные, кажется, от ActiveForm. Но при этом он проще настраивается и проще разобраться, как им пользоваться. В итоге говнокодить получается куда быстрее.
Аналогично со всеми остальными компонентами. В симфони - сложнее, но гибче. В Yii проще, но дубовей.
Аноним 2016/07/16 16:35:01  №797631 128
>>797608
Спасибо! Ты можешь подсказать по Symfony книгу или сайт. я загуглил несколько но уже запутался в них.
Аноним 2016/07/16 16:37:17  №797635 129
>>797608
Олсо
Будет много таблиц в БД и мне хочется сделать все хорошо и правильно. Работаю с MySQL и PHP. До этого использовал БД в который максимум 5-7 таблиц и не шибко связанны между собой, а этот проект сулит большой объем. Так вот собственно моя просьба: подскажи, пожалуйста, какие посмотреть материалы для работы (книги, статьи). Особенно хочется понять как правильно построить архитектуру БД и оптимизировать ее.
Никто не ответил в треде про БД так что пишу сюда
Аноним 2016/07/16 16:39:02  №797638 130
>>797631
Я не он, но начни с symfony.org. У них прекрасный раздел документации.
Аноним 2016/07/16 16:47:41  №797648 131
>>797608
>ты с помошью симфониевского встроенного валидатора можешь валидировать ВООБЩЕ любой обьект в своём проекте
И не только объект!
Аноним 2016/07/16 16:49:27  №797649 132
>>797605
нет, в общем сидел, клацал, что-то менял, что-то возвращал и внезапно все заработало, каким образом, хрен его знает, просто мистика какая-то
Аноним 2016/07/16 16:54:13  №797652 133
Аноним 2016/07/16 17:13:38  №797665 134
>>797631
https://symfony.com/doc/current/index.html
Официальная дока, она у симфони очень хороша.
Также обязательно прочти cookbook оттуда же
>>797635
Уфф, это целая наука, которую в 3 словах не опишешь.
В симфони используется ORM Doctrine2. Её главна фишка в том, что она любые обьекты со всеми их связями с другими обьектами позволяет нативно сохранить в БД. Поэтому ты должен проектировать не таблицы в БД, а (очень важно!!!) доменную логику своего приложения. Тобишь проектировать классы, которые будут делать то, что хочет от программы заказчик, и их взаимодействие между собой. А потом, особо не парясь про БД с помошью доктрины всё это хозяйство сохранять в БД.

Как проектировать доменную логику приложения?? Ну это уже вопрос всей жизни, вселенной и всего такого. Начни с вот этого:
https://www.youtube.com/watch?v=xOx-si8s3K8
https://www.youtube.com/watch?v=nE2T2ZIaYvs

Потом гугли статьи про DDD. НАпример:
http://blog.byndyu.ru/2010/05/domain-driven-design.html
http://blog.byndyu.ru/2011/12/domain-driven-design.html
Дальше книги. Авось разберешься
Аноним 2016/07/16 17:24:30  №797679 135
>>797665
>Авось разберешься
Добавлю ещё, что это все - высший пилотаж обьектно-ориентированного программирования. Если честно, я не уверен, что ни разу не варившись в больших проектах, в которых хотя бы частично применялся подобный подход, можно вот так вот легко взять и сходу во всё это врубиться.

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

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

PS: Всё ещё уверен, что хочешь взять Symfony?
Аноним 2016/07/16 17:32:06  №797682 136
>>797679
Спасибо! Я не в чем толком не уверен. времени есть месяца три для получения хоть каких-то результатов, но программистов набирают не ахти- пока я один и совсем не опытный. поэтому думаю что проект может быть лажовым.
Аноним 2016/07/16 17:36:40  №797688 137
>>797682
А, ну если заказчики неадекваты и набирают на сложный проект нубов - ну чтож, сами себе злобные буратины.

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

Проект провалится - ты наберешься опыта - свалишь в место понормальнее. Дерзай.
Аноним 2016/07/16 17:37:58  №797689 138
>>793705 (OP)
ОП, в соседнем треде проводят специальную олимпиаду. Предлагают решить задачу, победитель - самая короткая программа. https://2ch.hk/pr/res/784954.html

Пока в треде фаворит RUBY-анон - 89 символ.
У меня получилось 161, после удаления пробелов в одну строку. Вот мое решение - http://ideone.com/KxAijz

Сможешь сделать короче?
Аноним 2016/07/16 17:39:20  №797692 139
>>797688
а в работе есть какие-то штрафы за такое? мол не умеешь, так чего взялся?

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

в программировании такого нет?
Аноним 2016/07/16 17:43:18  №797693 140
>>797692
Если это французский повар с 20-летним стажем, то да, претензии в кассу, и его за такое надо уволить.

Но если владелец ресторана на должность шеф-повара берёт первого попавшегося мальчика с улицы, без опыта, только потому, что мальчик просит 500$ (вместо 4000$ которые надо платить профессионалу) - то какие могут быть претензии к мальчику?

Мальчика может и выпрут, но я бы на его месте не расстроился бы совсем. Опыта набрался - и ладно.
Аноним 2016/07/16 17:45:09  №797694 141
>>797688
ну я объяснил свой скудный опыт, но парня это не смутило. не знаю чего так. может никто из серьезных программеров не хочет браться за проект и остался только я. но все же ради опыта я согласен это сделать.
Аноним 2016/07/16 17:52:26  №797698 142
>>797694
>парня это не смутило.
Он всё прекрасно понимает, но жадность - страшная вешь.
Ну ничего - скупой платит дважды.
АЛСО проваленный проект - тоже отличный опыт в копилку. По крайней мере в следующий раз ты уже будешь знать, как НЕ надо делать, и почему.
Авось сможешь сделать выводы, почитать книжки, как надо делать, ещё раз сделать выводы и в следующий раз всё сделать правильно.
Аноним 2016/07/16 17:53:25  №797699 143
>>797688
А мне кажется связываться с заранее обреченным проектом это фэил. Ведь у тебя в портфолио будет провальный проект. Что ты будешь отвечать если спросят: "Ты работал над "ххх", почему оно не взлетело?" А ты такой "Ну потому что заказчик был злобный буратино" или "Была слабая команда" или "Проект был слишком сложным, запутанным и не продуманным". И каждый ответ против тебя, во всех случаях ты перекладываешь ответственность на кого-то другого, ведь ты сам вызвался работать над ним. А по поводу опыта, в первую очередь это будет опыт провала. Лучше найти что-то, что тебе по силам, и сделать это максимально хорошо, насколько ты можешь, даже если масштабам будет меньше.
Аноним 2016/07/16 17:58:39  №797705 144
>>797699
По пододу даже полного фейла я написал выше.

Кроме того между полным фейлом и полным успехом вообще то хуева туча промежуточных состояний. Не пугайте человека, совсем не обязательно всё пойдет по самому плохому пути. Вероятнее всего получится просто весьма хреново, но как-то там оно работать будет.
Просто на определенном этапе станет очень сложно вносить изменения в проект и работать с кодом в стиле "взрыв на макаронной фабрике" неимоверно заебёт. Вот тогда и можно будет вал ить дальше. Предварительно сделав выводы из результатов работы.
Аноним 2016/07/16 18:04:41  №797712 145
>>797699
что мешает мне соврать?
Аноним 2016/07/16 18:10:25  №797718 146
>>797712
Врать ни в коем случае нельзя. IT сфера - большая деревня, все друг друга знают.
Достаточно просто ... скажем так... умолчать о некоторых деталях прошлого проекта.
Аноним 2016/07/16 19:09:55  №797776 147
14686853951990.jpg (430, 1280x1133)
1133x1280
>>793705 (OP)
А как делают так, чтобы один сайт обслуживало несколько серверов? Как это называется?
Аноним 2016/07/16 19:52:07  №797805 148
>>797689
>Сможешь сделать короче?
Делать нечего ОПу, как письками меряться с нами.
Померялся с тобой, у меня влезло в 102 символа: https://ideone.com/dgEMLQ
Аноним 2016/07/16 21:28:52  №797875 149
даунитт 2016/07/16 21:35:34  №797885 150
14686941344920.jpg (22, 637x332)
332x637
очень тупорылый кун врывается итт
не могу понять даже как сделать ёбаный кубик
поможет кто ?
Аноним 2016/07/16 21:39:45  №797889 151
>>797885
1) Убери знак доллара у функции mt_rand.
Знаком доллара предваряются переменные.
2) Функции mt_rand нужно передавать 2 параметра, ещё раз перечитай задание и объяснения, которые ему предшествовали.
Аноним 2016/07/16 21:46:57  №797893 152
14686948174000.jpg (27, 621x403)
403x621
>>797889
>>797889
блин
всё было только из-за знака доллара.
и с объяснения пропущенное сквозь глаза уловил...
Спасибо за ответ
теперь я тут буду завсегдатаем походу
Аноним 2016/07/16 22:27:05  №797943 153
Может работал кто с VK API?
Вот пытаюсь вытащить статистику сообщества методом stats.get
https://vk.com/dev/stats.get
В документации написано что токен нужен если статистика скрыта.
Вот я взял для примера сообщество с открытой для всех статистикой LIVE Express, делаю запрос
http://api.vk.com/method/stats.get?group_id=32295218&date_from=2016-07-16&date_to=2016-07-16
но у меня выдают ошибку и требуют токен. Что я делаю неправильно?
Аноним 2016/07/16 22:43:38  №797953 154
>>797943
ДАвненько имел дело, но кажется так:
Токен нужен в любом случае
Если данные публичные - то достаточно передать просто токен своего приложения
Аноним 2016/07/16 23:51:18  №797986 155
14687022788470.jpg (937, 1000x1672)
1672x1000
Памагити!!!
Положим, что у меня есть матрица размером 2 х n, dв одном столбце у меня даты формата 00:00:00, а в другом какие-то данные, в зависимости от этих данных я меняю текущую дату на день вперёд.

Как это сделать?
Аноним 2016/07/17 00:02:23  №797999 156
>>797805

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

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

$x=preg_replace("/\d(?!$)/",'$0+',$i);

-123 -> -1+2+3

(анонам домашнее задание: разберите что делает эта регулярка)

- eval("echo\"$e=\",$e;"); -> eval("echo'$e=',$e;");

- Можно заменить <?php на <?= и выиграть еще 2 символа. <?= это <?php echo и может это получится как-то использовать

- можно писать все одним выражением вроде <?= ($i=readline()) . ...

Как видите во всяких идиотских конкурсах PHP точно будет не последним.
Аноним 2016/07/17 04:33:08  №798146 157
>>795415
Оп тян, если что. Мимо олдфаг тредов
Аноним 2016/07/17 05:35:14  №798163 158
Аноним 2016/07/17 06:11:49  №798169 159
>>797805
Почему в тред олимпиады не запостил, мы должны победить! Отстоять честь синего слона!
Аноним 2016/07/17 06:59:15  №798174 160
>>798169
Что еще за синий слоник, братишка?
Аноним 2016/07/17 07:24:09  №798179 161
Аноним 2016/07/17 12:02:10  №798252 162
Привет, подскажите верно ли я разделил структуру приложения для задачи "Еще один кредит":

index.html - это html страница содержащая форму с тремя полями ввода и отправкой данных в "action.php" методом POST;

action.php - это php скрипт, который рассчитывает кредит и загружает шаблон template.html с помощью функции include;

template.html - это html страница в которой содержится логика отображения сообщений.

Получается, после отправки данных с помощью формы, пользователь попадет на страницу template.html, изменится ли адрес в адресной строке в браузере?
Для того чтобы изменить данные и рассчитать кредит еще раз, пользователю нужно нажать назад, или кликнуть на ссылку ведущую на страницу index.html (для этого, мне нужно сделать эту ссылку на странице template.html)?
Можно ли выводить сообщения на странице index.html, не переходя на template.html средствами PHP?

Спасибо за терпение)
Аноним 2016/07/17 12:21:30  №798266 163
Аноним 2016/07/17 12:42:01  №798277 164
>>797315
https://github.com/TheSidSpears/Students/blob/master/router.json
> Вот тут я не уверен что в роутере должен указываться вью. зачем? Ты планируешь один вью с несколькими контроллерами использовать? Это вряд ли получится, так как вью привязан к своему контроллеру и не совместим с другими. И даже если он совместим, при правке это легко сломать.

Мне на самом деле эта строка нужна была, чтобы указать в какой папке вью. Если заменю "view": "status/register_ok" на "folder": "status" - будет норм?


> https://github.com/TheSidSpears/Students/blob/master/app/container.php#L7
> Более того, ты возвращаешь массив непонятной структуры. Не лучше ли возвращать объект с методами для получения данных?
- В чём заключается непонятность структуры? Ты предлагаешь делать методы типа getDBLogin(), getDBPass() и т.д. или как?

https://github.com/TheSidSpears/Students/blob/master/app/controllers/MainController.php
Контроллер переусложнен. По моему он весь пишется в виде одного местода на 15-20 строк, а ты зачем-то надобавлял тут свойств и методов. У тебя как-то все выглядит переусложненно, попробуй упростить и избавиться от лишнего.

Cократил, но не уверен что верно. Закоммитил, проверь.


https://github.com/TheSidSpears/Students/blob/master/app/controllers/ERController.php#L73
> protected function fillStudent(Student $student){
Непонятно что тут делает цикл ибо он ничего не меняет в массиве.
foreach ($_POST as $post) {$post=trim(strval($post));}
Он делает trim и strval, разве нет?
Аноним 2016/07/17 13:11:29  №798294 165
Аноны, можно ли сделать архитектуру в пхп полностью на классах как в джаве или я должен делать <?php ?> в хтмле и писать обыкновенные скрипты используя свои классы и функции в них?
Аноним 2016/07/17 13:14:56  №798295 166
>>798294
индекс.пхп - твой маин метод
Аноним 2016/07/17 13:15:22  №798296 167
>>798266
Почему? Файл template.html содержит и php код и html и наверное правильнее было бы дать ему расширение .tpl, но первый файл index.html полностью состоит из html'а?

И еще, как правильно писать в шаблонах конструкции с открывающимися и закрывающимися фигурными скобками ({}) или двоеточие (:) и endif (endfor)
Например
<?php for ($i = 0; $i < 5; ++$i): ?>
Hello, there!
<?php endfor; ?>
или
<?php for ($i = 0; $i < 5; ++$i){ ?>
Hello, there!
<?php } ?>
Аноним 2016/07/17 13:16:33  №798297 168
>>798296
>писать в шаблонах конструкции с открывающимися и закрывающимися фигурными скобками

а погуглить, не?
Аноним 2016/07/17 13:19:24  №798300 169
>>798295
Там же полно хтмл параши, разве нет? Каждый .пхп файл воспринимать как класс?
Аноним 2016/07/17 13:23:11  №798301 170
>>798300
Ты хоть знаешь как на java сайты делать?!
Судя по вопросам - нет.

Гугли MVC.
Аноним 2016/07/17 13:23:15  №798302 171
>>798300
ну как представление подключать я не ебу, я в джаве шарю на уровне написание консольной программки, ну по сути если без гуи создавать прогу, то аналогично как в джаве выходит.

А как присобачивать ко всему этому еще html уже хз
Аноним 2016/07/17 13:28:02  №798303 172
>>798301
>Сайты на Java
Знатное извращение
>>798302
Не аналогично. В джаве ВСЕ с чем ты работаешь - классы, здесь же дохуя скриптов которые как каша и это меня раздражает. Я бы просто хотел управлять хтмл файлами из классов
Аноним 2016/07/17 13:33:14  №798305 173
>>798297
Как я сам не догадался? Спасибо, ты мне очень помог, что бы я без тебя делал.


Аноним 2016/07/17 13:38:12  №798306 174
>>798303

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

Сука почему нет то блять??? Ты думаешь зачем в пхп ООП сделали, по приколу?!
Пишешь класс для взятия данных из базы.
Пишешь класс для манипуляций данными.
Пишешь класс для отображения данных( в html/xml/yml/xaml/json/rss/nebo/allah e.t.c.)
Аноним 2016/07/17 13:39:35  №798307 175
>>798305

Так если ты догадался, так чего же не погуглил?

При альтернативном синтаксисе тело управляющей структуры заключается не в фигурные скобки а помещается между двоеточием и ключевым словом.
Управляющие структуры, имеющие альтернативный синтаксис с закрывающими ключевыми словами:
if - endif;
while - endwhile;
for - endfor;
foreach - endforeach;
switch - endswitch;

ВАЖНО: Смешивание синтаксиса в одной и той же управляющей структуре не поддерживается.
Использовать альтернативный синтаксис удобно при использовании PHP в роли шаблонизатора - когда небольшой код PHP необходимо интегрировать в html шаблон.
Например:

<select>
<? foreach($options as $value => $label):?>
<option value="<?=$value?>"><?=$label?></option>
<? endforeach;?>
</select>
Аноним 2016/07/17 13:43:37  №798308 176
Аноним 2016/07/17 13:44:27  №798309 177
>>798306
Пишу классы для этого и юзаю их в скриптах?
Аноним 2016/07/17 13:44:45  №798310 178
Я Бодя Камень
Аноним 2016/07/17 13:45:11  №798311 179
>>798310
А я Леха Пирамидка
Аноним 2016/07/17 13:48:26  №798312 180
>>798252

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

>>798266

Не сбивай людей с току.

>>798294

Не только можно, но и нужно.

>>798296

Через двоеточие

>>798300

Да, как класс.

>>798302

Через шаблонизатор. Можно через встроенный в пхп.

>>798303

Не сбивай людей с толку.

>>798308

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


Аноним 2016/07/17 13:55:00  №798314 181
Аноним 2016/07/17 14:01:21  №798320 182
>>798312
Ну ка проясни как мне работать с этим всем без скриптов
Аноним 2016/07/17 14:01:40  №798322 183
>>798312

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

>Через шаблонизатор. Можно через встроенный в пхп.
Php -это и есть шаблонизатор.

>Непраивльно писать без фигурных скобок или двоеточия.
Ты ахуеешь, но можно.
Аноним 2016/07/17 14:07:14  №798327 184
>>798302

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

Потом в одном классе, который отвечает за вывод будет написано что-то в духе:

$viewData['name'] = $user->name;
$viewData['friends'] = $user->friends;
ну и дальнейший сбор инфы, которая тебе нужна для вывода на сайте.
далее ты пишешь например:

$main->loadView("userPage.php", $viewData);
Это допустим метод подгрузки шаблона, с перешачей туда аштээмэль-параши.

А внутри шаблона у тебя примерно такое

<html>
<body>
<p>Привет <?=$user?> </p>

<p>Друзья онлайн:<ul>
<? foreach ($friends as $friend) {
echo "<li> $friend </li>
}
?>
</ul></p>
</body>
</html>

Ну это очень грубо так примерно всё, и вообще я сам не шарю.
Аноним 2016/07/17 14:08:53  №798330 185
>>798320
не слушай эту маню.

Скрипт - это такая абстракция. От нее отталкиваться нельзя. Скрипт я могу на калякать на Bash и на C.

Ты написал класс.
У тебя есть роутер класс. Он принимает Имя класса как строку и вызвает класс с таким именем.
Аноним 2016/07/17 14:54:48  №798357 186
>>793705 (OP)
Представляю, сколько глистов у этих кошатниц
Аноним 2016/07/17 15:04:00  №798366 187
14687570402550.png (1347, 866x2934)
2934x866
>>798357
А знак в конце предложения где?
Запятая на месте, ура.
Аноним 2016/07/17 15:41:43  №798384 188
>>798366
Ты тян?

>>798357
В азии много таких кафе, ешь мороженое и гладишь котиков. Есть еще такое с совами.
Аноним 2016/07/17 16:36:57  №798446 189
>>798384
>В азии много таких кафе

То-то они все унтерменши. Из поколения в поколение глистов переносят.
Аноним 2016/07/17 18:34:43  №798542 190
>>798384
>Ты тян?
Я кот.
Никто в Интернете не знает, что я кот.
Аноним 2016/07/17 19:03:08  №798573 191
>>798309
В каких еще скриптах? При нормальной архитектуре в php у тебя нет никаких скриптов, только классы, вызывающие другие классы, наследование, абстрактные классы, интерфейсы, полиморфизм. Скрипты только говнокодеры пишут.
Аноним 2016/07/17 19:12:27  №798581 192
>>798327
><p>Друзья онлайн:<ul>
><? foreach ($friends as $friend) {
>echo "<li> $friend </li>
>}
>?>

В шаблонах используют специальный синтаксис для них:


<? foreach ($friends as $friend): ?>
<li> <?=$friend ?> </li>
<? endforeach; ?>
Аноним 2016/07/17 19:32:15  №798599 193
>>797999
Классное творческое применение хаков, помог мне уменьшить код: https://ideone.com/dgEMLQ

>(анонам домашнее задание: разберите что делает эта регулярка)
>preg_replace("/\d(?!$)/",'$0+','-123')
Почитал немного, понячья магия какая-то. Как я её понял:
Первый символ дефис, пропускаем его (но кладем в whole match).
Следующий символ 1, подходит под \d. За ним не конец строки, значит negative lookahead заматчил единицу, в $0 добавляется 1+, -1+ в результате. $0 сбросился, так как lookahead отработал (именно из-за этой особенности, насколько я понял, для lookahead нельзя указывать квантификаторы, например вот так /\d(?!${1,2}), ведь проверяется только следующий символ.
Дальше двойка, за ней не конец строки - матчим двойку, заменяем $0 (там сейчас только 2) на whole match с плюсом, конкатенируем с результатом, сбрасываем whole match. Следующий символ 3, за ним конец строки, тройку не матчим, но она добавляется в whole match.



Аноним 2016/07/17 19:35:16  №798605 194
>>798573
>наследование
Как ты его используешь в своих проектах?
Аноним 2016/07/17 20:10:06  №798632 195
Пацаны, какие цветовые темы вы используете?
Я писал на с++, потом на с#, очень привык с темам vs, но на саблайм текс и пхпшторм они очень кривые какие-то. Нет тут дрочильщиков на темы vs? Перекидываться на другие как-то очень нет желания, у меня уже цвета в подсознании сидят.
Аноним 2016/07/17 20:25:51  №798645 196
>>798632
Погугли темы vs для шторма и саблайма, наверняка есть.
Аноним 2016/07/17 20:31:10  №798648 197
>>798599

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

> Первый символ дефис, пропускаем его (но кладем в whole match).
Мы никуда не кладем дефис, а просто оставляем как есть, не заменяя, так как он не совпал с регуляркой. Заменяется только то, что совпало.

?! нужен только чтобы сказать "за цифрой не конец строки". Как альтернатива можно писать (?=\d) но это длиннее.

> ${1,2}
Тут ошибка, я не знаю, можно ли применять квантификатор к утверждению, но даже если и можно то это было бы бессмысленно. Ты можешь хоть 10 раз проверить условие конца строки, это ничего не меняет.

>>798632

Дефолтную светлую тему из саблайма.
Аноним 2016/07/17 20:49:31  №798653 198
>>798648
> Она идет от начала строки к концу посимвольно и проверяет ее на совпадение с регуляркой.
Вот теперь, думаю, всё стало ясно. Спасибо.

>> ${1,2}
> Тут ошибка, я не знаю, можно ли применять квантификатор к утверждению
Да, глупость какую-то написал, даже не протестировав.
У меня было что-то вроде этого, я напутал: https://stackoverflow.com/questions/9030305/regular-expression-lookbehind-doesnt-work-with-quantifiers-or

Аноним 2016/07/17 22:47:29  №798757 199
Аноним 2016/07/17 23:24:14  №798799 200
>>798653

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

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

То есть это лишь особенность конкретного движка, возможно что есть и такие, в которых ограничения нет. Принцпиального ограничения тут нет.
Аноним 2016/07/18 09:39:36  №799043 201
Аноним 2016/07/18 14:40:42  №799213 202
Аноним 2016/07/18 14:45:18  №799218 203
>>798312
>>798322

Получается структура будет такой:
index.php - я не знаю что это, но оно грузит (include) либо template.html в которой и форма и вывод результата, либо по отдельности form.html и result.html.
template.html (или form.html и result.html) - это шаблон.
action.php - это скрипт с логикой.

Схема алгоритма выглядит так: сindex.html -include-> template.html -action/post-> action.php -include-> index.html -include-> template.html ?

Или сделать просто 2 файла index.html - шаблон с формой и выводом
и action.php - это скрипт с логикой.
Тогда схема: index.html -action/post-> action.php -include-> index.html
Аноним 2016/07/18 15:37:52  №799254 204
>>799218

Зачем делать 2 скрипта и усложнять все? делай один скрипт для вывода и для обработки данных формы. И один шаблон для вывода формы и результатов.

Алсо, урок по работе с формами: https://github.com/codedokode/pasta/blob/master/forms.md

Единственное, редирект тут делать не надо, и метод стоит использовать GET.
Аноним 2016/07/18 15:38:38  №799256 205
>>797289
> 3. http://ideone.com/SA4FYT
> Надо ставить фигурные скобки. Вместо копипастоы ифов лучше сделать массив с цифрами и словами и циклом искать совпадения в нем.

Я ничегошеньки не понял как это делать, кто-нибудь может подсказать?


6 задача: http://ideone.com/ZockRi
Аноним 2016/07/18 15:53:00  №799266 206
Аноним 2016/07/18 17:38:03  №799341 207
>>799254
Я этот урок не видел в ОП посте, наверное стоит его пройти, прежде чем приступать к "еще одному кредиту"
Аноним 2016/07/18 19:24:46  №799458 208
Странные вакансии иногда попадаются, вот например:
>Опыт не менее 3-х лет в роли веб-разработчика (желательно ecommerce).
>Наличие в портфолио хотя бы одного проекта, реализованного на Framework,
>Плюсом будет, если знаешь:

>Javascript, HTML/CSS;

3 года опыта, знание html/css будет плюсом, окей.
Аноним 2016/07/18 20:25:57  №799524 209
14688627577340.png (20, 609x132)
132x609
14688627577351.png (3, 307x21)
21x307
14688627577352.png (13, 719x113)
113x719
14688627577353.png (17, 708x159)
159x708
>>799458
Ну не всегда PHP-программист пишет что-то на фронте. Знаю студию, где проекты делятся между бекендщиками и фронтендщиками.
Алсо, вот что я как-то нашёл на бирже фриланса. Меня хватило на минут 30 скроллить такое, больше я там не появлялся.
Аноним 2016/07/18 21:20:19  №799564 210
ОПчик и посоны, подскажите, каким средствами можно отследить, что грузит mysql?
Переодически, где-то раз в неделю процесс mysql занимает триста процентов в топе. Я не знаю, как искать то, что пораждает такую нагрузку.
Аноним 2016/07/18 21:57:37  №799607 211
>>799564

От рута можно сделать такие запросы для начала:

SHOW FULL PROCESSLIST
SHOW ENGINE InnoDB STATUS

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

Аноним 2016/07/18 21:57:58  №799609 212
>>799564

Также, есть программа mytop по моему.
Аноним 2016/07/18 23:39:17  №799729 213
14688743580870.jpg (164, 900x1265)
1265x900
>>793705 (OP)
Ребята, поясните в двух словах, что такое Cron ? Из того, что прочитал, понял что если я поставлю себе Cron задачу на сервере, то она будет выполнятся с определённым интервалом.

Вопрос, могу ли я залить php документ с запросом в базу данных, в крон задачу, чтобы автоматически удалялись устаревшие данные из базы , м ?
Аноним 2016/07/19 00:36:34  №799773 214
>>799729
>Ребята, поясните в двух словах, что такое Cron
Ты настолько обленился, что википедию не осилил?
На сервере что стоит, debian\ubuntu наверно? Тогда лучше погляди на таймеры systemd для этого.
Аноним 2016/07/19 00:41:54  №799777 215
>>799729
Можешь, но то же самое ты можешь сделать и используя процедуры в базе.

Если файл обязателен, то просто ставишь время и путь к файлу. (Помни, что документ рут проекта может мешать работе с кроном (а может и не мешать))
Аноним 2016/07/19 01:46:40  №799824 216
Статья про опыт использования Node.js: https://m.habrahabr.ru/post/305832/

Подумайте 10 раз прежде чем отказаться от php.
Аноним 2016/07/19 03:19:02  №799860 217
>>797986
>Положим, что у меня есть матрица размером 2 х n, dв одном столбце у меня даты формата 00:00:00, а в другом какие-то данные, в зависимости от этих данных я меняю текущую дату на день вперёд.
>Как это сделать?
>матрица
Фуф, еле вспомнил как это работает. Я такого со времен первого курса вуза не слышал. Где такое нужно сделать?

Тебе помогут такие функции - array_map, array_walk
Аноним 2016/07/19 07:49:09  №799891 218
<!DOCTYPE html>
<html>

<head>
...
</head>

<body>
<header></header>
<footer></footer>
</body>

</html>

Что из этого "шапка"? <head> или <header>?

Как правильно выводить шаблоны через php? Иметь в каждом шаблоне <!DOCTYPE ...> и <head> или иметь отдельные шаблоны для этого? Если второе, то должны ли они содержать тэги <body> или их можно выводить в рабочем шаблоне?
Аноним 2016/07/19 08:31:38  №799911 219
Кошерна ли функция filter_var , можно ли применять ее для валидации данных введенных через форму?
Аноним 2016/07/19 08:32:12  №799912 220
Почему наш клуб такой уютный, а остальные похожи на филиал /б?
Аноним 2016/07/19 08:56:36  №799931 221
Аноним 2016/07/19 08:57:42  №799932 222
Аноним 2016/07/19 09:42:12  №799953 223
>>799932
>321.5+3/2-5=157.25
>'7+2/2='; //4.5
Это неправильные ответы. Операции деления и умножения должны выполняться раньше, чем операции сложения и вычитания. Погугли алгоритм сортировочной станции. Для каждого оператора выставляй приоритет в виде цифры.

>>799912
В других тредах тоже норм, только там вряд ли кто-то будет много твоего кода проверять. Да и у нас это только ОП делает.
В общем, если нормально спросить, то нормально ответят. Можешь погуглить "how to ask questions smart way".

>>799911
Смотря что валидировать. Если только email или тип данных (список констант есть в мануале по filter_var), то подойдёт. Если нужно, чтобы поле содержало только определённые символы, то бери регулярки.

>>799824
Из комментов:
>С другой стороны js\node могут привлекать существенно лучшим дизайном языка в мелочах, чем у того же php

Вот тут просто стул прожёг. Вспомнилось видео: https://www.youtube.com/watch?v=D5xh0ZIEUOE
Всё никак не могу себя заставить сесть за задачи ОПа по JS.
Аноним 2016/07/19 09:49:16  №799960 224
>>799953
>Это неправильные ответы. Операции деления и умножения должны выполняться раньше, чем операции сложения и вычитания.

Порядок действий не соблюдается (как и в обычном калькуляторе). Калькулятор отсюда http://archive-ipq-co.narod.ru/l1/finals.html
Аноним 2016/07/19 09:50:50  №799964 225
>>799960
Ну делай с приоритетами теперь.
Аноним 2016/07/19 09:56:23  №799970 226
Аноним 2016/07/19 11:22:23  №800002 227
>>799891
Если у тебя 1 шаблон на весь сайт, то просто делаешь 1 шаблон без разделения и всё.


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

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

require ('head.php');
include ('page1.php');
require ('footer.php);


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

>Что из этого "шапка"? <head> или <header>?
<head> - содержит в себе служебную инфу, которая на странице не отображается.

<header> - новый тег в хтмл насколько я понимаю введенный для семантической простоты, что бы в него именно и писали все шапку. а не воротили
<div class="header"> </div>
Аноним 2016/07/19 11:36:58  №800010 228
>>800002
><head> - содержит в себе служебную инфу, которая на странице не отображается.
>
><header> - новый тег в хтмл насколько я понимаю введенный для семантической простоты, что бы в него именно и писали все шапку. а не воротили
><div class="header"> </div>
Я знал об этом. Но что из этого "шапка"
Аноним 2016/07/19 11:39:37  №800014 229
>>800002
>require ('head.php');
Это содержание <head> с <!DOCTYPE ...> и/или <header>?
Аноним 2016/07/19 12:16:54  №800030 230
14689198145320.jpg (58, 738x422)
422x738
>>799254
>Алсо, урок по работе с формами: https://github.com/codedokode/pasta/blob/master/forms.md

Запилил процедурную реализацию алгоритма валидации формы как в уроке, теперь пытаюсь сделать тоже самое, но с ООП подходом. Пикрил - диаграмма классов.
Есть пара вопросов по уроку:
В разделе урока ООП-подход, второй абзац. Не совсем понятно, что имелось ввиду. Класс ошибок FormErrors - подразумевается, что этот класс хранит все ошибки, допущенные при заполнении всех полей формы, и соответственно, тогда каждую ошибку нужно как-то ассоциировать с полем, значением и сообщением, и хранить в виде массива, или в виде объекта Error в этом классе (композиция)? А в классе User хранить ссылку на него? Или можно хранить только одну ошибку, для каждого поля формы в классе Error, а все объекты Error хранить в массиве класса User (у меня на диаграмме Values)? Или вообще не стоит хранить ссылку на ошибки в классе User? Тогда, т.к. они возвращаются в методе класса Validator, то вызывать этот метод должен не User, а главный скрипт (MainScript), он же будет принимать решение, печатать сообщение об ошибках или создавать класс User. А класс User будет обладать только одним методом - конструктором, которому в качестве аргументов нужно передать корректные значения всех полей? А в самом конструкторе будет достаточно только указать тайп-хинт для значений, т.к. получается, что они уже прошли проверку до того, как были переданы в конструктор?

И второй вопрос, я сделал валидацию с помощью функции filter_var, тип фильтра я храню в константе, которая обозначает формат значения, который нужно ввести в поле формы. Но нужно где-то хранить отношения "поле_ввода=>формат_значения" и где-то объявлять константы. Мне кажется логично хранить константы в классе User, т.к. для каждой формы весь скрипт валидации отличается только этим классом? Но тогда, этот же класс и должен передавать значения на проверку в класс Validator? Но можно добавить класс Форма, в котором указать допустимый формат для каждого поля, и он же будет вызывать метод проверки, а потом создавать класс User. Но в этом случае, для каждой формы придется изменять уже два класса: Форму и User.
Аноним 2016/07/19 12:35:15  №800042 231
>>800010
Я это понимаю так:
<head> используется один раз, например в шаблоне head.* Он содержит служебную информацию.
<header> может быть использован неограниченное кол-во раз на странице. Он содержит информацию для пользователя. Обозначает заголовок смыслового блока. В заголовок обычно помещается название и иногда короткая информация о содержимом блока. Вся страница сайта, это некий блок, и у него есть заголовок, который обычно содержит название или логотип. Содержимое страницы то же можно разделить на блоки по смыслу, например, статья, последние записи, форма обратного звонка. Каждый такой блок будет содержать как минимум название. Даже подвал страницы может иметь <header>. Точно также обстоят дела с тегом <footer>.
Аноним 2016/07/19 12:45:34  №800049 232
>>800010
"Шапка сайта" - обычно имеется ввиду верхняя часть, где логотип названия, контакты, иногда меню. В WordPress эта часть шаблона называется header.php. По новым правилам ее нужно заключать между тегами <header></header>. Но эти теги можно использовать не только в шапке сайта, но и в шапке статьи, в шапке подвала и т.д.
Аноним 2016/07/19 13:17:38  №800065 233
Yii 2.0 Аноним 2016/07/19 13:34:37  №800074 234
Есть тут шарящие в этом фреймворке?
Пытаюсь вкатиться, скажите ЧЯДНТ? Почему возвращает false?

$a = Yii::$app->getSecurity()->generatePasswordHash('хуй');
$b = Yii::$app->getSecurity()->generatePasswordHash('хуй');

if (Yii::$app->getSecurity()->validatePassword($a, $b)) {
echo 'Совпало';
} else {
echo 'Нихуя';
}
Аноним 2016/07/19 13:36:36  №800075 235
>>800074
Я не писал на Yii, но мне кажется, что ты сгенерировал 2 разных пароля и хочешь, чтобы они были одинаковые.
Аноним 2016/07/19 13:40:34  №800079 236
>>800075
Ну сойди с неба на землю и поясни смертному, в чем дело то? И там и там же "Хуй", проверяю я их сходство вроде правильной функцией с методички. Почему они не одинаковые?
Аноним 2016/07/19 13:43:56  №800083 237
Аноним 2016/07/19 13:50:54  №800090 238
>>800083
Ок, сделал так:

$a = Yii::$app->getSecurity()->generatePasswordHash('хуй');
$b = '$2y$13$5KzuGLhwGGIl9gXlZhLroOqkwTLAgKvyMONYq6MSqUFaIItGHlOGW'; //хэш хуя
if (Yii::$app->getSecurity()->validatePassword($a, $b)) {
echo 'Совпало';
} else {
echo 'Нихуя';
}

Всеравно false
Аноним 2016/07/19 13:55:03  №800094 239
>>800090
Теперь ты одинаковые хеши передаёшь в метод валидации пароля. Ты не понимаешь разницу между хешем и паролем, рано тебе во фреймворки лезть. Решай студентов из ОП-поста, задача содержит множество полезной информации, с которой ты не знаком.
Аноним 2016/07/19 14:02:04  №800105 240
>>800094
сам решай свои задачи.

Однако ты прав, написал в $a 'хуй', не хешируя его - вернуло тру. Однако в методичке четко написано:
>Когда пользователь попытается войти, отправленный пароль должен быть хеширован и сравнён с ранее сохранённым хешем
Аноним 2016/07/19 14:31:32  №800130 241
>>800074
Этот метод автоматом хешириует второй (или первый аргумент). Получается, что один из хешей отхеширован второй раз. Запихивай один пасс плейнтекстом
Аноним 2016/07/19 14:36:39  №800136 242
>>800130
Первый аргумент. (фикс)

Вот пример с туториала (как тут кода вставлять):

$hash = Yii::$app->getSecurity()->generatePasswordHash($password);

if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
// all good, logging user in
} else {
// wrong password
}
Аноним 2016/07/19 14:56:59  №800157 243
>>799953

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

>>800030

Класс Value с одним полем - не очень понятно, зачем он. Мне кажется, он не нужен и это переусложнение. Ни разу такого не видел.

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

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

class Student
{
public $name;
public $surname;
}

Там правда есть подвох что поля в форме не всегда соответствуют модели один-к-одному. Ну например в форме регистрации будет 2 поля ввода пароля, а в модели студента - поле с хешем пароля. Где хранить эти пароли...

Ты пишешь универсальные классы для любой формы или для какой-то конкретной? Как минимум валидация в каждой форме будет своя.

У валидатора по моему должен быть один публичный метод - validate(Values) -> errors. Или, что лучше, валидировать конкретную модель без привязки к форме: StudentValidator->validateStudent(Student) -> errors

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

Не понимаю, что делает метод Values#createValues() ? createValue()? Так как мне кажется что класс Value не нужен то и эти методы тоже получаются ненужными.

Также, мне кажется что в Values не должно быть метода validate. Зачем? Валидация это задача другого класса.

В FormError вместо value лучше хранить к какому полю относится ошибка.

MainScript я думаю не надо разбивать на методы. Алгоритм будет лучше читаться если он написан в одном методе и небольшой. Название стоит поменять на ....Controller.

В общем:

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

Аноним 2016/07/19 15:01:16  №800161 244
>>800136
Уже разобрался, спасип. Есть еще вопрос:
В Yii2 валидация формы на стороне клиента осуществляется по событию - onblur. Как можно это изменить?
Аноним 2016/07/19 15:10:07  №800172 245
>>800030

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

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

> класс User будет обладать только одним методом - конструктором, которому в качестве аргументов нужно передать корректные значения всех полей?
Полей может быть много, конструктор будет нечитаемым. обычно делают пустой конструктор и мето принимающий массив полей для установки (setAttributes(array $values)) либо ставят свойства в цикле.

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

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

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

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

> . Но нужно где-то хранить отношения "поле_ввода=>формат_значения" и где-то объявлять константы.
Информацию о типах значений можно хранить в 2 местах:

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

> Но можно добавить класс Форма, в котором указать допустимый формат для каждого поля, и он же будет вызывать метод проверки, а потом создавать класс User. Но в этом случае, для каждой формы придется изменять уже два класса: Форму и User.
Возможно, что придется. Если подумать, часть информации относится к модели пользователя. а часть только к форме.
Аноним 2016/07/19 15:16:00  №800174 246
>>800074

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

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

>>799911

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

>>799891

Зависит от контекста. Как правило общую часть разных страниц выносят в отдельный шаблон. Копипаста это зло.

>>799860

И цикл foreach

>>799931

Для первых 2 строк стоит использовать цикл чтобы не повторяться. Также погугли функцию array_rand.

>>800002

Почему для разных шаблонов используются разные функции require/include?

>>800090

Почитай про соленые хеши

>>800161

Не знаю. Там нет опции? Если нет, то только заменой кода на свой или добавлением своего кастомного кода.
Аноним 2016/07/19 16:00:27  №800216 247
Ребятки, я вот совсем бомж например, поясните за Евгения Попова?
Аноним 2016/07/19 16:02:35  №800219 248
14689333560510.png (148, 768x614)
614x768
>>800010
>>800014
Ну смотри, давай разберем, что тебе нужно. У тебя должна после всех твоих инклудов и сборов по частям, просто получиться правильная по структуре и содержанию ХТМЛ страница, верно?
Вот такого в общем вида как ты сам принес:


<!DOCTYPE html> //начало шаблона head.php - назвать можно как угодно на самом деле, лишь бы тебе было понятно
<html>

<head>
... //обязательная служебная инфа
</head>

<body> //тут уже пошел "видимый юзеру хтмл
<header>
... // сюда ты запихнешь шапку, которая повторяется у тебя на каждой странице, с меню, контактами, логотипом и прочим
</header> //конец шаблона header.php

<div class="content"> //начало шаблона page1.php например
... а вот тут у тебя уже контент который зависит на странице от того какой пользователь пришел к нам, или чего он хочет
</div> //конец шаблона page1.php

<footer> // начало шаблона footer.php
... // здесь будет подвал, который тоже одинаков для каждой страницы,
</footer>
</body>

</html> //конец шаблона footer.php





>>800174
>Почему для разных шаблонов используются разные функции require/include?

Ну допустим за тело самой страницы может отвечать юзер, создавая какие-нибудь товары и прочее. Поэтому написал инклуд, что бы если страница вдруг проебется, то не было бы фатал ерора. Поясни если не прав
Аноним 2016/07/19 16:02:51  №800220 249
А, еще расскажите за пренебрежение к пыхомакакам
Аноним 2016/07/19 16:05:31  №800222 250
>>800220
Полностью пренебрегаю тобой, что бы что-то рассказывать.
Аноним 2016/07/19 16:05:50  №800223 251
14689335510260.jpg (76, 825x825)
825x825
14689335510271.jpg (122, 1146x938)
938x1146
>>800220
Макаки есть везде, независимо от языка.
Аноним 2016/07/19 16:07:27  №800224 252
Аноним 2016/07/19 16:08:18  №800225 253
>>800224
Не тащи свои тупые мемасы на борды.
Аноним 2016/07/19 16:09:19  №800226 254
>>800225
А я то думал у вас здесь филиал быдла. Ладно, больше не буду
Аноним 2016/07/19 16:12:21  №800230 255
>>799607
>SHOW FULL PROCESSLIST
а вот команда sleep что одначает в данном контексте?
Аноним 2016/07/19 16:16:01  №800234 256
>>800230

Соединение установлено, но никаких запросов еще (или уже) не выполняется.
Аноним 2016/07/19 16:34:14  №800245 257
>>800234
такое соединениеи может влять на производительность?
ЗЫ буду шатать mytop
Аноним 2016/07/19 16:40:36  №800254 258
Прочитал про Ember: https://guides.emberjs.com/v2.6.0/getting-started/core-concepts/#toc_templates

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

- они зачем-то называют контроллер "роутом"
- они называют набор данных для view "моделью"
- они делают типичную ошибку начинающего, думая что 1 контроллер = 1 модель
- нагородили свою систему объектов с Ember.Object. Напомню, что когда у вас появляется желание наследовать все свои объекты от одного базового класса - с вашей ООП моделью что-то не так.
- лезут в стандартные прототипы
- интеграционный тест из примера https://guides.emberjs.com/v2.6.0/tutorial/simple-component/ ужасный, содержит много знаний о внутреннем устройстве страницы и скорее всего очень легко ломается

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

>>800245

нет, оно же ничего не делает.
Аноним 2016/07/19 16:52:45  №800265 259
>>800254
>- они делают типичную ошибку начинающего, думая что 1 контроллер = 1 модель

эм что?
Аноним 2016/07/19 16:59:25  №800270 260
>>800265
Не ОП, но по своему скудному опыту скажу, что в небольших приложениях одна страница - один контроллер. Много страниц (много контроллеров) могут работать с одной и той же моделью.
На сайте статей модель Article может использовать как ArticleController (для показа статьи обычному пользователю), так и AdminController (для управления статьями).
Аноним 2016/07/19 17:03:39  №800274 261
>>800270
> модель Article может использовать как ArticleController
*модель Article может использоваться как ArticleController'ом ...
Так понятней.
Аноним 2016/07/19 17:04:03  №800275 262
Сап, пхп боги. Есть ли современный стандарт организации авторизации? Существует ли что-то типа фреймворка, что позволит упростить процесс авторизации?
Аноним 2016/07/19 17:23:54  №800297 263
14689382342860.jpg (139, 600x600)
600x600
гайс , решил с одного треда спарсить кортиночки
file_get_contents получаю html код себе на localhost ,
рву относительные ссылки изображений "../" на "https://2ch.hk/..." но картинок не получаю
в чем я не прав помогите!
Аноним 2016/07/19 17:30:25  №800302 264
14689386253570.png (43, 876x229)
229x876
14689386253581.png (62, 574x325)
325x574
Аноним 2016/07/19 17:44:25  №800306 265
>>800302
сделал, вместо картинок у меня все еще тег alt=""
Аноним 2016/07/19 17:46:37  №800308 266
>>800306
проблема была в названии картинки, решено!
спасибо :)
Аноним 2016/07/19 18:16:16  №800348 267
14689413765030.jpg (77, 800x558)
558x800
>>793705 (OP)
ОП! Я хочу сделать сайт с независимой навигацией двух или трех типов (отдельные меню, возможность нахождения в двух или трех категориях одновременно и т. д.)? Как это правильно делать и как быть с поисковой оптимизацией (ссылки на одни и те же материалы сайта будут встречаться в разных категориях), как быть с содержимым адресной строки, которую хочется сделать логичной? Было бы здорово, если бы ты показал простейший пример. Очевидные теги использовать не хочется, потому что в моем случае это будет выглядеть как сайтнейм.ру/тэгс/статья+стратегия+андроид+айос+винфон+платные+популярное, лол. Кроме того, теги я итак хочу, но в них будет совсем другое (компания-дистрибьютор например, авторы и прочее)
Конкретно: хочу сделать сайт про игрушки (не пинай за это, вопрос ведь не об этом), эти игрушки с одной стороны подразделяются по жанрам на стратегии, шутеры, гонки и ммо, с другой стороны по платформе (мобильники, десктоп, консоли), с третьей - на платные и бесплатные и так далее. А материалы про них - на статьи, обзоры, сравнения, новости и другие. Вот хотя бы жанр и тип материала хотелось бы вынести в два независимых меню, остальное оставив на теги. Возникают описанные выше проблемы с содержимым юрл-бара, индексацией, способом хранения.
Аноним 2016/07/19 19:21:53  №800441 268
>>800348

Ты читал мой урок https://gist.github.com/codedokode/772a4ccc03e41d6b7cba ?

Есть разные подходы.

> сайтнейм.ру/тэгс/статья+стратегия+андроид+айос+винфон+платные+популярное,
Это ерунда какая-то.

Для начала можно попробовать сделать минималистичную схему, убирая все лишнее:

- страница игры /game/final-fantazy или /game/123
- информация о платформе и играх для нее /platform/android
- список игр в жанре /genre/strategy

Но если ты делаешь страницу /genre/strategy то хорошо бы чтобы это была именно страница про стратегии, например статья с кратким обзором популярных стратегий, а не тупо список ссылок на игры. Я не разбираюсь в СЕО, но сомневаюсь что поисковик будет высоко ценить страницу на которой 0 уникального контента. Да и нужна ли она посетителям твоего сайта?

Для страниц которые включают в себя поиск по нескольким критериям вообще не надо делать отдельные УРЛ. Пусть это будет поиск вроде /games?genre=strategy&platform=android. Все равно эти автосгенерированные страницы имеют нулевую ценность для поисковиков. Это просто модификация страницы /games со списком ссылок на игры.

В общем, я тебе советую придерживаться такого принципа: уникальный УРЛ = уникальная страница. Список, отфильтрованный по какому-то критерию, новой страницы не создает.

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

Аноним 2016/07/19 19:38:04  №800469 269
>>800174
Я гуглил array_rand, но у меня с ним не получается, выдаёт непонятно что. Если тебя не затруднит, то не мог бы ты пару строчек с array_rand мне показать?
Аноним 2016/07/19 19:41:23  №800476 270
Аноним 2016/07/19 19:44:24  №800483 271
>>800469

А ты мануал читал? Ты знаешь что возвращает array_rand? Она возвращает случайный ключ из массива. Ты должен после этого по ключу взять значение элемнета. Ты знаешь, как это сделать? для этого используются квадратные скобки.
Аноним 2016/07/19 19:52:00  №800489 272
>>800157
Спасибо за подробный ответ!

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

То есть в моем случае, т.к. это форма для ввода значений для расчета кредита, модель будет выглядеть так:
class Credit
{
public $amount;
public $percent;
public $payment;
}

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

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

>Как минимум валидация в каждой форме будет своя.
>Или, что лучше, валидировать конкретную модель без привязки к форме: StudentValidator->validateStudent(Student) -> errors

А как связать поля формы и модели? И нужно валидировать и форму и модель, т.е. два валидатора?

Controller будет отправлять форму (модель) на валидацию?
Аноним 2016/07/19 19:54:21  №800490 273
>>800483
Пытался использовать квадратные скобки, не получилось что-то, я необучаемый
Аноним 2016/07/19 20:03:40  №800501 274
14689478207690.png (19, 862x372)
372x862
Как подключить glyphicons, если они в папке бутстрапа? Если положить папку fonts прямо в корень сервера все работает, если fonts в bootstrap - нет.
Аноним 2016/07/19 20:09:46  №800508 275
>>800172
Спасибо за ответ, это один из лучших тредов )

>Тайп-хинты не имеют отношения к валидации.

Имел в виду, какой класс должен отправить значения полей формы на валидацию, Controller (MainScript) правильно? Класс User (Модель) - этим не занимается?

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

Получается Валидатор должен иметь несколько методов на все случаи жизни, или делать под каждый случай новый Валидатор? Тогда и контроллер должен знать в какой Валидатор отправить значения, или какой метод запустить? Ила Валидатор может получить эту информацию из Модели (User\Value) и решить как правильно проверять значение?

>Информацию о типах значений можно хранить в 2 местах:

То есть нужно проверять и модель и форму на соответствие формату введенные значения?


Аноним 2016/07/19 20:15:20  №800513 276
14689485202760.png (32, 1035x89)
89x1035
Аноним 2016/07/19 20:33:40  №800528 277
Аноним 2016/07/19 20:48:34  №800548 278
>>800489

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

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

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

> Controller будет отправлять форму (модель) на валидацию?
Контроллер принимает данные из GET, вызывает валидацию и получение результата, вызывает шаблон для вывода данных.
Аноним 2016/07/19 20:49:44  №800549 279
>>800501

А откуда ты их подключаешь? По идее там должны быть уже лтносительные ссылки правильно проставлены. Что ты сделал? Перенес файлы в другую папку?

>>800513

Это плохой совет. Нельзя трогать файлы сторонних библиотек.


Аноним 2016/07/19 23:31:43  №800747 280
>>798277
В догонку...

https://github.com/TheSidSpears/Students/blob/master/app/classes/Authorization.php#L12
> function __construct($container){
> перечитай урок про DI. Это service locator и это плохая вещь.

Убрал где можно. Но как я понимаю в контроллеры всё равно контейнер придётся передавать целиком, так?


> Сам класс авторизации странный, половины функций связанных с авторизацией, в нем нет, они в контроллере.

Добавил setHash(). Еще что-то нужно? У меня нет идей


> В student->addInfo есть проблема. У тебя нет фильтрации по разрешенными полям и пользователь может менять любые свойства студента в том числе те, которых нет в форме. ну например что если мы добавим колонку is_admin - пользователь сможет передать $POST['is_admin'] = 1 при редактирвоании. И кстати об этом было написано в моем уроке.

Я подразумеваю, что всё что нельзя редактировать пользователю, то protected. А get_object_vars возвращает только public свойства. Разве не элегантно?


https://github.com/TheSidSpears/Students/blob/master/app/classes/StudentValidator.php#L66
> function __construct(Student $s, $container, $id=NULL){
> Почему ты пишешь код валидации в конструкторе? И почему передаешь контейнер? Почитай про DI.
- Я переписал __construct так
$this->table=$table;
$this->validate();
return $this->errors;
потому что этот класс используется только так и никак иначе. Создать, проверить на ошибки, вернуть ошибки. Верно так делать? Это сокращает работу с классом до одной строки: $validErrors=new StudentValidator($student,$this->c['table'],$id);

https://github.com/TheSidSpears/Students/blob/master/app/classes/ViewHelper.php
> тут слишком много всего понамешано.

Понамешано? Я тебя не понял
Аноним 2016/07/20 04:38:32  №800953 281
>>800747

> Но как я понимаю в контроллеры всё равно контейнер придётся передавать целиком, так?
Да, это обычно удобнее. В Симфони тоже так сделано.

>> Сам класс авторизации странный, половины функций связанных с авторизацией, в нем нет, они в контроллере.
> Добавил setHash(). Еще что-то нужно? У меня нет идей
Принцип единой ответственности подразумевает, что каждый класс решает свою задачу, соответственно класс авторизации должен содержать в себе функционал, позволяющий:

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

Метод setHash на мой взгляд, это не "залогинить пользоваетля". Как минимум его надо переименовать.

Тут опечатка: if (empty($isAuthorized)) { - пропущено this. Если бы ты не использовал empty, ты бы сразу увидел ошибку. Потому - не применяй empty к отдельной переменной.

> Я подразумеваю, что всё что нельзя редактировать пользователю, то protected. А get_object_vars возвращает только public свойства. Разве не элегантно?
Откуда я могу об этом догадаться? И нет, не элегантно, так как могут добавиться новые поля и неизвестно, можно ли их редактировать. Что если там будет публичное поле isAdmin? Нужна фильтрация, может быть в контроллере, может в модуле отвечающем за формы.

> потому что этот класс используется только так и никак иначе. Создать, проверить на ошибки, вернуть ошибки. Верно так делать? Это сокращает работу с классом до одной строки: $validErrors=new StudentValidator($student,$this->c['table'],$id);
Во-первых, конструктор не может вернуть значение. Во-вторых, ООП не подразумевает такого использования объектов. В-третьих, если получать валидатор из контейнера, то будет опять же одна строка.

Конструктор лишь подготавливает объект к работе. Он не должен заниматься валидацией.

>> тут слишком много всего понамешано.
> Понамешано? Я тебя не понял
Посмотри на список полей. Их так много что класс напоминае God Object ( https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82 )

Контейнер надо убрать. Также, я вижу как минимум что тут смешан класс для генерации УРЛ и класс с статическими функциями-утилитами. Для функций надо расставить private/public. название тоже неправильное. Можно подумать что это универсальный класс но на самом деле он умеет генерировать УРЛ только для таблицы студентов с разными видами сортировок - это надо отразить в названии.

Аноним 2016/07/20 04:47:41  №800955 282
>>800508

> Имел в виду, какой класс должен отправить значения полей формы на валидацию, Controller (MainScript) правильно? Класс User (Модель) - этим не занимается?
Не занимается. Задача модели - хранить информацию о пользователе.

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

Раз уж ты интересуешься всем этим, советую почитать комментарии к этой задаче - https://github.com/codedokode/pasta/blob/master/student-list.md

> Ила Валидатор может получить эту информацию из Модели (User\Value) и решить как правильно проверять значение?
Это годится только для типовых случаев, например проверка на длину. А если у тебя нестандартная проверка, как ты эту информацию закодируешь?

Я тебе советую глянуть (если ты понимаешь английский) компонент симфони для валидации. Он позволяет с помощью аннотаций помечать правила валидации модели: https://symfony.com/doc/current/book/validation.html

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

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

Аноним 2016/07/20 04:56:49  №800956 283
>>800275

Стандарта нет, но есть библиотеки. Давай я научу тебя как их искать:

http://phptrends.com/dig_in/authorization
https://packagist.org/search/?search_query%5Bquery%5D=authorization
http://pronskiy.com/php-digest/ - ввести "авторизация" в поиск

Будет неплохо если ты посмотришь самые популярные библиотеки и тут напишешь свое мнение про их плюсы и минусы.

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

>>800270

Один контроллер может использовать несколько моделей.И наоброт. Я правда перепутал, в эмбере функция model() возвращает не модель, а набор данных для шаблона (ViewModel?).

>>800265

Я перепутал, в эмбере функция model() возвращает не модель из MVC, а набор данных для шаблона (ViewModel?).

>>800219

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

Нужно делать фатал еррор - это называется fail fast: https://habrahabr.ru/post/218325/

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

Аноним 2016/07/20 05:13:06  №800958 284
>>794105

> "/(^ )/u", //пробелы в начале строки
Их наверно проще через trim удалять

> $regExp[1]
Это не очень хорошо читается так как надо искать нужный элемент глазами. Лучше класть регулярки в переменные или сразу вписывать в preg_replace напрямую.

> $letters = preg_split("//u", $text,-1,PREG_SPLIT_NO_EMPTY);
> $letters[0] = mb_strtoupper($letters[0]);
тут излишне разбивать на символы - проще взять первый символ через mb_substr

Чтобы не было проблем с троеточием, надо модифицировать регулярку "/ ([.,?!:]) */u", а то, что у тебя больше напоминает "костыль".

>>794246

> $words = preg_split("/\b/ui",
на слова лучше разбивать пробелом

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

>>794248

http://ideone.com/tcJqI0

> $regexp = '/\n/';
Тут незачем регулярки использовать, хватит простого explode

> $maxlength = mb_strlen($lines[0]);
лучше бы найти максимальную дину всех строк, например с помощю max и array_map, это короче чем писать цикл.

> for ($column = 0; $column < $numberOfColumn; $column++) {
Тут наверно foreach лучше подойдет

> $lines[$column] = mb_substr($lines[$column], 1);
Это что-то странное, зачем ты обрезаешь исходную строку? Это как минимум усложняет понимание кода.

http://ideone.com/yWwikd

> for ($participant = 0; $participant < $total; $participant++) {
> $seats[$participant] = $participant + 1;
Тут нельзя использовать функцию range()? Или array_fill?

> for ($participant = 0; $total >= $skip; $total--) {
Немного сбивает с толку то, что используются разные переменные.

> if ($participant <= $total - $skip) {
> $participant = $participant + $skip - 1;
Запретить значению выходить за определенный предел удобнее с помощью операции "деление с остатком", %.

> unset($seats[$participant]);
> sort($seats);
Для перенумерации выгоднее использовать array_values. Однако для удаления элемента из массива с перенумерацией есть готовая функция array_splice.

> for ($PlacesToEnd = $skip; $PlacesToEnd > 0; $PlacesToEnd--) {
> $placeInNewCircle++;
По моему весь этот цикл можно заменить на сложение и остаток от деления.

В общем, код стоит упростить. Пока он переусложнен.

Аноним 2016/07/20 05:18:05  №800959 285
Аноним 2016/07/20 06:10:29  №800969 286
Оригинал: Слава Третьему Рейху!
Шифровка: Сл131 Тр6ть6му Р6#ху!
Дешифровка: Слава Третьему Рейху!

Пацаны, я Энигму создал.
Аноним 2016/07/20 06:21:54  №800972 287
Внезапных глаз судьбы явлений
Суровых лет замены нету
Я умираю смысл жизни

Жиза, пиздец...
Аноним 2016/07/20 09:13:20  №801008 288
>>800956
Спасибо, попробую Sentinel
Аноним 2016/07/20 12:02:38  №801090 289
ОП, делаю задачу на файлообменник, ты советуешь менять формат файлов на txt.

Не лучше ли хешировать файлы?
Аноним 2016/07/20 13:45:38  №801171 290
аноны, посоветуйте сайт поиска работы в россии. пытаюсь найти работу стажером по php
Аноним 2016/07/20 14:13:03  №801191 291
>>801171
олсо. прочитал в одной вакансии про самостоятельное поднятие сервера и начал гуглить. Понял что ничего об этом не знаю, кроме того что описано в обычных учебниках по php. Прочитал про сервера, нашел туториалы как их настраивать, но мне ни как не дойдет как это сделать. Как мне тестово настроить сервер? мне нужно его покупать или можно это сделать на своем компе? сейчас ничего не пойму, прошу помощи объяснить
Аноним 2016/07/20 14:49:26  №801219 292
14690153668730.jpg (32, 600x396)
396x600
>>801171
>>801191
>пытаюсь найти работу стажером по php
>Как мне тестово настроить сервер? мне нужно его покупать или можно это сделать на своем компе?
Орнул с тебя.
Про Apache не слышал? Как ты вообще изучал PHP тогда?
Аноним 2016/07/20 15:11:36  №801231 293
>>801171
>>801191
> Погуглите за меня сайт с вакансиями
> Объясните как подымать сервер
Почему ты такой несамостоятельный? Какой сервер, ты хочешь, чтобы сайт из твоей локальной сети был виден всему миру? Вот: http://varkon.biz/2010/08/kak-sdelat-dostup-k-apache-iz-interneta/
Если вообще нулячий, то можешь попробовать следующее:
1. Поставить на виртуалку Ubuntu, засетапить там LAMP, залить туда сайт.
2. Научится заходить на этот сайт из хостовой ОС (той, на которой ты запустил виртуальную машину). Если разберёшься, то многое прояснится.
Но это если хочешь что-то понять. Если понимать не обязательно, то бери heroku. Ну и обязательно нужно знать про домены-хостинги, всё разжёвано донельзя: http://www.postroika.ru/hosting/
Погуглил за тебя.

>>801219
Видимо, пользовался денвером-большой-красной-кнопкой.
Аноним 2016/07/20 15:15:57  №801235 294
14690169574420.jpg (85, 645x968)
968x645
>>801231
>Видимо, пользовался денвером-большой-красной-кнопкой.
Ideone - наше всё!
Аноним 2016/07/20 15:26:04  №801257 295
>>801231
я нашел много сайтов с вакансиями на каждом нужно регаться, хочу узнать про один толковый, а не сотню хуйпойми чего.
Про сервер тоже прогуглил но ничего не понял вот и пытаюсь узнать. Это же блядь имиджборда.
Аноним 2016/07/20 15:27:24  №801263 296
>>801219
слышал. вопрос в том что сервер я так понял это машина. я могу поднять его и на своем компе?
Аноним 2016/07/20 15:30:35  №801269 297
14690178353980.jpg (63, 799x507)
507x799
>>801263
Apache посмотри..
Ты где учился языку-то, как ты смотрел, что код исполняется вообще? Троллишь так, что ли, чертяка?
Это же как устраиваться работать в такси, но не иметь водительских прав.
Анон выше тебе всё расписал.
Аноним 2016/07/20 15:30:53  №801271 298
>>801231
вообще нулячий в серверах.
с первым я разберусь, а что дальше? что на нее ставить где почитать? нихуя не пойму пока и не прошу все по полочкам раскладывать, просто ссылки на инфу покидайте
Аноним 2016/07/20 15:45:32  №801289 299
>>797257
> У тебя должна быть система публикации скриптов

Не подскажешь как она называется? Что-то я не могу подобное найти, ищу по запросам в стиле "как скачивать js библиотеки composer".
Аноним 2016/07/20 16:17:35  №801316 300
Аноним 2016/07/20 16:20:12  №801319 301
>>801269
вот я умею настроить только локальный сервак по туториалам и виртуальные хосты.

а сложно ли сделать сервак, чтобы он был доступен для других в интернете?
Аноним 2016/07/20 16:26:01  №801326 302
>>801319
Ну почитай те ссылки, что я тебе нагуглил. Не траллируй, я сейчас материться начну.
Аноним 2016/07/20 16:27:42  №801327 303
Аноним 2016/07/20 16:36:17  №801333 304
>>801316
Всё хорошо, продолжай.
Аноним 2016/07/20 18:55:56  №801455 305
14690301568950.png (23, 590x259)
259x590
Аноним 2016/07/20 21:09:32  №801593 306
https://ideone.com/6ao0c
не понял, почему есть 12 строка, и можно ли от неё избавиться?
Аноним 2016/07/20 21:14:07  №801599 307
Аноним 2016/07/20 21:17:15  №801605 308
>>801599
Так она же у тебя пустая.
Аноним 2016/07/21 00:09:35  №801739 309
Аноним 2016/07/21 00:12:51  №801744 310
14690491718250.png (256, 1242x2208)
2208x1242
Аноним 2016/07/21 00:24:13  №801752 311
>>801739
>$difference = $paymentTotal - 40000;
Если хочешь потом посчитать разницу, то лучше изначально $creditBalance сохранить дополнительно в соответствующей переменной:
>$parentCreditBalance = $creditBalance;
А затем уже в самом конце отнять от $paymentTotal этот $parentCreditBalance.
В этом случае легче обслуживать код - не надо менять цифру в самом конце, когда, допустим, меняешь сумму кредита изначально.
А так всё хорошо выглядит, задача правильно решена.
Аноним 2016/07/21 01:35:45  №801774 312
14690541459330.jpg (220, 1280x960)
960x1280
Поясните меня за терминологию.

Есть бд, на сайт должны выводиться выборки с этой бд.
Мне эту хуйню надо разработать и протестить на своём компутере (что называете локальным сервером, так?)
Т.е. для разработки мне нужно установить:
1. сервер (какой?)
2. среду разработки (как я понял в тредне пхпшторм, пойдёт?)
3. настроить эту среду (тяжело ли настраивать пхпшторм? компиляторы, хуяторы, проверку синтаксиса, дебаг, есть там это всё из коробки или надо поставить 200 плагинов?)
4. браузер, в котором можно видеть результат (а можно без браузера? консоль там или ещё что)

Где про это можно подробно почитать? Вообще про взаимодействие сайта с сервером. Что пишется на js, что на php, как запросы формировать, вот это всё, как данные выдавать, асинхронность, вот это всё, рожь, зелень.

Я к вам из c++ пришёл и голова с вашей хуйни забубённой просто пухнет, думал за вечер установлю всё необходимое, в итоге не установил нихуя.
Аноним 2016/07/21 01:53:00  №801777 313
>>801774
>1. сервер (какой?)
Обычный веб-сервер, который слушает определенный порт и отдает веб-страницы пользователям которые к нему обращаются. Их существует много, но для новичков тут часто советуют апач (Apache HTTP Server - https://httpd.apache.org/ ). Но одного веб-сервера мало, он умеет только отдавать только обычную статику (т.е. файлы html которые лежат в его корневой директории), для динамики к серверу нужно будет поставить интерпретатор PHP. Как это сделать и как оно работает можешь почитать тут https://github.com/codedokode/pasta/blob/master/soft/apache-install.md там есть секция Q&A которая поможет тебе разобраться во всем получше.
>2. среду разработки (как я понял в тредне пхпшторм, пойдёт?)
Необязательно среду, тут уже вкусовые предпочтения. Некоторые используют редакторы типа Sublime Text или Atom. Они легче чем пхпшторм, не так нагружают компьютер, и для старых ноутбуков самое то. Конечно функционала там меньше, но все самое необходимое (линтер, дебаггер) можно настроить с помощью плагинов. Конкретно за пхпшторм рассказать не смогу, я им не пользуюсь. Может кто из анонов подскажет.
>а можно без браузера? консоль там или ещё что
Если к своему приложению сможешь написать клиент для работы с командной строкой - тогда можно. Я не думаю что тебе будет приятно читать в консоли html разметку файлов которые отдал сервер.

Так же, у ОПа есть еще несколько уроков, которые рекомендуется почитать
https://github.com/codedokode/pasta/blob/master/soft/php-install.md - про установку PHP
https://github.com/codedokode/pasta/blob/master/soft/web-server.md - про настройку веб-сервера с PHP, там же есть несколько задачек для закрепления\убеждения в том что ты все сделал правильно.
Аноним 2016/07/21 10:24:34  №801909 314
Как написать чат на пхп?
Аноним 2016/07/21 10:43:00  №801920 315
Аноним 2016/07/21 16:37:11  №802210 316
>>801774
Окей смотри, меня ща обоссут местные устанавливатели ВРУЧНУЮ ПОДНЯТИЕ ЛИНУКСА + ПХП + МУСКУЛЭЛ + АПАЧ на локальном компе что бы лампово пердолится вечерами на локалхосте, но уверен что тебе я помогу.


Идешь на http://open-server.ru/download/

Скачиваешь бэйсик версию.

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

1. В той папке куда ты установил всё, у тебя будет папка domains

2. Заходишь значит в domains, создаешь в ней папку с именем например loh.pidr

3. В этой папочке создаешь файл index.php

4. В этом файлике пишешь например: <?php echo "hello world" ?> сохраняешь

5. Запускаешь в значит open server x64.exe

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

7. После того как всё запустилось и флажок стал зелененьким заходишь в браузер и в адресной строке вбиваешь адрес http://loh.pidr
(опционально можно http://loh.pidr/index.php, но к этому файлу и так будет автоматом цепляться при заходе на просто loh.pidr)

8. Вот собственно ты и поднял у себя связку APACHE + PHP + MYSQL на винде

9. Редактируешь свои скрипт_нейм.php в папке loh.pidr, смотришь результат в браузере loh.pidr/скрипт_нейм.php

10. Удачи, если что спрашивай

11. Если вдруг лень качать open server, а без пожертвования он будет качаться часа 2, (могу залить куда-нибудь что бы быстрее скачать если не ссышь от левого анона брать файло) то можешь скачать http://www.denwer.ru/ и по их мануалу всё настроить, там немного отличается подход создания локального домена, но суть та же. Просто денвер устарел и не обновляется.

Аноним 2016/07/21 16:53:21  №802219 317
>>802210
Да, а среда разработки можешь скачать https://www.sublimetext.com/

ассоциировать .php файлы с ним и в нем лампово работать

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

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

>Есть бд, на сайт должны выводиться выборки с этой бд.

Тогда тебе надо разобраться как работать с базой данных с помощью php и вывести в читабельном (html) виде всё это на сайт. Просто напишешь свой скрипт для начла, который коннектится к бд, шлет запрос, получает ответ, и выводит его в браузер.

Подобное в люой книге по php есть обычно, но если совсем ленивый, то можешь на примере этого примера с офф сайта сделать для начала
http://php.net/manual/ru/mysql.examples-basic.php

Ща опять все навалятся, что mysql_
функции в php это деприкейтед и зашквар, но ты сделай для тренировки как тут, а потом на pdo или mysqli_* перейдешь.
Аноним 2016/07/21 18:31:37  №802258 318
>>802210

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

Плюс в сборках часто устаревшие версии программ.

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

Аноним 2016/07/21 19:43:31  №802291 319
>>798277
В догонку...

https://github.com/TheSidSpears/Students/blob/master/app/classes/Authorization.php#L12
> function __construct($container){
> перечитай урок про DI. Это service locator и это плохая вещь.

Убрал где можно. Но как я понимаю в контроллеры всё равно контейнер придётся передавать целиком, так?


> Сам класс авторизации странный, половины функций связанных с авторизацией, в нем нет, они в контроллере.

Добавил setHash(). Еще что-то нужно? У меня нет идей


> В student->addInfo есть проблема. У тебя нет фильтрации по разрешенными полям и пользователь может менять любые свойства студента в том числе те, которых нет в форме. ну например что если мы добавим колонку is_admin - пользователь сможет передать $POST['is_admin'] = 1 при редактирвоании. И кстати об этом было написано в моем уроке.

Я подразумеваю, что всё что нельзя редактировать пользователю, то protected. А get_object_vars возвращает только public свойства. Разве не элегантно?


https://github.com/TheSidSpears/Students/blob/master/app/classes/StudentValidator.php#L66
> function __construct(Student $s, $container, $id=NULL){
> Почему ты пишешь код валидации в конструкторе? И почему передаешь контейнер? Почитай про DI.
- Я переписал __construct так
$this->table=$table;
$this->validate();
return $this->errors;
потому что этот класс используется только так и никак иначе. Создать, проверить на ошибки, вернуть ошибки. Верно так делать? Это сокращает работу с классом до одной строки: $validErrors=new StudentValidator($student,$this->c['table'],$id);

https://github.com/TheSidSpears/Students/blob/master/app/classes/ViewHelper.php
> тут слишком много всего понамешано.

Понамешано? Я тебя не понял
Аноним 2016/07/21 19:44:48  №802292 320
>>802291
Прошу прощения. Что-то у меня проглючило
Аноним 2016/07/21 19:49:38  №802298 321
>>798277
Кстати, т.к. этот пост был написан раньше, посмею предположить, что ОП его не заметил.

прошу прощение за много сообщений подряд
Аноним 2016/07/21 20:46:06  №802321 322
>>793705 (OP)
Посоны. Учил JS полгода, решил вкатиться заодно в PHP.
Смотрю в основном видосы 2011 года с thenewboston.com, попутно пилю чатик используя php для логина-куков и для ajax-запросов.
Появилось два вопроса:
Не слишком ли я устаревший материал изучаю?
Нормально ли использовать пхп только как веб апи?
Аноним 2016/07/21 21:14:22  №802334 323
>>802321
Не старое, пхп, как и жс - мёртворождённое говно, но даже несмотря на это человечество его использует столько лет, что натворило на этом дерьме почти все интернеты, и будет использовать его ещё больше.
Аноним 2016/07/21 21:14:24  №802335 324
>>802321
>Не слишком ли я устаревший материал изучаю?
php и js маловато будет, нужны фреймворки.
>Нормально ли использовать пхп только как веб апи?
Что это значит?
Аноним 2016/07/21 21:17:01  №802337 325
>>802210
Спасибо анонас, именно то что нужно, в этом опен сервере и отладчик есть, всё по уму. Желаю твоей матери крепкого здоровья и долгих лет жизни.
Аноним 2016/07/21 21:20:27  №802344 326
>>802334
Ясно.
>>802335
>php и js маловато будет, нужны фреймворки.
Оно понятно, на жс я react уже поковырял, но без серверной части ограничен в пилении своих задумок был, а ноду я с первого захода как-то не осилил + из веб-хостингов её не все поддерживают.
>Что это значит?
Что я, возможно, выдумываю терминологию на ходу.
Я имею в виду, что пхп у меня почти только принимает ажакс запросы и отдает жсон, или же принимает жсон и записывает в .тхт файлик, я до баз данных еще не дошел ололо.
Аноним 2016/07/21 22:57:47  №802396 327
>>802334
> как и жс
Ладно пхп

Но чем же заменить жс то?
Аноним 2016/07/21 23:25:06  №802407 328
>>802334
А чего не мертворожденное, я только начал просто. Поясните?
Аноним 2016/07/21 23:56:53  №802423 329
14691346131770.jpg (92, 800x447)
447x800
Аноны помогите пожалуйста учу symfony1.4, по офф. курсу http://symfony.com/legacy/doc/jobeet/1_4/ru?orm=Doctrine и на 15 дне возникла трабла, прописал routing как написано в курсе
affiliate:
class: sfDoctrineRouteCollection
options:
model: JobeetAffiliate
actions: [new, create]
object_actions: { wait: get }

symfony app:routes frontend показывает нужные маршруты
affiliate_new GET /affiliate/new.:sf_format
affiliate_create POST /affiliate.:sf_format
affiliate_wait GET /affiliate/:id/wait.:sf_format
но при обращении в браузере на http://jobeet/frontend_dev.php/affiliate/new ошибка 500 Unable to find a matching route to generate url for params "array ( 'action' => 'index', 'module' => 'affiliate',)".
как решить проблему.
кровь из носа за оставшиеся 5 дней я должен его освоить, помогите пожалуйста.
Аноним 2016/07/22 00:18:49  №802427 330
>>802423
>Аноны помогите пожалуйста учу symfony1.4
>symfony1.4
>1.4
Это что должно случиться в жизни человека, чтоб он себя так не любил?
Аноним 2016/07/22 00:40:59  №802436 331
иди на хуй симфони, убрал из роутинга actions: [new, create] кол.-во маршрутов увеличилось но ошибка пропала, думаю ладно пока аноны не ответили буду работать дальше, дальше по книге мы строим экшены и темплейты для этого модуля, в конце у меня вышла новая ошибка Array to string conversion in D:\OpenServer\domains\sfprojects\jobeet\lib\vendor\symfony\lib\widget\sfWidgetFormSelectCheckbox.class.php on line 102
начал гуглить, так как ошибка была явно не в моем коде, нагуглил вот это http://trac.symfony-project.org/ticket/9985 поправил как там изложено и все заработало, и че то меня дернула опять попробовать роуты из примера, и оно блять заработало, как блять так?! суки!
Аноним 2016/07/22 00:44:12  №802439 332
>>802427
пошел устраиваться на работу джуном, сказали мол у них все пишут на symfony1.4, дали 2 недели на обучение. дали этот учебник, я блять думаю что не спроста они мне дали этот учебник, там у меня уже были приколы где приходилось править файлы фреймворка что бы он коректно работал
Аноним 2016/07/22 02:30:28  №802508 333
Сап программач
Помоги нубу, скажи ЧЯДНТ!
Скинули мне backup сайта и cms и бэкапы баз для них.
Как это запустить на локальной машине?
ОС MacOS X 10.11
вроде настроил apache(на локал хост заходи, папки видит)
Mysql тож вроде настроил
phpmyadmin

я положил в папку которая настроена для localhost этот бэкап, он мне выдает когда захожу туда
Error database: Acces denied for user...

Я пока могу только в верстку. Мне нужно этот бэкап запустить у себя, и понять как натянуть новую верстку на "самописную" CMS на codeIgniter.
Аноны спасайте!
Аноним 2016/07/22 03:19:56  №802516 334
>>802423

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

Алсо, у тебя ошибка не при роутинге. У тебя ошибка при попытке сгенерировать УРЛ, например при выводе шаблона или еще чего-то.
Аноним 2016/07/22 03:21:17  №802517 335
>>802436

Надо делать как я написал выше. Ты вместо того, чтобы найти причину и чему-то научиться пытаешься просто убежать от ошибки. Так не пойдет. На работе ты тоже так же поступать будешь?
Аноним 2016/07/22 09:19:22  №802571 336
Аноним 2016/07/22 09:21:38  №802572 337
>>802439
А город какой? Не ДС-ДС2 же?
Аноним 2016/07/22 10:32:11  №802591 338
>>802508
У тебя в бекапе сайта, среди файлов кодигнайтера должен быть какой-нибудь конфиг файл. Причем не далеко в ядре, а где-то почти на поверхности.
Попробуй в
application/config/config.php

Судя по ошибке, у тебя твои скрипты просто не могут подцепиться к базе, если ты конечно её сложил к себе на локальный mysql сервер, если он у тебя конечно поднят 100%, а не ВРОДЕ БЫ

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

Мануал вот есть вроде, думаю разверешься.

https://www.codeigniter.com/userguide3/database/configuration.html
Аноним 2016/07/22 12:37:22  №802690 339
Защита от csrf-атак с помощью csrf-токена, правильно ли я понял систему:
1.Юзер заходит на сайт - проверить есть ли у юзера кука csrf_token, если нету - сгенерировать и установить
2. Когда юзер отправляет любую форму - взять эту куку и навесить на скрытый инпут либо в гет запрос добавить
3. Обработчик сравнивает полученный токен с тем который установлен у юзера в куках, если == обработать форму
Аноним 2016/07/22 12:42:14  №802697 340
>>802690
И вопрос следом, нужно ли закреплять токен за юзером в базе? По другому я не вижу как это может защитить
Аноним 2016/07/22 17:00:33  №802810 341
Если я защищался от XSS в шаблонах через htmlspecialchars, то использую twig я должен у всех переменных писать |escape?
Аноним 2016/07/22 17:00:59  №802811 342
*используя
Аноним 2016/07/22 17:04:33  №802814 343
>>802810
Или striptags. Что-то не понятно.
Аноним 2016/07/22 17:21:19  №802821 344
В начале лета у меня закончился курс по теории баз данных и основам защиты информации в БД. Посоветуйте какую-нибудь актуальную литературу о SQL-инъекциях всех видов и XSS/CSRF-атаках. А то одни говностатеечки гуглятся.
Аноним 2016/07/22 19:52:47  №802890 345
Аноним 2016/07/22 20:09:02  №802895 346
>>802810
Твиг автоматически защищает от XSS.
Аноним 2016/07/22 20:52:25  №802909 347
>>802697
Думаю в сесси держать достаточно
Аноним 2016/07/22 21:07:57  №802919 348
>>802572
нет, мухастранск
Аноним 2016/07/22 21:08:39  №802921 349
>>802517
если бы я хотел просто убежать, я бы послал все нахер
Аноним 2016/07/22 21:11:41  №802923 350
Конвентирование байтов в мегабайты и дальнейший вывод в шаблон это бизнес-логика или логика отображения?
Аноним 2016/07/22 22:15:42  №802975 351
Это единый тред макак? Похуй, напишу сюда. Короче, мой хуев начальник уже второй месяц заебывает меня чтобы я поднял интернет магазин А я не в зуб ногой в веб программинг, я блядь админ!, посоветуйте движок на котором это говно проще всего поставить? На шаблон бабки дадут, да и хуй с ним
Аноним 2016/07/22 22:20:10  №802981 352
>>793705 (OP)
Вчера ебался с шаблонизаторами, чтобы здоровенные функции PGSQL с похожим кодом в файлы миграций БД в несколько строчек генерировались.
И это пиздец. Шаблонизаторы (которые себя таковыми позиционируют) - нефункциональное говнище. Причём я не говорю о функциях работы с данными, а именно о работе с выводимым текстом - тем во, что шабонизатор должен мочь больше всего. Остановился на Nunjucks и чуть не сгорел от баттхёрта, когда там фильтр функции отступа (просто, блядь, 4 пробела!) сжирал весь текст внутри себя и переменные не присваивались. Причём репорты на ГитХабе висят.

А потом попробовал писать шаблоны прямо таки в php, компиля gulp-ом через 'php -f %файл%'. И это охуенно, аноны! PHP - охуенный шаблонизатор! Минималистичный синтаксис, куча встроенных функций и сторонних библиотек, быстрая скорость компиляции, большое комьюнити.
Не повторяйте моих ошибок, пацаны. Нужно сгенерировать статические файлы с шаблонизатором - берите PHP. 10/10, базарю!
Аноним 2016/07/22 22:20:26  №802982 353
>>802975
>мой хуев начальник уже второй месяц заебывает меня чтобы я поднял интернет магазин А я не в зуб ногой в веб программинг, я блядь админ!, посоветуйте движок на котором это говно проще всего поставить?
Лучше посоветую тебе нахуй послать своего начальника.
Аноним 2016/07/22 22:24:52  №802988 354
>>802982
Тогда меня вероятно уволят, а работу в моих ебенях не так уж и просто найти
Аноним 2016/07/22 22:30:59  №802999 355
>>802975
Проще всего - OpenCart. Он устаревший и плагины ставятся ректальным путём (вообще всё, что не из коробки, ставится ректальным путём), однако своё дело делает. Ставится и настраивается просто.
У клиента на нём уже второй год запиленный мной сайт вертится. Ни одной жалобы, торговля идёт, сайт жив.
Аноним 2016/07/22 22:34:30  №803003 356
>>802999
Трипл так-то не врёт.
Но можно и тупо Wordpress + плагин WooCommerce, там всё проще, а задачу решает точно так же.
Аноним 2016/07/22 22:38:55  №803009 357
>>803003
>>802999
Спасибо, братишки, буду разбираться
Аноним 2016/07/22 23:44:25  №803089 358
>>793705 (OP)
> Далее простая, но полезная задача сделать список студентов...
> простая
> Время: 3-10 дней

Пишу чуть больше двух месяцев(((
Аноним 2016/07/23 00:03:57  №803111 359
14692214374990.png (7, 298x135)
135x298
Анон, помоги мне с задачкой.

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

Табличка с раундами, games:
id level
1465 2
1464 1

Табличками с логами раунда, logs:
game_id score time
1465 21 30
1465 13 20
1465 10 10
1464 10 20
1464 5 10

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

На пике мои натуги. Получилось вытащить максимальное значение раунда для каждого уровня и дальше я чет совсем загрустил. Записей в бд много, несколько миллионов, и с каждой неделей увеличивается еще на миллион.
Аноним 2016/07/23 00:20:06  №803131 360
>>803111
WITH t AS (
SELECT
games.level AS level,
MAX(logs.score) AS score
FROM games
LEFT JOIN logs
ON games.id = logs.game_id
GROUP BY games.level
)
SELECT
t.level,
AVG(score)
...
FROM t
Стоп, я нихуя не понял, но этого тебе должно хватить.
Аноним 2016/07/23 00:37:16  №803149 361
Аноним 2016/07/23 01:44:11  №803187 362
14692274514930.png (14, 338x233)
233x338
>>803111
Сделал, тестировать на проде в ночь на субботу зассал.

Анон, может можно его как-то оптимизировать? Может какие-нибудь индексы создать стоит?
http://paste.ofcode.org/7BMEj8r45QpjB3cFj7X8PP
Аноним 2016/07/23 06:19:09  №803289 363
>>803187
На больших объёмах join всё равно индексы не использует, а других критериев у тебя и нет. Возможно завести индекс по времени логов, или партисипировать таблицу логов по времени, и в запросе указывать границы времени, за которое считать статистику.

При партисипировании можно актуальные логи при держать на быстром хранилище, а старые перемещать в архивное.
Аноним 2016/07/23 07:22:49  №803294 364
14692477695560.jpg (83, 600x678)
678x600
Нашел свой когда-то недописанный вектор, скажите что здесь не так в плане ООП?

Какие есть ошибки в правильности так сказать подхода?

http://ideone.com/99vqwE
Аноним 2016/07/23 08:09:35  №803301 365
Простите, аноны.
Хотели с знакомым заняться веб-проектом. Чтобы он учил js, css, html, а я серверную часть. Если я правильно называю это. Серверная чать - это ведь например RoR, Python + django, PHP? Наверняка эта тема уже обсасывалась много раз, но я не понимаю. Как использовать PHP в сайтах? То есть надо как-то сервер запускать? А как тогда это всё на полноценный хостинг/сайт перенести? Не понимаю. И как сейчас вообще PHP живёт? Не помер надеюсь?
Даже если ничего не получится, то плевать, главное, что тема эта интересна.
Аноним 2016/07/23 09:19:23  №803316 366
ОП, ты как-то упомянул, что можно не прописывать в ручную неймспейсы в проекты, а есть автоподстановщики в IDE. Не могу нагуглить, есть такое для Sublime?
Аноним 2016/07/23 09:20:04  №803317 367
>>803301
С сервером разобрался. Опять же он только локальный, чтобы протестировать работу например php. А как это всё дело на хостинг рандомный занести?
Аноним 2016/07/23 09:51:28  №803322 368
Помогите решить проблему с GitHub, я запутался. Создал новый проект, залил удаленный репозиторий на GitHub. Затем удалил папку из локальной директории, и решил обновить проект, чтобы на удаленном репозитории тоже удалилось, но push возвращает "everything up-to-date" и не хрена не делает, хотя statuse пишет что есть изменения и перечисляет удаленные файлы и папку.

Я погуглил-погуглил и нехрена не понял что делать. Какой есть вариант кроме - удалить нахуй проект с гитхаба и создать заного?

Что я сделал не так, что гитхаб меня так наказывает?
Аноним 2016/07/23 10:10:32  №803327 369
>>803322
>Какой есть вариант кроме - удалить нахуй проект с гитхаба и создать заного?
Закоммитить свои изменения перед пушем.
Аноним 2016/07/23 10:11:40  №803328 370
Аноним 2016/07/23 10:15:01  №803329 371
>>803328
>git add .
Да, если из корня проекта, после этого изменения добавляются в индекс. Потом
git commit -m "Я сотворил неведомую херню"
Твои изменения закоммичены, их можно пушить.
Аноним 2016/07/23 10:50:02  №803335 372
адд не достаточно, и без коммита не запушатся?
Аноним 2016/07/23 10:54:45  №803337 373
>>803335
Пушатся только коммиты. При выполнении git add изменения заносятся в индекс. Индекс - кандидат на коммит, закоммичены будут изменения, внесенные в индекс. Изменения не внесенные в индекс(не добавлены через git add) закоммичены не будут, их нельзя будет пушнуть.
Аноним 2016/07/23 11:56:49  №803353 374
>>803289
>На больших объёмах join всё равно индексы не использует
Шо за хулю я прочитал?
Аноним 2016/07/23 13:01:32  №803388 375
Аноним 2016/07/23 13:28:52  №803410 376
Аноним 2016/07/23 14:33:36  №803442 377
>>803089
Я вот второй день как вкатился, заебался на таблице умножения уже, хочется дропнуть нахуй.
Аноним 2016/07/23 14:48:05  №803471 378
>>803388
Откуда информация о неиспользовании индексов при джойне таблиц с большим числом строк?
Аноним 2016/07/23 15:08:30  №803479 379
Аноним 2016/07/23 15:28:55  №803491 380
14692769352380.jpg (144, 500x689)
689x500
>>798573
А как вызвать класс, если остались только файлы с классами, а мне запрещают писать в них голый пхп код?
Аноним 2016/07/23 16:02:27  №803511 381
14692789475480.jpg (48, 400x400)
400x400
14692789475491.jpg (516, 1134x1135)
1135x1134
Вечер в хату товарищи вебмастера.
Ламповая kоHфepенцNя вордпресс-джиквери-интеграторов нуждается в вашем высоком интеллекте. Сосёмся в дёсны, поясняем за хаскель и функциональщину на самом деле нет, реакты с редуксами, пайтон, джанго, правильный UX и другие никому не нужные вещи. Треш и угар гарантируем. С собой иметь плавки и бальзам Звёздочка.

http://url-cut.ru/539233
Аноним 2016/07/23 16:09:29  №803513 382
14692793698340.png (1268, 2480x3508)
3508x2480
Доброго времени суток, товарищи. Имеется небольшой проект для государственной организации, в которой работаю. На данный момент поднят сервер (Апаче 2.4 + PHP 5.5 + MySQL) на одном из компьютеров внутренней сети, проект лежит и все прекрасно работало. Однако, тетушкам стало пригорать, что скучно работать и в одноклассниках не посидишь, "2016 на дворе! а мы без интернета", как результат нам подключили модемный интернет через телефонную линию (512kbps(!), но не в этом суть). Параллельно руководство заставило поставить специальную учетную программу, работающую через интернет, но сохраняющую локально данные. После чего сервер мой снесли, мотивируя конфликтом этой программы с установленной мною БД MySQL.
К делу:
Купил на собственные деньги недорогой хостинг, и собираюсь переносить свой проект туда. Тем более плюсы есть (доступность 24/7 из любого девайса с интернетом). Проблема в том, что данные, которые будут там храниться, никак не должны попасть случайным лицам. И если раньше все было легко, то как обеспечить безопасность на сервере я никогда даже не задумывался.
Прошу советов мудрых, хинтов, лайфхаков, может быть литературу или статьи в интернете (к сожалению, из-за работы не получается уделять много времени этому хобби, учился по php.net).
Аноним 2016/07/23 16:54:46  №803546 383
>>803513
ты на свои деньги оплачиваешь хостинг для твоей шараги? И ещё за сохранность данных печёшься?
ты понимаешь, до какой степени ты не прав?
Аноним 2016/07/23 17:58:25  №803567 384
>>803513
Не обязательно ведь на локалхосте бд держать.
Аноним 2016/07/23 18:27:55  №803578 385
14692876752380.png (50, 743x424)
424x743
Аноним 2016/07/23 18:32:10  №803580 386
>>803546
Проект - моя инициатива, упорядочивает данные и экономит кучу времени на бумажной волоките. Руководство не волнует как я делаю свою работу, с помощью программ или без, за 8 часов или остаюсь сверхурочно, нужно чтобы все было сделано и в срок. Так что это мне выгодно в первую очередь, остальные все равно ничего не понимают в интернетах дальше одноклассников. Без нее вернусь в дремучие времена, которые даже вспоминать страшно и уволюсь.

>>803567
БД удалили уже (после того как я ее сохранил на флешку), да и я не вижу проблемы использовать БД моего хостинг-провайдера, про безопасность PHP в работе с mysqli уже начал читать.

Буду задавать конкретные вопросы itt, начну вот с чего:
структура папок на хосте выглядит так:
корневой каталог(1)/мой_юзернейм(2)/public_html(3)
папка (3) доступна из интернета, в ней открываются все файлы. Есть ли смысл держать в ней html, css, js и одинфайл php, содержащий строку "<?php include_once '../index.php' ", а всю php-составляющую положить на уровень (2), куда доступа извне нет? Соответственно, просмотреть содержимое файлов (пароли к бд, конфиги) будет нельзя даже если что-то на сервере пойдет не так с php-компилятором.
Аноним 2016/07/23 18:40:50  №803584 387
14692884504570.jpg (48, 400x400)
400x400
14692884504581.jpg (516, 1134x1135)
1135x1134
Вечер в хату товарищи вебмастера.
Ламповая kоHфepенцNя вордпресс-джиквери-интеграторов нуждается в вашем высоком интеллекте. Сосёмся в дёсны, поясняем за хаскель и функциональщину на самом деле нет, реакты с редуксами, пайтон, джанго, правильный UX и другие никому не нужные вещи. Треш и угар гарантируем. С собой иметь плавки и бальзам Звёздочка.

http://url-cut.ru/539233
Аноним 2016/07/23 18:43:02  №803589 388
Аноним 2016/07/23 18:44:06  №803590 389
>>803578
Админ у нас...это просто космос. В прошлый раз он переустановил виндуус не спросив никого и потер ВСЕ данные на компе, получил пизды, но он сын начальника и продолжает работать без образования, рашка такая рашка, да. Он сто процентов заниматься этим не будет.
>секретную базу данных
В том-то и дело, что хранятся там транзакции закупок, договора и другая документация. Конечно, организация у нас не секретная, но я не уверен что имею право размещать эту информацию где-либо, государственная же! Сидеть потом еще. В общем, ты советуешь наладить все внутри и не париться? Эх. Я сам понимаю, что должен такими вещами заниматься профессионал, но блжад их нет у нас.
Аноним 2016/07/23 18:49:00  №803592 390
>>803589
.htaccess - первое, про что я подумал. Но меня остановило наличие аж двух папок вверх по каталогу, и предположил я что они для этого и созданы. (Хотя конечно нет, там хранятся логи, и вообще их использование не моего ума дело, но почему бы не урвать кусочек безопасного места?).
Аноним 2016/07/23 18:50:17  №803596 391
>>803590
Есть права администратора на ПК? Тогда just do it.
Аноним 2016/07/23 19:06:18  №803613 392
>>803580

> Есть ли смысл держать в ней html, css, js и одинфайл php, содержащий строку "<?php include_once '../index.php' ", а всю php-составляющую положить на уровень (2), куда доступа извне нет
Именно так и нужно делать. В публичную папку кладется только то, что предназначено для раздачи.

>>803589

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

>>803590

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

Еще можно попробовать внутри виртуальной машины приложение развернуть если ресурсы позволяют.

>>803580

Вообще, конечно если ты делаешь программу для себя, а не веб-сайт, то ты выбрал не те технологии. Я бы писал на каком-нибудь С# десктопную программу с базой на sqlite. Или, если меня не очень беспокоит производительность, то писал бы программу на яваскрипте и запускал в electron (это штука, пакующая твое яваскрипт-приложение вместе с браузером в виндоуз-приложение).

>>803584

Хватит спамить. Написал один раз и хватит.

>>803491

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

>>803442

Слабак. ты еще даже до кредита не дошел.
Аноним 2016/07/23 19:12:03  №803615 393
>>803301

> Если я правильно называю это. Серверная часть - это ведь например RoR, Python + django, PHP?
Да. И базы данных.

> То есть надо как-то сервер запускать?
Настраиваешь веб-сервер Апач и интерпретатор php и они будут принимать запросы от браузера и запускать твой код.

> А как тогда это всё на полноценный хостинг/сайт перенести?
Копируешь по SFTP. Лучше бы не руками, а написать bash-скрипт, который ты запускаешь и который обновляет сайт.

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

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

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

Для атомарности деплоя надо скриптом создавать новую папку, выгружать туда код, прогревать кеши (если они есть), собирать статику (если есть) , переключать путь к корню сайта в конфиге веб-сервера и затем дть ему сигнал перечитать конфиг. Тогда обновление происходит атомарно и без багов.
Аноним 2016/07/23 19:18:10  №803617 394
>>803316

php companion

>>803289

неправда про большие объемы.

>>803187

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

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

Как тут запрос оптимизировать? Считать раз в час по крону. А если нужно мгновенно обновлять среднее, а не раз в час? Тогда заводим 2 ячейки, в одной храним сумму значений, в другой их количество. Обновляем эти ячейки при каждой вставке в исходную таблицу.
Аноним 2016/07/23 19:20:21  №803618 395
>>803613
>хватит спамить

извини, бес попутал
Аноним 2016/07/23 19:23:59  №803620 396
>>803613
>не те технологии
А я догадывался. Однажды спросил: что легче всего выучить и применить? Мне ответили PHP. ИЧСХ, все так и оказалось, работает же! Но теперь вот такая засада. Спасибо за electron, рассмотрю подробнее, ибо javascript уже использую, а всякие C пугают сложностью тестирования. Конечно десктопное приложение в моем случае идеально подойдет, нужно просто взять себя за яйца и посидеть разобраться. Жаль по образованию далеко от программирования.
Аноним 2016/07/23 19:26:29  №803622 397
>>803187

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

Наверно во внутреннем запросе надо группировать по раундам.

>>803089

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

>>802981

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

> шаблоны прямо таки в php, компиля gulp-ом
Наркоман? зачем тут гульп если можно просто напрямую запустить php или сделать bash скрипт из 1 строки?

>>802923

Логика отображения. Сделай статический метод ViewUtil::formatBytes и вызывай.

>>802909

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

>>802895

Если ему не мешать.

>>802821

А мои статьи не годятся? Отсюда https://github.com/codedokode/pasta/tree/master/security

>>802810

В твиге по умолчанию включено автоэкранирование. Изучи, как оно работает.

>>802697

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

>>802690

Да, верно, только одно дополнение:

> 1.Юзер заходит на сайт - проверить есть ли у юзера кука csrf_token, если нету - сгенерировать и установить
А если есть - то продлить ее жизнь, переустановив

Аноним 2016/07/23 19:28:25  №803623 398
>>803620

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

К вопросу о инкапсуляции Аноним 2016/07/23 19:55:43  №803638 399
// создание новой
$newNews = new News();
$newNews->title = 'Сенсация!';
$newNews->text = 'Текст новости';
// вставка в БД
$mapper->save($newNews);

VS

// создание новой
$newNews = News::create('Сенсация!', 'Текст новости');
// вставка в БД
$mapper->save($newNews);

?
К вопросу об инкапсуляции Аноним 2016/07/23 20:03:50  №803642 400
>>803638

...VS

// создание новой
$newNewsData = [
....'title' => 'Сенсация!',
....'body' => 'Текст новости'
];
$newNews = News::createFromArray($newNewsData);
// вставка в БД
$mapper->save($newNews);
Аноним 2016/07/23 20:04:02  №803643 401
>>803638
а через конструктор почему бы не делать?

$newNews = new News('Сенсация!', 'Текст новости');
Аноним 2016/07/23 20:04:21  №803644 402
>>803638

Второй вариант на практике плохо работает так как свойств обычно много.
Аноним 2016/07/23 20:06:31  №803646 403
>>803642

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

https://msdn.microsoft.com/ru-ru/library/bb397680.aspx

StudentName student4 = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
ID = 116
};

У нас в пхп такого нет, так что приходится использовать массивы. Но в твоем примере массив никакой выгоды не дает.
Аноним 2016/07/23 20:18:54  №803649 404
>>803623
В моем приложении разделенная логика: интерфейс через html+js асинхронно посылает команды на php, который генерирует только json, из которого js рисует таблицы, списки, графику и тп. В общем, путь полной генерации страниц в php я прошел. С ajax-ом намного быстрее, плюс не засоряю мозги и код. Так что скомпилировать гуй в отдельное exe-приложение а не вкладку в браузере будет норм (бывает хромог без плагинов зависает на некрокомпах с антивирусами при открытых 5 вкладках со всякой ерундой)
Аноним 2016/07/23 20:21:09  №803651 405
>>803646
>Но в твоем примере массив никакой выгоды не дает.
Как не дает?
А если у модели со временем появятся новые поля, значение которых надо будет устанавливать в зависимости от значений 'title' и 'body'? С таким массивом нам не потребуется менять код, вызывающий метод News::createFromArray(). А логику установки этих новых полей придется разрулить только в одном месте -- методе News::createFromArray(). Всё.
Причем не обязательно использовать массив:

// создание новой
$newNewsData = new NewsData();
$newNewsData->title = 'Сенсация!';
$newNewsData->body = 'Текст новости';
$newNews = News::createFromArray($newNewsData);
// вставка в БД
$mapper->save($newNews);

Разумеется, в NewsData мы опишем свойства title и body.
Аноним 2016/07/23 20:22:20  №803654 406
>>803651
>createFromArray
createNotFromArray
Аноним 2016/07/23 20:32:41  №803658 407
>>803643
>а через конструктор почему бы не делать?
Чтобы можно было без лишних телодвижений сделать так:

class BreakingNews extends News {}

$newBreakingNews = BreakingNews::create(...);
Аноним 2016/07/23 20:36:14  №803661 408
Аноним 2016/07/23 21:00:44  №803669 409
>>803658
А вообще я наркоманю, и разницы тут нет.
Аноним 2016/07/23 21:55:38  №803699 410
Аноним 2016/07/23 22:04:27  №803707 411
Анонцы, нужна работка макакой в милионнике, за сколько можно осилить пхп чтобы смочь работать за еду 10-15к. Естественно с нуля.
Аноним 2016/07/23 22:55:46  №803726 412
>>803613
>Слабак. ты еще даже до кредита не дошел.
А вот и дойду, бебе бе
Аноним 2016/07/23 23:04:32  №803733 413
Как подцепить к твигу класс со статическими методами? В контейнере же его в контроллер принести нельзя (отпадает смысл статических методов)?
Аноним 2016/07/23 23:08:02  №803735 414
>>801289
Бамп вопросу, может оп не увидел.
Аноним 2016/07/24 00:22:40  №803797 415
>>801289

Любители ноды пишут такие вещи на gulp, любители php пишут самописные скрипты на пхп, любители bash - на баше. Еще в линуксе есть make, который можно задействовать для этой цели (причем, что хорошо, он умеет обновлять только изменившиеся зависимости).

В общем, вариантов много. Самый известный это наверно gulp, но он завязан на ноду (яваскрипт), и на мой взгляд, там довольно уродливый синтаксис. Вообще, мне он не нравится, это выглядит как убогий велосипед в сравнении с make которому уже лет 40.

>>803733

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

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

Плюс костылики: http://stackoverflow.com/questions/6844266/twig-template-engine-using-a-static-function-or-variable

>>803707

6-10 месяцев. Учить придется не только php, но и html css js mysql.

>>803699

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

>>803651

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

$news->setTitle('....');

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

https://msdn.microsoft.com/ru-ru/library/w86s7x04.aspx

Это по сути синтаксический сахар, который позволяет записывать вызов сеттера короче.

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

> А логику установки этих новых полей придется разрулить только в одном месте -- методе News::createFromArray(). Всё.
Нет. Он не решает проблему изменения поля позже.

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

>>803649

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

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

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

> С ajax-ом намного быстрее,
Это надо постраться чтобы на пхп код работал медленнее чем код на пхп + передача данных + рендеринг страницы в яваскрипте.

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

> бывает хромог без плагинов зависает на некрокомпах с антивирусами при открытых 5 вкладках со всякой ерундой)
Это зависит от того, каике сайты открывать. реклама и следящие скрипты могут сильно нагружать браузер. Я как-то смотрел - простая хтмл страница без яваскрипта потребляет довольно мало ресурсов. Хотя Хром да, он потребляет много памяти, я подозреваю они просто кешируют все, что можно в надежде ускорить приложение.
Аноним 2016/07/24 01:53:28  №803853 416
14693144089320.png (38, 1196x763)
763x1196
>>803726
Говорил жи!
Какой же я дебил, пиздос
Аноним 2016/07/24 02:23:31  №803869 417
>>803853
Черт возьми, оказывается нельзя зациклить переменную вне цикла?
https://github.com/applejacky/students/ Аноним 2016/07/24 05:26:25  №803901 418
>>794745

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

https://github.com/applejacky/students/blob/master/dump.sql
> `cookie_token` varchar(100) NOT NULL,
Я бы тут добавил уникальный ключ для защиты от глупых ошибок, например когда туда вставляется пустая строка или что-то такое. И комментарий стоит добавлять, так как назначение поля не очевидно.

https://github.com/applejacky/students/blob/master/util/curl_login_edit_profile.sh
Эта штука мне напоминает тест. Это не тест? Тебе определенно стоит почитать урок про тесты ( https://gist.github.com/codedokode/a455bde7d0748c0a351a ) и открыть для себя codeception - там такие вещи автоматизируются гораздо удобнее.

https://github.com/applejacky/students/tree/master/app/Lib
Здесь не очень удачно положен StudentValidator рядом с фундаментальными классами, лучше бы его в отдельную папку.

https://github.com/applejacky/students/blob/master/app/Lib/StudentValidator.php#L18
StudentMapper было бы удобнее передать как зависимость в конструктор.

https://github.com/applejacky/students/blob/master/app/Lib/StudentValidator.php#L36
Здесь странно что проверки email и пароля делаются только для новых студентов. А что, редактировать email или пароль нельзя? Уж email-то наверно можно? Нет ли тут ошибки, что пользователь может при обновлении передать емайл или пароль и они принимаются без валидации? Хотя конечно метод save() и не сохраняет измененный email, но догадаться об этом не просто.

> "Баллы должны быть в диапазоне между {$this->minRating}-{$this->maxRating} включительно";
> включительно";
А судя по коду - не включительно.

https://github.com/applejacky/students/blob/master/app/Routing/Route.php#L25
> private function routeIsValid
Такой метод лучше сделать статическим так как он вызвается из конструктора когда объект еще не инициализирован и есть риск что кто-то обратится к $this->...

https://github.com/applejacky/students/blob/master/app/Routing/Route.php#L15
> if ($this->routeIsValid($method, $path, $controllerAndAction, $placeholderRegexArray)) {
Зачем тут if если тут нету else и если метод всегда возвращает true?

https://github.com/applejacky/students/blob/master/app/Routing/RouteRequestMatcher.php#L20
Вот здесь вместо замен плейсхолдеров в регулярке конечно было бы правильнее разбиват роут на массив: /a/:b/c/:d -> ['/a/', ':b', '/c/', ':d'] и затем уже из массива собирать регулярку. Это более безопасно.

https://github.com/applejacky/students/blob/master/app/Controller/Controller.php#L22
Вот это плохая штука, ставить так реквайры посередине кода. Лучше делать это где-то в скрипте инициализации.

https://github.com/applejacky/students/blob/master/app/Controller/Controller.php#L45
> public function __get($property)
Вот это вот использование магических методов в контроллере тоже не очень хорошая штука, трудно будет понять откуда там берется свойство. Явное лучше неявного.

В реализации роутов у тебя есть подвох. Параметры роута определяются по порядковым номерам, а не по названиям. То есть можно легко написать в роуте плейсхолдеры /:a/:b/:c, а в контроллере function doSomething($c, $b, $a) и не заметить ошибки. Лучше либо передавать массив именованных плейсхолдеров либо через рефлекшен проверять имена аргументов метода, как это делает Симфони.

https://github.com/applejacky/students/blob/master/app/Controller/AuthController.php
тут мне не нравится, что отдельные функции для GET и POST. зачем? Это лишь приводит к дублированию кода.

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

https://github.com/applejacky/students/blob/master/app/Helper/Auth.php#L72
> private function generateHash($password, $login)
переменная назвается login, но передается в нее почему-то соль.

https://github.com/applejacky/students/blob/master/app/Helper/FlashMessage.php
Такая реализация плохо работает при отправке форм параллельно в нескольких вкладках - имей в виду.

https://github.com/applejacky/students/blob/master/app/Helper/TableHeadBuilder.php#L36
> return sprintf('Указан несуществующий столбец %s', $column);
Тут наверно исключение надо бросать.

https://github.com/applejacky/students/blob/master/app/Database/AbstractMapper.php#L8
> protected static $table;
Лучше делать это через абстрактный метод. А то где гарантия что переопределят имя таблицы?

https://github.com/applejacky/students/blob/master/app/Database/StudentMapper.php#L9
> public static $table = 'students';
Непонятно почему тут public. Это по моему способствует нарушению инкапсуляции работы с таблицей в одном классе.

https://github.com/applejacky/students/blob/master/app/View/errors/500.phtml
Мелочь, но тут может быть XSS при выводе сообщения об ошибке.

https://github.com/applejacky/students/blob/master/app/View/student/index.phtml#L6
> isset($search)
Плохо когда переменная может быть, а может не быть.

Аноним 2016/07/24 06:55:56  №803915 419
>>803615
Теперь разобрался. Спасибо, анон!
Аноним 2016/07/24 08:29:57  №803932 420
Друзья анонимусы, кто скажет, как запилить собственный пхп движок?
Ибо хочется попробовать не просто ковырять всякие PHPNuke или Joomla, а прописать что-то под себя лично.
Вопрос заключается в чём - какой костяк у любого мало-мальски годного движка?
Аноним 2016/07/24 11:41:37  №803980 421
>>803797
Спасибо тебе, видно что разбираешься хорошо во многом. "Это надо постраться чтобы на пхп код работал медленнее чем код на пхп + передача данных + рендеринг страницы в яваскрипте" - самая первая версия включала функцию, которая в цикле делала запросы и вызывала еще функцию, которая тоже делала запросы, в БД. К концу года цикл был в 1000 витков на каждую отправку формы из одного поля. Так что можно. Далее вопросы только по php.
Аноним 2016/07/24 15:05:46  №804123 422
14693619464850.jpg (61, 478x700)
700x478
Привет, анончики! хочу попросить вас пояснить за установку composer. Ставлю его себе на винду. ранее был установлен денвер. при установки из экзешника нужно было ввести путь к файлу php.exe. нашел этот файл в папке денвера, но установка прошла с ошибками. Что делаю не так? что нужно установить? сейчас ничего не пойму.
Аноним 2016/07/24 15:37:21  №804145 423
>>804123
олсо, хочу поставить yii2. уже прочитал документацию, но плохо разрулился с установкой так как composer не установил. Собираюсь поставить себе фремворк на бесплатный хостинг и оттуда уже и работать, прочитал, что это можно сделать по ssh, но мне еще не дал доступ провайдер.
Аноним 2016/07/24 15:58:46  №804170 424
https://github.com/someApprentice/Students

>Далее, нет логики в наследовании хелперов. Вот у тебя есть Helper и есть LoginHelper, который его наследует. Непонятно, а зачем? Там все равно почти все методы статические. Точнее, часть статическая, а часть нет, и почему, непонятно.
>Там все равно почти все методы статические. Точнее, часть статическая, а часть нет, и почему, непонятно.

>>А разве в одном классе все методы должны быть либо статические либо не статические? Почему?

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

>Пример. Допустим мы делаем класс для работы с файлом, имя файла передается в конструктор. Метод "удалить файл" очевидно должен быть нестатическим, так как он работает с объектом, представляющим файл. А вот метод "перевести размер из байтов в мегабайты" логично сделать статическим так как ему в принципе объект не нужен, он всегда одинаково работает, и может вообще использоваться не для файла, а для чего-то еще.
https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Helper.php#L13
https://github.com/someApprentice/Students/blob/master/app/Model/Helper/LoginHelper.php#L55
https://github.com/someApprentice/Students/blob/master/app/Model/Helper/LoginHelper.php#L62

За исключением этих методов у меня был еще один статический метод https://github.com/someApprentice/Students/blob/f35699489413c5b948046ce07f66316d91a2a8b2/app/Model/Helper/Helper.php#L6 (актуальная версия файла на момент замечания) - его я исправил, вынесев его в класс контроллера и обращаясь через $this. Остальные же методы, они, как из примера метода "перевести размер из байтов в мегабайты", всегда будут работать одинакового и им не нужен объект. К тому же, их удобно вызывать в других местах не создавая класс, например здесь https://github.com/someApprentice/Students/blob/master/app/Model/Helper/LoginHelper.php#L37 и здесь https://github.com/someApprentice/Students/blob/master/app/Model/Entity/Student.php#L101-L102
В этом ведь есть логика иметь эти методы статическими?


>>797257
>> Я не правильно написал метод getQuery и не понимаю когда должны вбрасываться исключения?
>Скорее всего неправильно. Все GET параметры приходят от пользователя и могут отсутствовать.
Действительно, я неправильно понимаю зачем нужны исключения, когда они должны вбрасываться и как с ними работать. Я перечитал заново мануал по исключениям, и у меня возникли вопросы, которые почему-то не возникли с самого начала:

>Исключение выбрасывается в случае возникновения нештатной ситуации, когда функция обнаруживает что не способна выполнить свою задачу.
Чтобы вбросить исключение мы должны сначала проверить на эту нештатную ситуацию, т.е. мы должны знать заранее какая нештатная ситуация может быть.
В моем случае (в случае с методом getQuery https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php#L6) нештатная ситуация это то что такой запрос может отсутствовать или не быть скалярным, и соответственно не способна выполнить свою задачу: https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php#L8
В чем я не правильно смотрю на эту ситуацию?

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

Обработать ошибку значит сделать что-то при вбрасывании исключения? Допустим какой-то метод someMethod вбрасывает исключение SomeMethodException, значит где-то в начале программы я должен написать
set_exception_handler(function (SomeMethodException $exception) {
$exception->вывестиОшибкуВЛог();
$exception->вывестиЗаглушку();
...
});


https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L56
Мне не хотелось писать функцию получающую из БД определённое количество отсортированных студентов, т.к. чтобы вызвать её сначала нужно рассчитать значение OFFSET, а не просто создать Pager и передать его в шаблон, и я подумал что можно передать в Pager все записи и получить нужное количество\отсортировать уже внутри него.

https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L72
Чтобы отсортировать студентов с помощью usort мне пришлось spl переводить в массив, а затем снова в spl.

https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L76
https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L100

Сначала я хотел написать аналогичную usort функцию для spl, но потом подумал что ведь можно использовать массив вместо него.
Какие преимущества у spl перед массивом? Я вижу только недостатки в том что его нельзя отсортировать, отфильтровать, пройтись по каждому элементу применив к нему функцию (аналогично array_walk). Придётся писать эти методы с нуля мы уже такое делали.

В мануале написано:
Класс SplObjectStorage предоставляет соответствие объекты-данные или набор объектов, игнорируя данные. Эта двойная цель может быть полезна во многих случаях, включая необходимость уникальной идентификации объектов.
>соответствие объекты-данные или набор объектов
Что это значит? У меня не получилось загуглить.
Уникальная идентификация мне не особо нужна, верно?


https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L81-L87
https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L89-L95
Это же копипаста верно? Я подумал что от неё можно избавиться поменяв результаты возвращаемые анонимной функцией местами:

https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L86

if ($this->queries['by'] == 'asc') {
$n = -1;
} elseif ($this->queries['by'] == 'desc') {
$n = 1;
}

usort($array, function($a, $b) use ($sort, $n) {
if ($a->getProperty($sort) == $b->getProperty($sort)) {
return 0;
}

return ($a->getProperty($sort) < $b->getProperty($sort)) ? $n : $n * (-1);
});

Как можно переименовать переменную $n, чтобы сразу было понятно зачем она нужна?


https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L119
В какую сторону должна указывать стрелка сортировки в ссылке "SAT Scores ↓"? У меня логика такая: Если ссылка ведет на страницу с сортировкой по убыванию, значит и стрелка должна указывать вниз.
Или же нужно сделать чтобы она указывала в ту сторону в которую стоит сортировка в текущий момент на странице?


https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php#L24-L28
https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php#L30-L34
Это тоже копипаста? Я подумал что можно избавиться от неё написав:
if (!$sort = $this->getQuery('sort')) {
$sort = 'satScores';
}

Ведь можно же задавать переменную в условии и тут же её проверять?


https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php#L22
Здесь есть баг: если передать $_GET['sort'] = 'hash' или 'salt', то все записи отсортируются по хешу или соли. Но на практике это ничего не даст - всё равно никак не получится взломать пользователя зная только его позицию в сортировке хешу или соли. Стоит ли исправлять такие баги?


Не пишу ли я переусложненный код? Например в функции getSortLinkBy() https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Pager.php#L107 я сначала пишу $queries = $this->queries, что само по себе выглядит как-то странно, затем ниже еще делаю какие-то, наверно непонятные для других, манипуляции с ней. Но чтобы функция работала именно такие действия нужно совершить: Я не могу в этом методе менять $this->queries['sort'] потому что при генерации новой ссылки всегда будет меняться это свойство, а именно по этому свойству делается сортировка записей, и сортировка делается в конструкторе чтобы не делать её вручную, а просто один раз создать Pager и передать его в шаблон.
Аноним 2016/07/24 16:41:59  №804203 425
>>804145
>поставить себе фремворк на бесплатный хостинг и оттуда уже и работать
Дак и ставь сразу туда, не мучайся с виндой своей
Аноним 2016/07/24 17:10:15  №804221 426
>>803622
>У тебя внутренний подзапрос группирует по level
Неа, по id ака раундам
>>803617
>Как тут запрос оптимизировать? Считать раз в час по крону. А если нужно мгновенно обновлять среднее, а не раз в час? Тогда заводим 2 ячейки, в одной храним сумму значений, в другой их количество. Обновляем эти ячейки при каждой вставке в исходную таблицу.
Спасибо, примерно так и сделал. Тот запрос сутки выполнялся и так и не выполнился, пришлось завести два новых столбика, которые обновляю по крону.
К слову, авг двух полей по около 15ккк записей занимает около 5 секунд, я этим очень доволен. Как сильней разрастется, тоже на крон перевешу.
Аноним 2016/07/24 17:30:46  №804234 427
>>804203
пробовал по ssh, только нет доступа
есть вариант какой-то типа архивом. как вордпресс или кодигнайтер?
не понимаю что за сложности такие с этим yii/
Аноним 2016/07/24 17:50:52  №804260 428
>>804234
Разворачиваешь на хостинге композер, устанавливаешь через него yii, делаешь инит комит и клонируешь его себе на локалку. Потом настраиваешь свою идешку для работы с удаленным сервером и собственно работаешь.
Аноним 2016/07/24 18:02:46  №804269 429
Сап, аноны.

Есть вопрос.

Существует таблица в базе данных, где есть такие поля:

message_id
message_body
message_recipient
user_id

Primary key = message_id
user_id привязан к другой таблице

Если я делаю запрос по типу mysqli_query($link, $query);, то получаю обьект mysqli_result.

Тут начинаются интересности.

Мой запрос - "SELECT * FROM messages WHERE user_id='".$_COOKIE['id']"'"

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

Что делать, анор?
Аноним 2016/07/24 18:22:57  №804288 430
>>804269
перебери его в цикле где ты создаш новый массив в котором будет ключ и значение какие ты захочешь
Аноним 2016/07/24 18:25:45  №804289 431
>>804288
Это я понимаю, но я не понимаю, какую функцию для этого использовать. Пытаюсь делать:

if(isset($_COOKIE['id']))
{
$result = mysqli_query(mysqli_connect("localhost", "project", "1q2w3e", "project"), "SELECT * FROM messages WHERE user_id='".$_COOKIE['id']"'");
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
}

Но это выдает ошибку.
Аноним 2016/07/24 18:31:58  №804300 432
Аноним 2016/07/24 18:33:26  №804302 433
>>804289
WHERE user_id='".$_COOKIE['id']"'"
кажется ты проебался со кавычками
Аноним 2016/07/24 18:34:25  №804305 434
>>804269
Предлагаю такой вариант:

function get_messages_by_userid_as_array(){
&nbsp; &nbsp; $_list = array();

&nbsp; &nbsp; if (!empty($_COOKIE['id'])) {
&nbsp; &nbsp; &nbsp; &nbsp; $_stmt = $mysqli->prepare("SELECT * FROM messages WHERE user_id=?");

&nbsp; &nbsp; &nbsp; &nbsp; $_stmt->bind_param('i', $_COOKIE['id']);

&nbsp; &nbsp; &nbsp; &nbsp; if ( $_stmt->execute() ) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_stmt->bind_result($_message_id, $_message_body, $_message_recipient, $_user_id);

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while ( $_stmt->fetch() ) { $_list[$_message_id] = ['message_body'=>$_message_body, 'message_recipient'=>$_message_recipient, 'user_id'=>$_user_id];}

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_stmt->close();
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; return $_list}
Аноним 2016/07/24 18:36:34  №804306 435
>>804289
и конкатанацию забыл
Аноним 2016/07/24 18:37:49  №804309 436
>>804306
Исправил, сейчас попробую.
Аноним 2016/07/24 18:38:11  №804310 437
Аноним 2016/07/24 18:43:42  №804321 438
>>804305
Рофл, не прошли пробелы. В общем, по вопросу:
1) http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php
для лазанья в бд лучше использовать подготавливаемые выражения.

2) WHERE user_id='".$_COOKIE['id']"'
мне кажется, нельзя доверять $_COOKIE в данном случае и напрямую вставлять его в запрос.

3) Массивы это чудесная вещь - можно вкладывать один в другой сколько угодно. Здесь ты создаешь массив пустым, чтобы не было ошибки; далее ты делаешь выборку из БД и перебираешь по одной все строки, записывая как ключ к $_list значение поля message_id (ключи уникальны), а как данные ключа - остальные поля.
Аноним 2016/07/24 18:58:12  №804347 439
>>804310
в двойные скобки можешь отправлять переменную. тогда и не нужна конкатенация. тем более `` можешь юзать
Аноним 2016/07/24 19:00:54  №804352 440
>>804321

1) Почитаю

2) Можно, работает. Оно достаёт номер пользователя из кук вполне себе спокойно. Это же глобальный массив.
Аноним 2016/07/24 19:01:57  №804353 441
>>804352
>>804321

Я дурак, не особо понял изначально.

Я проверяю куки, соответствует ли айди из кук хэшу, который генерируется при процессе логина.
Аноним 2016/07/24 19:04:06  №804354 442
>>804352
Можно, конечно. Но $_GET, $_POST, $_COOKIE это небезопасные хранилища, так как приходят от пользователя.
Аноним 2016/07/24 19:18:37  №804373 443
>>804347
>>804352

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

>>804321

А еще лучше исользовать PDO. Вот вы тут пишете код с mysqli, а что будет если произойдет какая-то ошибка? В вашем коде она просто игнорируется, никто о ней не узнает. Чтобы ее не пропустить, надо ставить if (и это написано в мануале который вы принципиально не читаете).

PDO в отличие от mysqli умеет выбрасывать исключения при приходе ошибки от базы.
Аноним 2016/07/24 19:27:23  №804381 444
>>804373
Двачую, лучше. Но если накосячить с перехватом этого исключения, вылезет ошибка с логином и паролем, упс.
Аноним 2016/07/24 19:35:31  №804386 445
>>804234

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

>>804170

https://github.com/someApprentice/Students/blob/master/app/Model/Helper/Helper.php
я бы просто тут сделал все методы статическими.

https://github.com/someApprentice/Students/blob/master/app/Model/Helper/LoginHelper.php
Тут со статическими методами все ок, но почему у тебя методы вроде хеширования пароля публичные? Лучше инкапуслировать (скрыть внутри класса) принципы хеширования пароля, а наружу предоставить методы вроде "задать пароль", "проверить пароль". То есть пройдись по своим методами подумай, какие ты выставляешь наружу, а какие являются внутренней логикой класса.

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

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

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

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

А ты кстати смотришь код других анонов? Вот я вчера видел такой подход к авторизации: https://github.com/applejacky/students/blob/master/app/Helper/Auth.php

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

Насчет авторизации - по моему, у тебя там многовато кук ставится. Целых 3 куки. зачем так много?

Одна кука, допустим (id), идентифицирует пользователя
Другая (hash), допустим, аутентифицирует его (то есть подтверждает что это он, а не хакер, подделавший id)

Ну то есть 2 куки - это что-то вроде формы с логином и паролем. Логин идентифицирует, пароль подтверждает подлинность.

Но третья-то зачем?

Более того, так как у нас хеши (в отличие от паролей) уникальные, мы можем и id не использовать, а ограничиваться только 1 кукой с хешем.

> В этом ведь есть логика иметь эти методы статическими?
Да

Аноним 2016/07/24 20:04:04  №804403 446
>>804170

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

То, что в ГЕТ-параметрах что-то отстуствует - это вполне нормальная и ожидаемая ситуация. Мы понимаем, что пользователь может передавать нам любые параметры. И тут вместо исключения лучше бы например выдавать ошибку из серии 4xx.

У меня такая логика: мы не хотим замусоривать логи сообщением, что пользователь не передал какой-то параметр, так как мы это исправить все равно не можем. Значит, лучше предусмотреть такую ситуацию, и выдавать какой-нибудь подходящий HTTP-код из серии 4xx (ошибка пользователя).

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

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

> Обработать ошибку значит сделать что-то при вбрасывании исключения? Допустим какой-то метод someMethod вбрасывает исключение SomeMethodException, значит где-то в начале программы я должен написать
Да, сделать что-то. Поймать исключеие можно либо глобально как в твоем коде, либо локально в каком-то месте кода через tyr/catch

> Мне не хотелось писать функцию получающую из БД определённое количество отсортированных студентов, т.к. чтобы вызвать её сначала нужно рассчитать значение OFFSET, а не просто создать Pager и передать его в шаблон, и я подумал что можно передать в Pager все записи и получить нужное количество\отсортировать уже внутри него.
Это неффективно. Неправильно выбирать из базы 1000 студентов чтобы потом отобрать из них только 10, а 990 выкинуть. зачем? Используй LIMIT и отбирай только тех, кого нужно.

Рассчитать оффсет несложно: offset = (page - 1) * countPerPage

> Чтобы отсортировать студентов с помощью usort мне пришлось spl переводить в массив, а затем снова в spl.
Не проще было изначально тогда в массиве хранить?

> Какие преимущества у spl перед массивом?
Главное преимущество такое: в Spl можно в качестве ключей использовать объекты, в массиве - только строки. Допустим что у нас есть массив объектов (например студентов) и надо каждому сопоставить какое-то значение (например процент вероятности поступления). Мы можем создать SplOS в котором ключом будет студент, а значением - нужное нам число.

Также, использование объектов в ключе позволяет делать быстрые проверки вида "есть ли этот объект в списке". Ну допустим у нас есть огромный список объектов list и надо провеирть, есть ли в нем объект X или нет. В случае массивов мы конечно можем использовать in_array($x, $list. true). Но эта функция делает полный обход массива что имеет сложность O(N), то есть не очень быстро. А вот в SplOS мы делаем проверку через contains(), и поиск по ключу имеет сложность O(1), то есть делается быстро.

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

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

Аноним 2016/07/24 20:33:05  №804434 447
>>804170

> Я вижу только недостатки в том что его нельзя отсортировать, отфильтровать, пройтись по каждому элементу применив к нему функцию (аналогично array_walk)
Вообще, по SplOS можно пройтись циклом foreach так как он реализует специальный интерфейс Iterable: http://php.net/manual/ru/class.splobjectstorage.php

foreach ($spl as $object) {
....
}

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

> соответствие объекты-данные
Это значит что мы можем внести в SplOS объект как ключ, и какие-то данные (число, строку, другой объект) как значение. То есть использовать его как массив с ключами-объектами. И каждому объекту-ключу сопоставить и сохранить произвольное значение, и позже достать его из SplOS.

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

$place = 10;
$spl[$student] = $place;

А позже можно взять это значение:

printf("%s занял %d место\n", $student->name, $spl[$place]);

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

> или набор объектов, игнорируя данные.
Это значит, что в SplOS можно заносить объекты, не привязывая к ним данные. То есть использовать его как структуру аднных Set (множество). Ну например, мы можем сделать 2 множества, множество студентов, которые проходят на математический факультет по баллам, и на физико-технический:

$math = new SplObjectStorage();
$math->attach($student1);

$physics = new SplObjectStorage();
$physics->attach($student1);
$physics->attach($student2);

А потом эффективно (без долгого перебора списка) проверить, есть ли объект в множестве или нет:

if ($math->contains($someStudent)) ....

Ну и может делать какие-то другие операции.

Вообще, в пхп у нас особо нет разных структур данных. У нас есть массивы, которые заменяют сразу несколько структур (Map, Set, Deque, Vector), но в других языках часто эти структуры есть по отдельности. То есть можно создать например Set, можно создать map и тд. Это имеет то преимущество, что мы ограничиваем операции которые можно делать со структурой.

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

https://habrahabr.ru/post/263765/
http://kvodo.ru/data-structures-introduction.html
https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
http://ru.stackoverflow.com/questions/12183/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
https://www.lektorium.tv/course/22823
http://aliev.me/runestone/

Несколько структур данных есть и в пхп:
http://php.net/manual/ru/spl.datastructures.php

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

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

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

Если есть вопросы, задавай.

> Это же копипаста верно? Я подумал что от неё можно избавиться поменяв результаты возвращаемые анонимной функцией местами:

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

Но эффективнее сортировать в базе, а не на стороне приложения.

> Как можно переименовать переменную $n, чтобы сразу было понятно зачем она нужна?
Назвать напримр $direction, или $sortDirection, и добавить комментарий.

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

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

Нагуглил вопрос на SO (англ): http://ux.stackexchange.com/questions/37564/use-up-or-down-arrow-to-represent-sort-ascending-at-table-header

Везде при сортировке по возрастанию треугольник указывает вверх. Видимо он символизирует что сверху маленькие значения, а снизу большие.
Аноним 2016/07/24 20:38:52  №804445 448
>>804170

>https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php#L30-L34
> Это тоже копипаста?
Да это мелочь, можно ничего не делать с ней.

> Здесь есть баг: если передать $_GET['sort'] = 'hash' или 'salt', то все записи отсортируются по хешу или соли. Но на практике это ничего не даст - всё равно никак не получится взломать пользователя зная только его позицию в сортировке хешу или соли. Стоит ли исправлять такие баги?
Можно не исправлять. Хотя лучше бы такого не допускать. В теории злоумышленник может зарегистрировать 100 аккаунтов, и по ним, зная их хеш, оценить чему примерно равен хеш других студентов. Это снижает число вариантов для перебора - примерно в 100 раз, если предположить что хеши генерируются случайно, то 100 аккаунтов разбивают множество хешей на 100 равных частей.

А еще, тут sql инъекции нет? Значения как-то проверяются перед подстановкой в запрос? Или они вообще в базу не идут?

> я сначала пишу $queries = $this->queries,
Ничего страшного. Хуже то, что у тебя нет комментариев перед полем queries и нельзя понять что это значит (из названия "запросы" я ничего не понял).



Аноним 2016/07/24 20:43:13  №804450 449
>>804381

Ну так не косячь и не заывай display_errors на продакшене выключать.

Аноним 2016/07/24 22:11:32  №804545 450
Анончики, посоветуйте что почитать по ООП в пыхе.
Алсо, вот наткнулся на видео https://www.youtube.com/watch?v=w3XUG6oyINI , вроде хвалят мол норм обьяснил парень, я вот сижу смотрю.

Только не изменилось ли кардинально ООП в семёрке?
Аноним 2016/07/24 22:32:04  №804579 451
Аноним 2016/07/24 22:38:56  №804585 452
>>804445
>В теории злоумышленник может зарегистрировать 100 аккаунтов, и по ним, зная их хеш, оценить чему примерно равен хеш других студентов. Это снижает число вариантов для перебора - примерно в 100 раз, если предположить что хеши генерируются случайно, то 100 аккаунтов разбивают множество хешей на 100 равных частей.
Вот тут не понял. Можешь, пожалуйста, разъяснить поподробнее?
Аноним 2016/07/24 22:42:35  №804589 453
14693893557910.png (151, 1948x858)
858x1948
Аноним 2016/07/24 22:52:31  №804597 454
Салам ребят, вот недавно один анон посоветовал сайт https://www.freecodecamp.com/ - вот второй день тестю, уже часов 5 потратил точно, отлично выглядит, объсняет каждую мелочь. А теперь вопрос: этот сайт действительно помогает научиться программированию? Просто я закатился с нуля, поэтому даже не знаю определение "Класс", "Функция" и тому подобные, а тут меня сразу учат хтмлю. И чего еще посоветуете почитать/потренить для изучения языка?
Аноним 2016/07/24 22:55:56  №804602 455
>>804585

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

acc0 0aaaa
acc1 1bbbb
acc2 2cccc
....
acc9 9xxxxx

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

acc1
ivan ivanov
acc2
acc3
acc4
...

Злоумышленник теперь знает, что хеш ivan ivanov находится где-то между 1bbbb и 2cccc. Пространство для перебора сократилось в 10 раз.

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

Но если удастся найти возможность задавать произвольный хеш для аккаунта (например через ошибку в форме регистрации или редактирования) то злоумышленник может методом деления пополам подбирать хеши других пользователей за короткое время.
Аноним 2016/07/24 23:07:55  №804620 456
Аноним 2016/07/25 08:06:26  №804795 457
Решил вкатиться в ит и начать с самого популярного js/php. Сколько времени займет обучение с самого нуля умею писать хеллоу ворлд на пыхп до состояния работаю макакой в днище конторе?
Аноним 2016/07/25 08:53:09  №804803 458
>>804795
ну раз макак то есть опыт, начинай решать задачи из учебника по 2-3 главы в день, что бы въехать в синтаксис и размять мозги алгоритмами, изучай параллельно как взаимодействовать с базой с одной стороны и как с юзером с другой (куки, сессии, формы, гет/пост и прочее) + можешь бутстрап навернуть. Хз, имхо если бы у меня под боком сейчас сидел падаван, я бы ему всё что знаю мпомог бы за 2 недели освоить, а если интенсивно, то и за неделю. Ну а далее мы бы с ним погрязли в ООП и прочих современных подходах к разработке, которые сука сам нихуя не понимаю :(
Аноним 2016/07/25 08:55:50  №804804 459
>>804803
Но это де все можно делать дистанционно?
Аноним 2016/07/25 09:01:32  №804806 460
Аноним 2016/07/25 09:03:20  №804808 461
>>804795
>пыхп до состояния работаю макакой в днище конторе?
Зачем тебе это? Да ты взвоешь после недели ковыряния в говне из Wordpress и Joomla, будешь ненавидеть свою работу, говорю из личного опыта. Куда все спешат? Не лучше ли годик-два поизучать дома, обзавестись знаниями, чтобы твоей квалификации хватало не только говно чистить, но и делать интересные, сложные задачи?
Аноним 2016/07/25 09:08:15  №804809 462
>>804808
Опыт, меня скорее всего отчисляют из ненавистной шараги, а значит я могу вкатиться туда, куда мечтал вкатиться еще года полтора назад, к тому же, даже в самой днище конторе я смогу научиться хоть чему нибудь и заиметь хоть какой то опыт.
Аноним 2016/07/25 09:08:45  №804811 463
>>804806
Этих задачек достаточно чтобы стать джуном?
Аноним 2016/07/25 09:11:48  №804813 464
14694271086810.jpg (1287, 1920x1080)
1080x1920
14694271087081.jpg (152, 724x1024)
1024x724
14694271087112.jpg (84, 736x1226)
1226x736
14694271087133.jpg (11, 186x271)
271x186
Кароче начал читать Зандстру, и чет прихуел. Поначалу всё легко, ну основы я и так знал, но он помог в самом главном, как все ООП-примитивы (конструкторы, наследование) использовать правильно, и как строить простые классы не через жопу, а через геттеры и сеттеры и я наконец понял зачем нужны private & protected и всё такое.

Думал как же хорошо и всё ништяк, и буду ща по 100 страниц в день осваивать, и за недельку в книгу въеду, и буду у мамы молодцом, а хуй там. На 70-й халява кончилась, пошла муть про абстрактные классы и интерфейсы, и тут я завис, просто реально сидел пытался понять в чем суть написанного и зачем это вкручено в примеры кода, которые там приведены, и так НИФИГА И НЕ ПОНЯЛ, блин. Как же сложна то. Надеюсь что сегодня разберусь таки. Параллельно сейчас сяду писать вектор что ли, хоть я его и писал уже год назад >>803294 но сейчас пожалуй решу с 0, что бы хорошо всё закрепить и повторить, ну и решать не отпизды, а используя почерпнутые в книжке знания.
Аноним 2016/07/25 09:14:42  №804814 465
>>804811
Нет конечно, они дают только базовые знания о языке. Тебе нужно будет научится устанавливать и настраивать веб сервер с интерпретатором и базой данных, и на базовом уровне освоить хотя бы один MVC фреймворк, чтобы быть хорошим кандидатом в джуниоры. Вот как сделаешь три задачи из ОП поста (студенты, файлообменник и TestHub), тогда можешь считать себя джуниором.
Аноним 2016/07/25 09:15:17  №804815 466
>>804811
А, я тебя понял. Ты не работаешь в днищеконторе, а только стремишься. Ну кароче пару месяцев займет минимум, в общем прочитай ОП-посты и не спрашивай хуйню. Всё равно придется дохуя работать и писать что бы научиться с 0 МОЧЬ В ВЁБ

Аноним 2016/07/25 09:26:53  №804818 467
>>804450
Алсо мой хостер при любой ошибке кидает 500 Internal server error. Правильный подход или нет? И как они это делают, хз.
Аноним 2016/07/25 09:47:40  №804829 468
Поясните все же как надо реализовать MVC. Вот реально, все до этого изучал со скоростью сверхзвуковой макаки, но с MVC у меня случился факап. Что я делаю не так?
Аноним 2016/07/25 10:13:13  №804835 469
>>804803
как стать твоим юным падаваном? Есть шанс быть зарубленным скайуокером?
Аноним 2016/07/25 10:28:13  №804837 470
>>804835
>как стать твоим юным падаваном?
Материализоваться в моей хате прямо здесь и сейчас со своей пекой/ноутом, что бы мне не приходилось отвлекаться на всякие скайпы и прочее говно, а тупо словами в свободное от своих дел время рассказывать как работают циклы и прочие функции.

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

Прост сядь почитать, попробуй пописать. Не будет для тебя никакого супер-легкого пути волшебного, при котором ты раз и уже джун. Придется всё равно всё освоить и всё проработать, что-то мб меньше, а что-то больше. ОТ себя могу посоветовать не сидеть долго на регулярках из учебника ОП-а, если не получается, а сразу переходить к сложным задачам и попытке сделать свои простейшие вещи.
Аноним 2016/07/25 10:37:23  №804840 471
>>804837
Я просто даже не понимаю с чего начать. Уже неделю наверное у всех выспрашиваю, ктото отвечает про то, что надо начинать изучать базы данных и строение сети интернет, ктото пишет, что нужен html и css, вы советуете php. В итоге какойто анон посоветовал https://www.freecodecamp.com - будет ли с выполнения тамошних заданий профит?
Аноним 2016/07/25 10:46:00  №804841 472
>>804829
>Поясните все же как надо реализовать MVC

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

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

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

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

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

Модель это то, что с базой будет работать в этом случае. И например у неё есть методы: сложить в базу статью, спросить с базы статью, переписать в базе статью на новую.

Вот контроллер такой спросил с модели статью.
$article = Model->getArticle($id);

Ну и вот у тебя есть теперь информация, в виде какого-нибудь массива или объекта, которая нужна пользователю в переменной $article

Ну и ты передаешь её во вьюху, которая по сути является html-каркасом, с заготовленными вставками php-переменных.

Например у тебя во вьюхе будут места

<h1><?=$article->title;?></h1>

<p><?=$article->text;?></p>

и прочие ссылки на картинки и другие статьи.



Вот собственно и всё. ПОСМОТРЕЛИ КОНТРОЛЛЕРОМ ЧТО ЮЗЕР ХОЧЕТ, РЕШИЛИ ДАЕМ ЕМУ ЭТО ИЛИ НЕТ, СПРОСИЛИ ЧЕТ С МОДЕЛИ, ОБРАБОТАЛИ ЕСЛИ НАДО И ПЕРЕДАЛИ ВО ВЬЮХУ, В КОТОРОЙ ВСЁ РАССТАВИЛИ ПО МЕСТАМ.
Аноним 2016/07/25 10:51:54  №804843 473
>>804840
Епт. Начинай со стандартных для любых ЯП конструкций, типа переменных, массивов, циклов, функций и т.п. Эти вещи вообще почти одинаковые во всех Си-подобных языках, можешь вообще любой учебник открыть, там все одно и тоже. Потом ООП учи. Ну а дальше изучай уже конкретно интересную тебе технологию. Ну и конечно же, если ты хочешь в веб, то выучи хотя бы основые html/css, без этого никуда. Почитай еще кстати чем отличается бек-энд от фронт-энда.
Аноним 2016/07/25 10:58:11  №804847 474
>>804841
Т.е. контролер это тот самый index.php выходит? А вью это уже файл, который показывает статьи и прочее?
Аноним 2016/07/25 11:01:05  №804849 475
>>804840
Что бы стать джуном в говноконтору, тебе нужно знать строение любой веб страницы, и что за ней за что отвечает. всякие блоки там, ссылки картинки списки таблицы и прочее.
Это собственно html+css
Можешь сюда сходить если всё лень и попробовать пол дня поизучать основы https://htmlacademy.ru даже регаться не нужно вроде, прост начал и пошел делать одно задание за другим.

Но в современном мире нам не достаточно прост страниц которые написаны на html, понимаешь? Интернет как бы ДИНАМИЧЕСКИЙ, возьмем тот же двач, он постоянно меняется, повяляются новые посты, новые треды, новые картинки и прочее, понимаешь?

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

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

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

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

А задачи начинаются ясен хер с примитивов, ибо сначала нужно научиться писать helol world и складывать числа, а потом уже переходить к умным скриптам, ты бы кстати уже мог пройти 2 главы в учебнике пока тут ищешь легкий путь и выспрашиваешь, как бы тебе не выучить чего лишнего.
Аноним 2016/07/25 11:04:04  №804850 476
>>804849
>Для этого и нужен php, потому что он как раз и делает такие сайты как двач динамическим.
А двачик то на питоне написан, кек.
Аноним 2016/07/25 11:07:15  №804852 477
Аноним 2016/07/25 11:14:50  №804857 478
>>804847
>
В самом примитивном виде наверное зачатки мвц 10 лет назад выглядели так:

файл допустим article.php на который юзер заходил site/article.php

всякие проверки
if ($_GET) {

}

if ($_COOKIE) {

}

include('functions.php'); - некий предок современной модели где были свалены функции

$article = get_article($id); -запрос в самописную функцию которая лежит в нашей "модели"

include('template.php'); - подгружаем шаблон, а он же вьюха в современной интерпритации, в котором расставляем по местам всё и генерируем нашу страницу, которую отдаем юзеру.

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

site/article/add и поподает в метод add, контроллера article

Но в целом общая схема не изменилась

Пусть меня обоссут если что, я не особо прошарен, mvc постигал на кодигнайтере.
Аноним 2016/07/25 11:14:57  №804858 479
>>804841
А можно примеров попроще?
Аноним 2016/07/25 11:18:03  №804860 480
>>804858
Ну это сложный вопрос. Что бы до совсем нубов довести, целые книги блядь по MVC пишут, я же не буду тебе книгу писать тут, задай конкретный вопрос, я тебе постараюсь ответить.
Аноним 2016/07/25 11:19:54  №804863 481
>>804860
Ну хотя бы как примерно это реализовать на примере задачи со студентами.
Аноним 2016/07/25 12:03:23  №804887 482
>>804863
Я сам не знаю как стартануть студентов на pure-php, как я уже говорил, я на примере уже готового фрейморвка знакомился с mvc, и сейчас сам сел за ООП конкретно и сосу в нем БОЛЬШИЕ АБСТРАКТНЫЕ ХУИ >>804813

У меня большие проблемы как стартануть и заткнуть всё с написанием ЯДРА так сказать, и роутинга, поэтому откатился назад и продолжу дрочить другие вещи для лучшего понимания.

Модель в студентах супер-легко

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

Функции нужно реализовать примерно следующие:

....function getStudent($id) {
........тут всё просто, даем функции $id студента, который например зашел на свою страницу, она нам возвращает всю его инфу
....}

Class StudentModel {
....function getStudents($from, $to) {
........эта будет брать с базы несколько студентов, и возвращать нам большой массив с их именами или что там нужно для первой страницы, где будет весь список студентов. Например ты на первой странице списка и тебе нужно вывести с 1 по 10 студентов, соответственно твой контроллер должен передать этой функции аргументы 1 и 10, ну ты понял.
....}

....function addStudent (array $studentData) {
........Эту функцию будет вызывать контроллер когда студент будет регистрироваться и передавать в неё ту инфу которую студент ввел при регистрации, инфу конечно нужно проверить и обработать на каком-то уровне, сама функция еще всё это должна сложить в базу
....}

....function rewriteStudent($id, array $studentData) {
........Опять же, при редактировании, контроллер передает сюда $id студента которого мы собрались редактировать, а так же массив с редактируемыми данными, допустим такой передали array ('age' => 19, 'name' => 'petya'); соответственно функция должна разбирать этот массив на кусочки и перезаписывать в базе поля age и name у студента с id = $id
....}


Со вьюхами всё тоже предельно просто если ты знаешь хоть немного html



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

View->load($viewData, 'studentsList.php');

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

Там например в контроллере собирали массив $data

$data['name'] = $this->students->getStudent($this->id)->name;
$data['surname'] = $this->students->getStudent($this->id)->surname;
...

Потом когда всё собрано писали:

$this->load->view('student.php', $data);

а во вьюхе ты мог в нужные места вставлять <?=$name?> и <?=$surname?>

Охуеваешь попытки осмыслить все эти цепочки и что вообще тут делает $this в каждой строчке, если это обращение к методам/полям объекта в контексте себя? То-то же, представь как мой мозг искалечен этим всем.

Надеюсь тебе поможет это, если что спрашивай еще что-нибудь. Модельные методы можно сделать и умнее, что бы например у тебя была всего 1 функция возврата студентов а не две, и там внутри было условие, с разделением. Так же одна функция может отвечать и за запись в базу и за редактирование, но по мне так лучше.
Аноним 2016/07/25 12:08:17  №804894 483
>>804863
Есть у тебя сайт, есть такой запрос site.com/home/student/4

class FrontController обрабатывает входящий запрос и исходя из этого понимает, что нужно запустить class HomeController и функцию student($id){}

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

Далее ты в контроллере либо запускаешь класс который запускает представление либо просто пишешь так reqiure ('твой файлик php') и каким-то хуем передаешь еще туда и свой обьект и уже в представлении показываешь свойства своего обьекта и человек получает инфу о студенте с таким-то айдишником

это тебе лишь примерно показал пример, очень простой и примитивный, конечно же делать такой запрос тупо как home/student/5 тупо потому что он очень длинный, можешь во фреймворках как -то реализовано

мимо-другой-анон
Аноним 2016/07/25 12:31:34  №804905 484
>>804887
>>804894
А как это в виде файлов реализовать? Это все должно быть в разных скриптах и подключаться по необходимости?
Аноним 2016/07/25 12:47:29  №804924 485
>>804905
Одному классу выдели один файл, да.

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

например в том же игнайтере если ты в контроллере хочешь получить доступ к модели, то можно сначала написать
$this->load->model('ModelName.php');
Ну и ты можешь что-то подобное реализовать у себя в "ядре"

Можешь так же заняться тем, чему ОП будет рад, и написать автолоадер прочитав вот это
http://php.net/manual/ru/language.oop5.autoload.php
http://php.net/manual/ru/function.spl-autoload-register.php
Аноним 2016/07/25 12:54:12  №804937 486
>>804924
>Большинство разработчиков объектно-ориентированных приложений используют такое соглашение именования файлов, в котором каждый класс хранится в отдельно созданном для него файле.
А зачем так делать?
Аноним 2016/07/25 12:58:47  №804941 487
>>804937
Наверное потому что в каком-нибудь проекте большом у тебя не одна моделька, а 100, а еще и не ты 1 работаешь над всеми этими модельками, а например еще 10 ребят. Ну и вот, тип для удобства, поиска класса в файлах.

Опять же что бы просто заинклудить файлик User.php, а не искать модель юзеров в MegaProjectModel.php среди 100500 других классов и всё такое. Наверное корни еще растут губоко в те времена, когда не было систем контроля версий и ты мог затереть чужие правки в файлах.
Аноним 2016/07/25 13:00:16  №804943 488
>>804905
По-моему, ты ООП не понимаешь, а лезешь студентов делать.
Аноним 2016/07/25 13:01:48  №804945 489
>>804843
Я даже понятия не имею где изучить основы. Приведи пример, пожалуйста.
Аноним 2016/07/25 13:03:12  №804947 490
>>804945
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
http://archive-ipq-co.narod.ru/
Аноним 2016/07/25 13:06:23  №804953 491
>>804849
Я ни в коем случае не ищу легких путей, просто два дня одно поизучаешь, потом оказывается что ты учил херню, потом два дня учишь другое, оказывается, ты не знаешь основ языка, учишь третье, в итоге получается херня, так еще и время потрачено. Вот смотри, выучусь я по твоим рекомендациям, и уже есть шанс пойти в говноконтору? Или по крайней мере фриланс?
Аноним 2016/07/25 13:09:02  №804955 492
>>804947
Значит я запутался, просто думал там типичный учебник по конкретным функциям языка, где не объясняются основы программирования. Сори за ебланство
Аноним 2016/07/25 13:14:35  №804959 493
>>804955
так ты обьясни конкретно, что ты хочешь учить, не понятно же нихрена?

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

мимо-другой-анон
Аноним 2016/07/25 13:18:26  №804963 494
>>804959
Ну там ну тип хочу, вот недельку ну тип поебланить и уже джун, что бы потом хуяк-хуяк и уже мидол через год, в общем ничего не делать и всё было, ну там зп 5к$, в японию потом уеду, там говорят всё есть))))

простите
Аноним 2016/07/25 13:19:41  №804964 495
>>804959
Если конкретно, начать с основных основ программирования (что такое массивы, функции и т.д.), потому как вкатываюсь с нуля, после этого изучить html/css/php, по возможности вкатиться в Джаваскрипт, проблема в том, что, я даже не уверен, что именно это мне нужно. В общем, вкатиться в веб-программирование
Аноним 2016/07/25 13:21:27  №804965 496
>>804963
Даун, не? Заранее сказал, что готов учиться столько, сколько нужно, тому, чему нужно, но мне надо узнать что именно учить. Усидчивость есть, с людьми могу хоть неделями не разговаривать, работать и учиться всегда готов. Просто я серьезно не могу разобраться, потому что каждый советует по разному
Аноним 2016/07/25 13:30:03  №804974 497
14694426039840.jpg (61, 425x604)
604x425
14694426039861.jpg (142, 425x630)
630x425
>>804965
>Заранее сказал, что готов учиться столько, сколько нужно, тому, чему нужно...
Я тоже готов каждый день ебать тянку своим 18см болтом, но проблема в том, что у меня тянки нету. А их столько вокруг ходит, что я прост не знаю какую выбрать, ага, хуй знает в общем, они все такие разные, вдруг прогадаю, выебу тянку, а она не та самая, зря время потратил тольк. Продолжу лучше по улице ходить да на тянок смотреть, но не подходить к ним.
Аноним 2016/07/25 13:37:53  №804984 498
>>804964

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

Скажу тебе так начинай с учебника ОПа, а потом по ходу дела разберешься и со временем придет понимание, для меня это тоже было проблемой поначалу.
Аноним 2016/07/25 13:40:29  №804987 499
>>804984
Двачую братишку, веб сука объемная штука. Тут дохуя всего задействованно, что бы обходить костыли устаревших до момента выхода протоколов и эмулировать работу обычных приложений. Надеюсь веб будущего будет куда лучше в этом плане.
Аноним 2016/07/25 14:13:28  №805012 500
>>804964
>Если конкретно, начать с основных основ программирования (что такое массивы, функции и т.д.), потому как вкатываюсь с нуля
Так начинай, лол, в чем проблема?
Аноним 2016/07/25 14:21:23  №805019 501
>>805012
Проблема в избытке информации вокруг.
Аноним 2016/07/25 14:23:07  №805022 502
>>805019
Читай шапку треда, там для старта в пыху более чем достаточно. До момента ООП вообще нихуя сложного. Тем более, что открыв учебник по любому си-подобному ЯП ты найдешь все тоже самое.
Аноним 2016/07/25 14:25:25  №805026 503
Задачка про Айпад в кредит. Не понимаю, почему не выводит расчёт. https://ideone.com/tB0W85
Аноним 2016/07/25 14:26:37  №805028 504
>>805026
> echo "homoCreditTotal: {$homoCreditTotal} руб.\n";
Потому что ты строку выводишь я так понял.
Аноним 2016/07/25 14:26:53  №805029 505
Задача про айпад в кредит. Не понимаю, почему не отображает расчёт. Заранее спасибо.
https://ideone.com/tB0W85
Аноним 2016/07/25 14:28:21  №805032 506
>>805026
>Потому что ты не понял что делают функции и как они работают
Аноним 2016/07/25 14:29:24  №805033 507
>>805026
Алсо твоя функция нихуя не возвращает же.
Попробуей дописать в функции return $homoCreditTotal;
И выводи echo getBalanceInFuture(какие у тебя там значения, ну ты понел);
Аноним 2016/07/25 14:38:34  №805042 508
Аноним 2016/07/25 14:41:18  №805049 509
>>805042
Мог бы и не пожлобиться на коменты, нуфагу, он может и так не понять. Короче слушай - функция должна всегда-то что-то возвращать, иначе она бесполезна.
Аноним 2016/07/25 14:44:34  №805052 510
>>805049
Нет не бесполезна. Функция может и просто эхать что-то на экран. Например целую html страницу готовую, почему бы и нет.

Просто он вызывает функцию внутри самой себя и ничего не ретернит и не понимает о том, что переменные доступные внутри функции и переменные снаруже - это два разных мира :(
Аноним 2016/07/25 14:48:56  №805059 511
>>805052
Разве в нашем учебнике нет ничего про области видимости?
Аноним 2016/07/25 14:52:33  №805069 512
>>805059
Есть там всё, прост он нихуя не понял. Дописал комменты в общем.
Аноним 2016/07/25 14:54:30  №805074 513
>>805069
Стоит еще в коментах дописать, что аргументы это далеко не обязательно какие-то переменные.
Аноним 2016/07/25 14:55:46  №805076 514
>>805074
А что еще? Предлагаешь ему сразу рассказать что можно передать функцию в функцию или что?
Аноним 2016/07/25 15:06:46  №805090 515
>>805076
Чому бы и нет? Будет нуфак знать насколько пыха богата возможностями.
Аноним 2016/07/25 15:13:59  №805097 516
Спасибо, данные появились!
Аноним 2016/07/25 15:14:42  №805098 517
>>805097
Не за что. Читай про области видимости, оче важная тема.
Аноним 2016/07/25 16:49:48  №805203 518
14694545890310.jpg (115, 1000x1011)
1011x1000
Интересно, тут кто-то реально шарящий водится? Он фейспалмит с наших МВС-пояснений или всё ок?
Аноним 2016/07/25 16:55:16  №805206 519
14694549165470.jpg (135, 1037x643)
643x1037
Задачка Анон против Камплюктера.
Интересно, что за удача "ждете" меня сегодня вечером. ) Надеюсь молния не ударит ) Переписал последнюю строку без условия просто else.

Нашел прикольный онлайн интерпретатор
http://codepad.org/M7vtRNPd
Указывает, что за ошибка и в какой строке.
Тупанул с этой задачей )
Аноним 2016/07/25 17:05:32  №805214 520
14694555325950.jpg (15, 1037x46)
46x1037
Объясните плиз зачем здесь фигурные скобки. У меня без них все сработало.
Аноним 2016/07/25 17:07:08  №805216 521
>>805214
Что бы интерпритатор понимал, что в них не строка а код.
Аноним 2016/07/25 17:11:16  №805219 522
>>805206
Привет, аноны. Пишу интернет магаз на yii2 и вот дошел до админки, назрел вопрос. как лучше сделать админку:
1) написать отдельный контроллер Admin?
2) создать директорию в корневой и названием Admin и там писать приложение?
как делать правильно, какие плюсы и минусы?
Аноним 2016/07/25 17:24:57  №805231 523
>>805219
>1) написать отдельный контроллер Admin?
Ну да, звучит разумно. Пишешь новый контроллер, ему делаешь свои вьюхи. По возможности расширяешь модель слегка, что бы можно было делать все то же что и юзер но больше.

>2) создать директорию в корневой и названием Admin и там писать приложение?

То есть хочешь как бы второе приложение написать с доступом к той же базе? Придется энивей копипастить код и модели, так зачем? Разве суть ООП как раз не в расширяемом без копипасты коде?
Аноним 2016/07/25 17:29:58  №805232 524
Аноним 2016/07/25 17:39:23  №805254 525
>>805232
Так ты и не должен по идее их видеть, не?
Аноним 2016/07/25 17:43:19  №805260 526
>>805231
Спасибо, няша. Ты меня доступно убедил)
Аноним 2016/07/25 17:47:18  №805265 527
Сап, аноны. Собираюсь с другом писать разные инернет-магазы и вот решили выбрать движок, с которым мы будем работать, становится в нем джедаем и втюхивать его клиентам. Естественно важна гибкость движка и возможность допиливать на него модули. Сам работал с shop script 5, wordpress, joomla, modx (зарывался в них не глубоко поэтому мнение о движках поверхностное). какой вы подскажите?
Аноним 2016/07/25 17:51:09  №805269 528
>>805254
Данные по 1 циклу показывает, там за 60 тысяч должно быть
Аноним 2016/07/25 17:53:19  №805272 529
>>805265
Опенкарт попробуй а вообще что угодно кроме битрикса
Аноним 2016/07/25 18:08:20  №805292 530
>>805214
>Объясните плиз
Учись сам добывать информацию, у тебя под носом гигантская база знаний.
Допустим, у тебя есть переменная $a, равна она 1. Тогда:
echo "qwe{$a}qwe"; // Выведет "qwe1qwe"
echo "qwe$aqwe"; // Ошибка, так как интерпретатор будет искать переменную $aqwe
Аноним 2016/07/25 18:09:49  №805294 531
>>805272
двачую против битрикса
и вообще против российких коммерческих програмных веб-продуктов
Аноним 2016/07/25 18:37:22  №805314 532
>>805272
>>805272
про опенкарт думали уже, но пака выбираем. Я учту твой совет.
Аноним 2016/07/25 18:46:07  №805318 533
Сап, есть вопрос. Имеется таблица с сообщениями.

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

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


Сама форма + чекбоксы с таблицей:

<tbody>
<form id='checkBox' method='post' target='delete_mail.php'>
<?php
if(isset($_COOKIE['id']))
{
$result = mysqli_query(mysqli_connect("localhost", "login", "password", "database"), "SELECT * FROM messages WHERE user_id='".mysqli_real_escape_string(mysqli_connect('localhost', 'login', 'password', 'database'), $_COOKIE['id'])."'");

if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "<tr><td>Отметить: <input type='checkbox' name='item[]' value='".$row["message_id"]."'></td><td><a data-toggle='popover' title='Текст письма' data-content='".$row["message_body"]."'>" . $row["message_to"]. "</td><td> " . $row["message_subject"]. "</td><td>" . $row["message_date_time"]. "</td></tr>";
}

} else {

echo "<tr><td>0 results</td></tr>";
}
}
?>
</form>
</tbody>
Аноним 2016/07/25 18:48:39  №805322 534
>>805318
Причина кнопки за рамками формы в том, что она портит структуру таблицы.
Аноним 2016/07/25 19:31:06  №805354 535
>>804386
>Зачем нужна инкапсуляция? Ну например если у тебя логика хеширования скрыта внутри класса и ты захочешь поменять ее, тебе достаточно будет поменять только этот класс и не искать, не вызываются ли методы где-то еще.
Но тогда всё равно же придётся искать метод который предоставляем наружу. Если мы поменяем внутреннюю логику метода так, что он будет возвращать свершено другой результат, например заместо строки массив, то метод который мы предоставляем наружу, тоже нужно будет поменять, и для этого нужно так же искать где он вызывается.

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

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

https://github.com/someApprentice/Students/blob/master/app/Model/Entity/Student.php#L8-L16
https://github.com/someApprentice/Students/blob/master/app/Model/Entity/Student.php#L50-L97

Я не могу вспомнить как я научился такому методу. У тебя случайно не было так написано в уроке по DI? Так вообще делают?

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

Еще у этого анона есть такие классы как от Request, Response - мне это тоже не понятно зачем они нужны.

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

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


>>804386
>Насчет авторизации - по моему, у тебя там многовато кук ставится. Целых 3 куки. зачем так много?
>
>Одна кука, допустим (id), идентифицирует пользователя
>Другая (hash), допустим, аутентифицирует его (то есть подтверждает что это он, а не хакер, подделавший id)
>
>Ну то есть 2 куки - это что-то вроде формы с логином и паролем. Логин идентифицирует, пароль подтверждает подлинность.
>
>Но третья-то зачем?
Так токен же, для csrf протекции.
Я тоже сомневался стоит ли её создавать и при регистрации.

>>804434
>Ну например, поставить в соответствие студенту место, которое он занимает в списке лучших по баллам:
>
>$place = 10;
>$spl[$student] = $place;
>
>А позже можно взять это значение:
>
>printf("%s занял %d место\n", $student->name, $spl[$place]);
$spl[$place] вернет NULL. Ты наверно хотел написать $spl[$student] вместо этого?

>>804434
>Это значит, что в SplOS можно заносить объекты, не привязывая к ним данные.
О каких данных здесь может быть речь?

>>804445
>А еще, тут sql инъекции нет? Значения как-то проверяются перед подстановкой в запрос? Или они вообще в базу не идут?
Нет, не идут, но сейчас я буду переделывать используя LIMIT, а не перебирать n студентов. Я уже прочитал новый урок про инъекции и знаю как с этим бороться.
Аноним 2016/07/25 20:00:08  №805381 536
14694660090610.png (14, 1105x179)
179x1105
14694660090621.png (18, 747x268)
268x747
14694660090622.png (10, 639x163)
163x639
Застопарился. Не въезжаю, почему в index.php код
$frontController=new Project\Controllers\FrontController($container);
нормально читается (то есть автозагрузчик composer'а работает нормально), а в container.php строка
45 return new Project\Classes\Authorization($c['table'])
уже выдаёт ошибку
Аноним 2016/07/25 20:07:46  №805397 537
>>803797

Насчет системы публикации скриптов. Можешь объяснить или дать ссылку как это все работает (как например заставить бутстрап попасть в паблик папку)? Гуглю и ничего не понимаю, как-то сложно по сравнению с композером все вручную ставить. Поставил gulp (потому что он вроде в отличии остальных на виндоус и на него хоть что-то в гугле откопал) и завис в туториалах. Это все потом будет в таком файле как у анона https://github.com/foobar1643/filehosting/blob/master/post-install.sh и подцепляться в composer.json?
Аноним 2016/07/25 20:11:55  №805406 538
Аноним 2016/07/25 20:37:02  №805447 539
Не бросайтесь камнями, но не могу решить примитивную задачу. Вроде бы все делал из учебника ОПа, но запускать не хочет. Главный вопрос - где ставить exit?
<?php

error_reporting(-1);

$humanDice1 = mt_rand (1, 6);

$humanDice2 = mt_rand (1, 6);

$compDice1 = mt_rand (1, 6);

$compDice2 = mt_rand (1, 6);

echo "У человека выпало ($humanDice1) и ($humanDice2)\nУ компьютера выпало ($compDice1) и ($compDice2)\n";
$humanSum = ($humanDice1 + $humanDice2);

$compSum = ($compDice1 + $compDice2);

if ($humanSum > $compSum) {
echo "HUMAN WINS!!!";
} elseif ($humanSum < $compSum) {
echo "HUMAN NOT WINS!!!";
} elseif (($humanDice1 == $humanDice2) && ($compDice1 == $compDice2)) {
echo "DABLS!!!";
} else ($humanSum == $compSum) {
echo "HUMAN IS LIKE COMPUTER!!!";
}
Аноним 2016/07/25 20:40:13  №805453 540
>>805447
Понял где проебался, сори за офтоп, помощь ненужна
я знаю ты любишь саблайм Аноним 2016/07/25 21:01:36  №805473 541
14694696965350.png (66, 1439x899)
899x1439
Короче суть такова. Раз я уж решил в кодинг, то надо бы и среду разработки выбрать, правильно? Выбирал между нетбинс, пхпшторм и саблайном. Остановился на последнем, т.к. он самый шустрый. Может кто посоветовать маст-хев плагинов? Кроме автоформатирования пока ничего в голову особо не приходит, может есть еще какие-то интересные фишки?
Аноним 2016/07/25 21:03:18  №805474 542
>>805473
Алсо еще хотел поговорить про цветовые схемы. Недавно читал, что я кобы ЧБ схема меньше грузит глаза, это правда? Кто-то сравнивал по ощущениям, допустим 8 часов работы с черным и 8 часов работы с белым фоном?
Аноним 2016/07/25 21:07:05  №805479 543
>>805474
Я люблю светлые схемки. Но сижу только на чёрной, потому что в код на светлой схеме мне приходится вглядываться. На тёмной код читается сам собой.
Аноним 2016/07/25 21:24:08  №805501 544
>>805397

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

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

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

Вот пример скрипта копирования файлов на bash:

function copyFiles() {
cp -R "[email protected]" public
}

copyFiles vendor/jquery/dist
copyFiles vendor/library/lib.css

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

<?php

$rootDir = ....;
$sources = [
$rootDir . '/vendor/jquery/dist/',
$rootDir . '/vendor/library/lib.js'
];

foreach ($sources as $source) {
copyToPublicDir($source);
}

Примеры скриптов на make или gulp ты можешь попробовать написать сам, почитав мануалы и туториалы к ним.

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

Имея скрипт публикации, ты можешь вызывать его в любой момент чтобы скопировать статичесские файлы. Также ты можешь прописать его вызов в composer.json, чтобы он вызывался после установки или обновления зависимостей: https://getcomposer.org/doc/articles/scripts.md (англ, при желании наверно можно найти и русскую статью).

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

Уточни, что именно тебе непонятно.

> Можешь объяснить или дать ссылку как это все работает (как например заставить бутстрап попасть в паблик папку)?
Либо написать скрипт руками либо настроить gulp или make. Я бы написал руками так как случай тривиальный и я знаю bash.

> Это все потом будет в таком файле как у анона https://github.com/foobar1643/filehosting/blob/master/post-install.sh и подцепляться в composer.json?
да, но для разворачивания твоего проекта надо будет сначала поставить ноду и gulp. На линуксе впрочем это недолго.

Пример у анона - как раз самописный скрипт на bash.

> и завис в туториалах.
Ну нужно знание яваскрипта и хотя бы базовые представления о среде Node.JS.

Аноним 2016/07/25 21:40:18  №805519 545
>>805381

Скорее всего Project... отсчитывается от текущего неймспейса и надо писать \Project\.... Либо автозагрузчик еще не подключен. Либо опечатка в имени класса.

Ты можешь попробовать отдебажить ситуацию, натыкав echo или var_dump в autoload.php

>>805318

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

>>805214

Мануал http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

>>805219

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

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

https://yiiframework.com.ua/ru/doc/guide/2/structure-modules/
http://www.yiiframework.com/doc-2.0/guide-structure-modules.html

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

Я бы делал через модули.

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

>>805231

Модули есть в Юи 2.

>>805206

Может удача в том, что ты решишь задачу про кредит с первого раза? Это редкость.

>>805019

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

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

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

>>804955

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

>>804943

Может он знает, просто что-то напутал. Но конечно перед студентами Вектор надо бы решить.
Аноним 2016/07/25 21:52:10  №805532 546
>>804937

Чтобы:

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

Если не делать стандартов вроде PSr-4 то каждый будет делать по-своему и будет бардак. А у меня есть как раз урок по нему: https://github.com/codedokode/pasta/blob/master/php/autoload.md

Правило один класс = один файл также нужно чтобы не было гигантских файлов с которыми неудобно работать.

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

>>804941

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

> а не искать модель юзеров в MegaProjectModel.php среди 100500 других классов
Правило: каждый класс в отдельном файле. Ничего искать не придется, если соблюдать PSR-4 то имя файла определяется именем класса. И в MegaProjectModel.php может быть только класс MegaProjectModel и ничего больше.

>>804905

А ты читал комментарии к задаче про студентов? Там много чего написано и про MVC в том числе.

>>804863

А комментарии к задаче читал?

>>804858

MVC это разделение кода на 3 части. https://github.com/codedokode/pasta/blob/master/student-list.md#mvc

>>804847

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

>>804840

С учебника в ОП посте либо с HTML/CSS. По которым у нас тоже есть задания в ОП посте.

Аноним 2016/07/25 21:55:42  №805537 547
>>805474

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

Установить советую php companion для работы с неймспейсами.

У меня такие плагины: php-twig, docblockr (вставляет doc комментарии), emmet (для html кода), jshint gutter или как-то так, который умеет проверять синтаксис и находить сомнительные места в js коде.

Аноним 2016/07/25 22:34:29  №805558 548
Решил я поиграться немного с типами данных в пхп:
http://ideone.com/9aVD5D
Так вот, объясните нуфагу, а почему оно так? Почему что бы я не делал, пхп все сводит к числам? Зачем оно так? Разве не логично, что строки и числа нельзя сравнивать?
Аноним 2016/07/26 00:07:09  №805632 549
14694808297110.png (7, 881x55)
55x881
>>805519
> Ты можешь попробовать отдебажить ситуацию, натыкав echo или var_dump в autoload.php

Какие-то чудеса. Одинаковые на вид строки оказываются не одинаковыми и дают разный результат. Пока не пойму как такое возможно
Аноним 2016/07/26 00:28:13  №805643 550
>>805558
Если в строке первой идет число, то php при арифметических операция остальное обрезает и считает за число. Если первой идет буква, то дальше за строку считает, независимо от того, сколько там цифр дальше. Если надо как строки добавлять, используй . оператор, + для чисел же.
Аноним 2016/07/26 08:05:55  №805707 551
http://ideone.com/wRIQ5E

Уже семь часов это насилую. Уже не понимаю как убрать "озвучку" нулей в единичных числах (пятьсот сорок ноль тысяч)
Что за функцию в целов, стоит учить дальше? Я безнадежен
Аноним 2016/07/26 08:09:53  №805708 552
Что-то я совсем не понимаю как сделать задачу с генератором имён по слогам. Вроде бы и понимаю, как рандомный элемент с массива вытащить, но как-то не понимаю. Может подскажет кто?
Аноним 2016/07/26 08:18:04  №805710 553
>>805708
Что именно ты не понимаешь? У тебя есть массив
[a, b, c, d, e, f, g]
Ты можешь сделать так что бы у тебя случайный набор из этих букв сгенерировался?

Берешь случайный элемент массива, потом еще один, потом еще один и так столько раз сколько тебе нужно
Аноним 2016/07/26 08:23:50  №805711 554
>>805708
А, ладно. Набыдлокодил всё таки. Спасибо за внимание!
Аноним 2016/07/26 08:24:15  №805712 555
>>805710
Да, я понял. Спасибо.
Аноним 2016/07/26 09:26:30  №805733 556
>>805708
Вот так получилось.
http://ideone.com/xjzGHH
Чёт мне уже страшно с этого языка. Особенно с преобразованием первого символа в заглавный.
Наверное я чего-то не понимаю.
Аноним 2016/07/26 09:35:45  №805737 557
>>805733
И что тебя смущает? Вроде бы всё правильно сделал. Тут же главное в голове придумать алгоритм из зарание доступных тебе кирпичиков, а потом его в языке воплотить, и всё собственно.

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

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

Ты сделал еще лучше, без дополнительных лишних отрезов и склеиваний, пока смотрел на твою http://php.net/manual/ru/function.mb-convert-case.php функцию в мануале еще одну увидел интересную
http://php.net/manual/ru/function.ucfirst.php
Если она поддерживает кирилицу, то можно через неё делать и не париться.
Аноним 2016/07/26 09:44:56  №805740 558
>>805737
Я попробую. Спасибо.
Аноним 2016/07/26 10:22:05  №805753 559
>>805632

Ты там русскую букву вместо латинской не вставил? Можно проверить программой-опечаточником если она у тебя еще есть.

>>805558

В php7 вроде исправлили проблему с "10 котят" - это будет выдавать варнинг. Само преобразование нужно так как часто данные, пришедшие от пользователя (в $_GET), из файла, базы данных, представлены в виде строк и без этого надо было бы делать явные преобразования.

>>805643

До php7, даже если там нет чисел, php приведет строку к числу 0: 100 + "test" => 100

>>805707

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

>>805733

> $name = mb_convert_case($name, MB_CASE_TITLE, "UTF-8");
Эта штука у тебя стоит внутри цикла и поому будет выполнена 4 раза. По логике, преобразование надо делать только 1 раз, значит команду надо ставить после цикла.

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

>>805737

ucfirst не поддерживает utf8.
Аноним 2016/07/26 13:17:03  №805857 560
Поясните за абстрактные классы.

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

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

Например нужен нам класс управляющий, который будет наводить движуху в нашем приложении. Почему не сделать его абстрактным? Он будет просто то-то проверять и вызывать. В нем и не нужно ничего кроме методов. А описывать такой класс как обычный что бы в коде потом была нахер не нужная, но при этом как бы необходимая строчка:
$engine = new Engine;

просто что бы иметь возможность запустить движуху:
$engine->run();


Вместо простой и понятной

Engine::run();
Аноним 2016/07/26 13:36:11  №805870 561
>>805857
>Почему не сделать его абстрактным?
Ну тип короч абстрактный как бы подразумевает ёпта, что тип от него короч как бы обязательно тип наследников создавать, короче без них тип абстрактный класс нахер не нужен. Более того, абстрактный класс тип существует только ради наследников.

>Вместо простой и понятной Engine::run();
Это почти то же, что и обычная функция. Ты тянешь процедурное мышление в ООП. Попробуй почитать пасту ОПа про DI, есть в репозитории pasta.
Аноним 2016/07/26 14:19:21  №805903 562
>>805870
Да я и пытаюсь въехать. Я понимаю у нас тут ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ как бы, но всё же, зачем доводить до абсолюта? Если мне и не нужен в каком-то месте сам объект, то нахуя его плодить?
Аноним 2016/07/26 14:40:59  №805916 563
Ребят, а у нас там тайп хинты ввели уже или как?

Мы
Аноним 2016/07/26 15:08:57  №805936 564
>>805916
Классов - уже лет 7+ как (Было вроде ещё в PHP5). Проверка скалярных типов (int, string, bool и т.д) есть в PHP7

Чего ты не гуглишь?
Аноним 2016/07/26 15:11:50  №805940 565
>>805936
Я просто где-то что-то слышал, и было много разговоров и прочего, а чет в итоге http://php.net/manual/ru/language.oop5.typehinting.php
и нихуя.

>есть в PHP7
Так есть или будет? php7 уже релизнулась или нет? Почему в доках написано PHP 5.6.24 is released
Аноним 2016/07/26 15:16:29  №805945 566
http://ideone.com/ePH9Ab
>["b":"Question":private]=>
Зачем мне это????
Пиздец как сбивает с толку.
Аноним 2016/07/26 15:26:42  №805954 567
>>805501
Сейчас попробую на пхп написать. А баш он на линукс, да?
Аноним 2016/07/26 15:28:44  №805958 568
>>805954
А то у меня шиндоус.
Аноним 2016/07/26 16:25:15  №805998 569
>>805940
>Почему в доках написано PHP 5.6.24 is released
Потому, что тебе лень проскроллить страницу вниз.
Параллельно несколько веток у PHP выпускается.
Аноним 2016/07/26 16:47:57  №806026 570
Приступил к задаче из ОП-поста на мини файло обменник. В связи с этим у меня возникло несколько очень тупых вопросов. Первый и самый главный: зачем мне использовать фремворк, что это такое, что оно мне даст? На нем же ебаный хелло ворлд занимает 10 строк.
Аноним 2016/07/26 18:10:25  №806093 571
14695458253080.png (6, 453x205)
205x453
То есть то что я пишу - абсолютно нормально?

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

Аноним 2016/07/26 18:16:55  №806102 572
>>805954
https://ideone.com/NCoM6P вот, зацени мой велосипед. Если таки все хорошо (что маловероятно, так как наверняка можно было обойтись без вложенного фоича через рекурсивные итераторы, но я не нашел на stackoverflow как заставить прочитать вложенные папки), то куда его положить этот класс? В хелперы?
Аноним 2016/07/26 18:17:52  №806107 573
>>806102
> как заставить прочитать вложенные папки

Не так сказал. Короче я нагуглил много советов, если ссылка на папку одна, а у меня массив ссылок. В документации вообще без примеров.
Аноним 2016/07/26 18:24:29  №806115 574
Поясните за инкапсуляцию. Есть какие-то универсальные примеры, правила когда и как это нужно делать?
Аноним 2016/07/26 18:29:10  №806124 575
>>806107
Хех, оно еще и не работает, чтож так сложно-то. Там как-то с объектом композера надо взаимодействовать наверное, да?
Аноним 2016/07/26 18:29:32  №806127 576
14695469721120.jpg (141, 1136x483)
483x1136
>>806124
Забыл пикрелейтед
Аноним 2016/07/26 18:38:40  №806137 577
>>806127
А если ты просто в консоли напишешь ./postInstall.php, то у тебя ведь ничего не заработает, верно? Нужно было ставить Linux.
Вообще, команда ./script обозначает "запустить скрипт из текущей директории с помощью интерпретатора, путь к которому указан в первой строке скрипта после #!". Это для Bash, насчёт других шеллов не знаю. Например, у меня интерпретатор PHP имеет абсолютный путь /usr/bin/php, поэтому я бы указал в качестве первой строки #!/usr/bin/php, Bash бы всё понял и запустил скрипт.

Короче, попробуй запустить скрипт из консоли, если у тебя путь к интерпретатору PHP есть в переменной окружения PATH, то команда "php path/to/script.php" должна заработать. Если заработает - то эту команду и пихай в конфиг композера.
Аноним 2016/07/26 18:40:34  №806141 578
14695476346780.png (38, 1066x759)
759x1066
>>806115
>Ошибка постинга: В сообщении присутствует слово из спам листа.

Скажи спасибо абу, и мучайся читая с картинки ту хуйню кароче
Аноним 2016/07/26 18:42:25  №806144 579
>>806102
Блин, я растяпа, еще все библиотеки перемешал в одних папках.

>>806137
Ок, попробую
Аноним 2016/07/26 18:46:00  №806150 580
>>806141
Ну я в принципе так и понял что такое инкапсуляция. Короче, насколько я соображаю, на производительность кода это не влияет, только на безопасность, не? ООП учу второй день, если что. Алсо, все фишки ООП в других языках выглядят так же, как и в пхп?
Ну и еще вопрос - а зачем нужны интерфейсы? Это типа на начальном этапе разработки их делают как наброски, а потом имплементируют?
Аноним 2016/07/26 18:53:50  №806164 581
>>806150
Прости, больше я ебе помочь не могу, я сам учу ООП 3 месяца но не продвинулся дальше тебя. Про другие языки я не скажу, а про интерфейсы нихуя не понял сам :(
Аноним 2016/07/26 18:57:57  №806170 582
>>806150
Ну нужны тебе интерфейсы, раз второй день учишь. Я понял зачем они нужны только тогда, когда прочитал о инверсии зависимостей.
Аноним 2016/07/26 19:14:24  №806189 583
>>806127
И ещё:
1) Зачем в скрипте ООП? Простые одноразовые вещи нужно реализовывать просто, а не тянуть избыточные абстракции.
2) В твоём случае можно создать bat-скрипт. Считай, что это как Bash-скрипт, только очень ограниченный и под винду. Запускается тоже в консоли.
Тебе нужно просто нагуглить команды для копирования файла и папки в bat-скрипте.
Например, так копируется папка: http://stackoverflow.com/questions/4601161/copying-all-contents-of-folder-to-another-folder-using-batch-file
Аноним 2016/07/26 19:29:16  №806205 584
Я тут конечно еще со вчера нащитпостил, но все же. Анончики, я вот тут решил вообще почитать за житуху веб-погромирования, бэк-энда и такого всего. И вот что меня интересует - чем вообще веб-кодинг на других языках(питон, руби, node.js, asp.net, возможно еще что) отличается от пхп? Почему сторонники этих языков смотрят на пхп как на говно? Почему именно пхп самый популярный в веб-программировании? Правда ли что он сильно устаревает и скоро станет нинужен как перл?
Аноним 2016/07/26 19:33:28  №806208 585
>>806093
бамп. Ну ответьте же, сидите тут рассуждаете об инверсии зависимостей, шарите явно больше меня и всё такое. Это важно для меня.
Аноним 2016/07/26 19:40:16  №806213 586
>>806208
По идее ты должен в абстрактном классе задать какие-то функции, которые обязательно надо реализовать в наследниках. Вроде как это и есть суть абстрактных классов.
Аноним 2016/07/26 19:44:26  №806216 587
>>806213
Но если я не хочу переопределять в наследниках ничего кроме полей. Да и разве стуь не в том, что бы ОТ НЕГО НАСЛЕДОВАТЬСЯ
Аноним 2016/07/26 19:45:48  №806217 588
>>806208
Если у всех наследников Worker'а есть какой-то метод с одним и тем же названием, но реализовывать его нужно по-разному для разных наследников, то делай этот метод абстрактным и переопределяй в наследниках. PHP не обязывает тебя добавлять в абстрактные классы абстрактные методы, хотя по моему диванному мнению так было бы наглядней. Есть абстрактные методы - делаем класс абстрактным, нет - делаем просто базовым, от которого наследуемся.

>>806216
Что значит "переопределить поле"?
Аноним 2016/07/26 19:46:03  №806218 589
>>806216
Мне кажется, таким как мы с тобой пока лучше не ебать себе мозги всякими абстракциями да интерфейсами, а лучше просто пытаться в ООП кодинг на практике. Авось потом само дойдет.
Аноним 2016/07/26 20:16:54  №806238 590
14695534150260.png (34, 606x890)
890x606
>>806217
Так у меня в наследниках только поля отлечаются, а методы устраивают одинаковые для всех.

>>806218
Не ну я и пытаюсь понять надо что-то или нет на таких примерах

Кароче вот классы работников тип. Всё норм наописывал?
Аноним 2016/07/26 20:28:21  №806243 591
>>806238
Опять же я пишу в классе
worker такие поля как salary, coffe
хотя мог бы и не писать по идее, ведь они как бы все переопределяются в наследниках, но у меня в классе worker есть методы, которые как бы обращаются к этим полям, и если эти поля не писать в самом классе, то правильно ли тогда в классе иметь поля, которых нет в классе, но которые есть в наследниках???
Аноним 2016/07/26 20:41:42  №806252 592
Аноны, вы наверно видели много статей где критикуется MySQL и восхваляется PostgresQL. Мир IT - он такой, люди часто делают выводы не из сравнения преимуществ и недостатков, а из того что написал популярный блогер. Точно также вы можете услышать что один популярный язык программирования на самом деле плохой и всем надо писать на никому не известном языке с кучей математических абстракций.

А сегодня я прочел о том, что Uber переходит с postgres на mysql. Так-то!

https://eng.uber.com/mysql-migration/

Что касается PostgresQL, я считаю что это хороший проект, у него много интересных фич и конечно стоит его изучать. И для многих проектов это будет хороший выбор. Но когда дело доходит до сложных высоконагруженных проектов, приходится делать выбор, тщательно взвешивая все особенности продукта, а не доверяясь мнениям популярных блогеров.
Аноним 2016/07/26 20:56:25  №806266 593
>>806252
Мне кажется, на этой доске точно нет людей которые могли бы раскидать это все по полочкам.
Аноним 2016/07/26 21:51:23  №806336 594
Аноним 2016/07/26 21:55:12  №806346 595
>>806336
Ух тыж какой умник, сразу и бутсрап, и жиквери. А если серьезно - ты уверен, что на этом респурсе именно так и делают линк на таблицу стилей?
Аноним 2016/07/26 21:59:11  №806348 596
>>806336
Понятно, нельзя именовать айди #1but только #but1
Аноним 2016/07/26 22:00:03  №806350 597
>>806336

Разве можно идентификаторы в css начинать с цифры?

https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier

> In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F".

> they cannot start with a digit
Аноним 2016/07/26 22:01:02  №806353 598
>>806346
Типа надо что-то одно - или бутстрап или жыкерри? Я не умник, я только вкатываюсь.
Аноним 2016/07/26 22:01:27  №806354 599
Аноним 2016/07/26 22:02:02  №806357 600
>>806346
Подозреваю что это он freecodecamp проходит, там бутстрапу сразу учат.
Аноним 2016/07/26 22:04:22  №806358 601
Аноним 2016/07/26 22:19:08  №806380 602
>>806353
Ну как тебе сказать. Если сходу лезть во фреймворки, то ты не язык сам учишь, а модули к нему. Я бы посоветовал тебе дропнуть эти курсы.
Аноним 2016/07/26 22:33:06  №806392 603
>>806353

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

У нас кстати в ОП-посте есть задачи и по CSS и по JS по которым ты можешь оценить свой уровень и которые ты бы мог решать параллельно с другими курсами. мы проверим решения и дадим подсказки если что-то непонятно.
Аноним 2016/07/26 22:34:54  №806393 604
>>806392
>jquery
Чет в последнее время я все чаще и чаще слышу мнение от js-кодеров, что жикверы говно и быдлокод. Есть тут кто шарит тему?
Аноним 2016/07/26 22:44:55  №806402 605
14695622953170.png (22, 640x113)
113x640
>>806393
Вот у тех, кто говорит, и спроси. Если высокоуровневый инструмент попадает в руки неопытного, то некачественный код на выходе - не вина высокоуровнего инструмента. Что делать? Изучать низкоуровневые вещи, чтобы не было пикрилейтед.
Аноним 2016/07/26 22:45:02  №806404 606
>>806393

У ОПа есть. jQuery полезная библиотека, которая содержит много нужных в повседневном использовании функций. Но у нее есть и недостатки:

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

Ну и многие из тех верстальщиков, кто пишет код на джейквери не знает толком ни яваскрипта ни самой джейквери, возможно отсюда и складывается такое впечатление.
Аноним 2016/07/26 22:56:27  №806415 607
Сеттеры - не для свойств. Они для состояний. Так-то!

!!!
!!
!
Аноним 2016/07/26 22:59:10  №806421 608
>>806415
...Речь о сеттерах в модельках-сущностях.

!!!
!!
!
Аноним 2016/07/27 00:00:16  №806484 609
>>805753
> Ты там русскую букву вместо латинской не вставил?

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

ОП, ответь на вот эти вопросы >>798277 а то я уже не знаю, что мне еще править
Аноним 2016/07/27 00:02:31  №806485 610
>>806484
Поищи тогда плагины для spellchecking'а, чтобы такие глупости не отнимали много времени. Не ОП.
Аноним 2016/07/27 00:37:01  №806518 611
http://ideone.com/KmOfh4

Калькулятор.
Стоит ли потом после прочтения ооп возвращаться и переписывать калькулятор(Как в учебнике с ооп и скобками) для того чтоб получше въехать(Или это будет невыполнимо для новичка?)
Аноним 2016/07/27 01:00:03  №806537 612
Аноны, кто подскажет? учу сейчас yii2, и хочу создать свой собственный контроллер, но хоть убей ничего не выходит, даже если скопировать дефолтный и поменять название файли и класса все равно выдает китайские иероглифы. знаю что где-то проебался и что-то не учел вот только не пойму где? может в controllerMap или типа того?
Аноним 2016/07/27 01:03:12  №806539 613
>>806537
в документации нашел, что нужно задавать в пространство имен контроллеров, нашел переменную в документации , но где мне искать ее в своих файлах, или мне добавлять динамически?
Аноним 2016/07/27 04:24:00  №806587 614
>>798277

> Мне на самом деле эта строка нужна была, чтобы указать в какой папке вью. Если заменю "view": "status/register_ok" на "folder": "status" - будет норм?

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

И зачем тебе эти шаблоны? Почему бы при успешной регистрации не редиректить например на список студентов и выводить там уведомление над списком?

> - В чём заключается непонятность структуры? Ты предлагаешь делать методы типа getDBLogin(), getDBPass() и т.д. или как?
Я имел в виду, раз у тебя есть класс для чтения конфига, можно было бы возвращать объект этого класса. И например получать значения через $config->get('db.login')

Можно и массив конечно.

> проверь контроллер
В общем, стало лучше.

> $isAuthorized=$this->c['isAuthorized'];
Вот это мне кажется странным, по идее контейнер для хранения каких-то не привязанных к текущему запросу вещей. У тебя есть сервис авторизации - это надо у него выяснять, залогинен пользователь или нет.

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

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

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

> $find=isset($_GET['find']) ? $_GET['find'] : NULL;
Надежнее писать strval($GET[...]) на случай если передадут массив например

Еще мне у тебя не нравится неймспейс Project\Classes - тут целых 2 слова которые не несут никакого смысла. По идее должно быть что-то вроде StudentList\???. ЧТо написать вместо Classes - трудно сказать, может просто класть тогда классы на 1 папку выше чтобы было app/Validator.php ?

> foreach ($_POST as $post) {$post=trim(strval($post));}
> Он делает trim и strval, разве нет?
$post это не элемент массива, а копия его значения. Ты меняешь переменную, а не исходный массив.

И менять $_POST тоже плохо. Это ведь пришедшие данные - вдруг они где-то еще нужны. Относись к нему как к массиву только для чтения.
Аноним 2016/07/27 04:28:09  №806588 615
>>806539

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

>>806518

> floatval($char);
правильнее все же intval так как одна цифра дать дробное число никак не может. А так, в общем верно.

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

>>806485

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

>>806415

Первый раз слышу.
Аноним 2016/07/27 04:33:25  №806589 616
>>806243

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

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

>>806238

В getWorkerSalary нет ретурна.

>>806189

А где у него ООП?

Бат скрипты настолько примитивны что их лучше не трогать вообще (как насчет обработки ошибок? ). И пхп кроссплатформенный в отличие от них.

Аноним 2016/07/27 04:39:13  №806590 617
>>806150

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

------

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

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

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

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

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


------

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

Так же и код. Каждый класс должен выполнять какую-то свою задачу. Если ты не делаешь инкапсуляцию, то код относящийся к задаче, не заперт внутри класса, а размазан по классу и другим частям приложения. Это усложняет его понимание и изменение.
Аноним 2016/07/27 04:42:21  №806591 618
>>806150

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

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

-----------

Интерфейс это набор требований к классу. «требование» здесь значит требование чтобы в классе был определенный метод.

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

Допустим мы делаем сайт где можно ставить лайки постам и комментам. Допустим у нас есть классы User, Post и Comment.

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

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

function addLike(User $user, $object) ...

Мы сказали что $user должен быть объектом класса User, а как сказать что $object должен быть классом, умеющим работать с лайками?

Обе проблемы решают интерфейсы. Объявим интерфейс Likeable, который представляет собой умение получать лайки. Опишем какие методы обязаны реализовать такие классы:

interface Likeable
{
public function increaseLikeCount( );
public function getLikeCount( );
}

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

class Post implements Likeable { ... }
class Comment implements Likeable { ... }

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

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

function addLike(User $user, Likeable $object) { ... }

заметь что благодаря интферйесам наш код стал расширяем. Допустим завтра мы добавим класс Photo который тоже можно лайкать. Если он будет реализовывать интерфейс Likeable то функция вроде addLike сможет работать и с ним без переписывания кода.

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

Аноним 2016/07/27 04:51:42  №806594 619
>>806150

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

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

>>806127

Пхп скрипт это не исполняемый файл. Если ты под виндой, надо писать php file.php

Если ты под Линуксом то можно добавить файлу право +x (execute) и написать в начале что-то вроде

#!/usr/bin/env php

Тогда файл станет исполняемым.

https://ru.wikipedia.org/wiki/%D0%A8%D0%B5%D0%B1%D0%B0%D0%BD%D0%B3_(Unix)

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

>>806102

> if (strcmp($extension, "js") === 0) {
$extension == "js"

Вообще, перемешивание скриптов не лучшая идея. Что с относительными ссылками на картинки и шрифты в css?

И почему все кроме скриптов и стилей идет в fonts?

Я думаю лучше копировать папку dist из библиотеки целиком как есть.

Для рекурсивного поиска файлов нужен http://php.net/manual/ru/class.recursivedirectoryiterator.php

Хороший повод изучить итераторы.

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

> mkdir($path, 0700, true);
Обычно веб-сервер имеет права "другой" а в твоем случае файл доступен только владельцу.

Аноним 2016/07/27 04:57:55  №806596 620
>>806026

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

>>805945

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

>>805940

Тайп-хинты частично есть начиная с php5. В php7 все улучшено.

>>805857

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

А что у тебя будет в этом классе?

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

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

Аноним 2016/07/27 05:41:26  №806599 621
Для деплоя есть еще такая система на php: https://www.phing.info/

Вдохновлена Apache Ant, конфиги на XML.

Но по моему она несколько громоздкая.
Аноним 2016/07/27 09:17:03  №806632 622
Аноним 2016/07/27 10:19:00  №806657 623
Господа, нужна консультация с задачкой про айфон. Что-то я туплю. Мой школьник, собака, не доплачивает банку два платежа. Дурачок никак не поймет, что банк заберет его айфон вместе с новым модным ланч-боксом со спайдерменом и последними трусами.

http://ideone.com/sjOtp9

Аноним 2016/07/27 10:33:29  №806661 624
>>806594
> Но если ты хочешь подключать его из композера через статический метод то он должен быть автозагружаемый.

А как сделать автозагрузку? Она же в вендоре/автолоад.пхп, я ж не могу ее редактировать. Или ты имеешь ввиду использовать use 'mystaticclass'?
Аноним 2016/07/27 10:48:54  №806663 625
>>806661
Хотя я так понял вызов статического метода будет прямо в json фалйе, тогда вообще не понятно как автозагружать.
Аноним 2016/07/27 10:50:12  №806665 626
>>806599
расскажи для чего это нужно? где это может понадобиться?
Аноним 2016/07/27 12:14:37  №806701 627
>Напишите программу конвертирующую набор чисел и других символов в телефонный номер, состоящий из блоков размером в 3 числа. Последние 1-2 блока могут быть размером 2 числа.
>
>Пример: "9 - 33 2176--856" >>> "933-217-68-56"

http://ideone.com/AmfogH

Обоссыте
Аноним 2016/07/27 12:45:22  №806710 628
Господа, проверьте задачки, пожалуйста:
Задачки по регуляркам:
1) https://ideone.com/4gty5H Приведение номера к единому формату.
2) https://ideone.com/tZI7Fp Автозамена слова "Дурак".
3) https://ideone.com/L7JdaE Вывод e-mail'ов.
4) https://ideone.com/qKlxkQ «Grammar Nazi» с автоматическим исправлением.
5) https://ideone.com/LoFKwm «Опечаточники»
Задачки из раздела "Повторим?":
1) https://ideone.com/0HTZhW Задачка "Клавиша shift"
2) https://ideone.com/P8euld "Yoda Speak"
3) https://ideone.com/AO9sGB "Калькулятор"
Аноним 2016/07/27 16:14:17  №806829 629
http://ideone.com/6wsaKI

Этот банкомат забрал мой сон. Все не пойму как с ограниченным кол-вом банкнот работать
Аноним 2016/07/27 16:24:53  №806831 630
Аноним 2016/07/27 18:28:57  №806883 631
Доделал задачку про банкомат(простой вариант)проверьте пожалуйста, аноны.
https://ideone.com/D338lm
Аноним 2016/07/27 19:24:55  №806913 632
>>806594
Здравствуй, это ты всем тут подробно отвечаешь на вопросы? Я в тред только вкатился, как и в похапе, но у меня есть пара серьезных хоть и дебиловатых вопросов которые я бы хотел очень обсудить лично, возможно ли с тобой связаться по фейкомыльцу?
html someApprentice 2016/07/27 20:36:14  №806976 633
https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-1
https://jsfiddle.net/czeo0c8n/

https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-2
https://jsfiddle.net/9ygm244j/

https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-3
https://jsfiddle.net/16m3g5ta/1/

https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-4
https://jsfiddle.net/211Le60v/5/

https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-5
https://jsfiddle.net/h3cez9f7/1/

https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-6
>Ширина меню навигации 200px
А это не слишком много? В шаблоне на картинке она в 3 раза меньше бокса с контентом.

https://jsfiddle.net/L5orb28e/3/


https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-7
https://jsfiddle.net/5g31m30j/1/

https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-8
А можно подсказку как сделать чтобы примечание не растягивала контейнер в котором оно содержится? У меня пока получилось только так https://jsfiddle.net/tsuh4gjw/4/


https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-9
https://jsfiddle.net/kxdx27f1/2/

https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-10
А что это за атрибут такой в <em data-ref="1">? Это случайно не для jQuery нужно? Можно подсказку как слева на строке у элемента с этим атрибутом сделать те цифры в квадратных скобках?

И можно еще подсказку как сделать <figcaption> внизу картинки? Очевидно, сначала нужно использовать position: absolute, но как сделать чтобы элемент был внизу? Неужели задавать координаты с помощью top, left, ...?


https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-11
https://jsfiddle.net/fp8o0exq/4/

У меня не получилось сделать точь в точь как у тебя. Как на глаз определить тень и шрифт? Еще у меня наверно рамка не такая как у тебя...

>я смог решить задание, используя 3 тега на кнопку (label, input, i)
А почему ты выбрал именно наклонный текст? Лучше же span взять - он не меняет стиля текста.

>это задание рассчитано на современные браузеры. Но если ты сделаешь, чтобы код работал и в старых (за счет яваскрипта), это будет плюсом. Или если в старых браузерах будет выводиться просто набор чекбоксов, это тоже лучше, чем ничего
Я пока не знаю javascript, можно я доделаю это позже? Можно пока подсказку как сделать чтобы в старых браузерах просто выводился набор чекбоксов?

>твои CSS стили должны применяться только к элементам внутри переключателя. Недопустимо писать стили вроде label {... } меняющие вид всех label на странице.
Я забыл про этот пункт пока делал задание, можем мы это опустить? В "боевых" задачах я естественно так не буду делать.

>чтобы определить состояние «кнопка вжата», можно использовать селектор label:active (на самом деле input:active)
Я сначала подумал, что ты ошибся насчет :active, что надо было :checked за место этого. Нужно еще и :active делать? Какой у неё должен стиль? Как у :checked?

>дополнительный пункт: если ты посмотришь на обычные, не стилизованные радиокнопки и чекбоксы, то увидишь что по ним можно перемещать фокус с клавиатуры кнопками Tab, Shift + Tab, стрелками и переключать пробелом. Попробуй сделать поддержку клавиатурной навигации и в стилизованных кнопках. Подсказка: для этого надо отказаться от display: none на input, так как перемещать фокус по скрытым элементам нельзя.
А можно еще подсказку как и это сделать?

https://github.com/codedokode/pasta/blob/master/html/html.md#Задание-12
А нужно прям точь в точь как шаблоне делать стили? У меня пока так сделано https://jsfiddle.net/tb7k9dw9/3/ . Если нужно как там то легко исправлю.

>старайся не использовать id в верстке так как с ними не получится вывести на странице несколько блоков вкладок. Разрешается использовать классы или data-атрибуты для связи вкладок и заголовков.
Это касается даже при использовании for у лейблов? Как тогда реализовать переключение вкладок, если вкладывать элементы уже во внутрь лейбла? Не получиться обращаться к соседним или родственным элементам, потому что сначала нужно проверить на :checked у input.

>сверстай блок так, чтобы блок с вкладками можно было вложить в страницу блока вкладок
Нужно чтобы можно было скопировать вкладки в контентную страницу? Может лучше чтобы в контентной странице был свой элемент со вкладками? Так для это следует задать ему собственные атрибуты и стили. Зачем делать по два раза одно и тоже? Я что-то недопонял?
Аноним 2016/07/27 21:44:36  №807042 634
Как валидировать телефонные номера?
В основном нужно Российские, желательно но необязательно международные.
Не хочется изобретать свою регулярку которая все все равно будет неправильно срабатывать для каких-то регионов.
Ессть же FILTER_VALIDATE_EMAIL, неужели для телефонов ничего похожего?
Аноним 2016/07/27 22:07:57  №807057 635
>>806393
Надо было страничку промотать вверх, написал:
>window.scrollTo(0, 0);
Но так как на сайте куча мобильных юзеров, решил не рисковать юзнуть жиквери с его перделками:
>$("body").animate({ scrollTop: 0 }, "slow");

В итоге на виндоус фонах страничка не проматывалась и клиент очень обидно отхуесосил за это. Больше жикверям не доверяю в плане кроссбраузерности.
Аноним 2016/07/27 22:53:49  №807072 636
>>807057

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

И при чем тут jquery? Виноват тут только ты что не знал про эту особенность. jquery просто сделал то, что ты написал.

А так да. window.scrollTo() кроссбраузерный. И если его вызывать например по таймеру то будет и с анимацией.
Аноним 2016/07/28 00:07:43  №807130 637
Аноним 2016/07/28 09:28:53  №807230 638
>>806883
Нельзя получить 100, 1100, 2100 и тд.
Аноним 2016/07/28 11:47:07  №807280 639
>>807230
Спасибо, анон. Не учел что сумма может быть равна номиналу купюры.
Пофиксил строку if ($note < $amount) на if ($note <= $amount)
Аноним 2016/07/28 12:42:49  №807342 640
Аноним 2016/07/28 12:49:07  №807343 641
Если говорить о фреймворках, с какого лучше начинать и на каком закончить?
Аноним 2016/07/28 13:52:17  №807368 642
>>807343
Я начал с Symfony2. Мне нравится.
До симфони совсем чуть-чуть ковырял Silex, но это не щитаеца.

Думаю, что можно начинать с симфони.
Только не пытайся проглотить всё разом - у нее много возможностей. А освоить работу с основным функционалом, содержащимся в каждом фреймворке, особого труда составить не должно.
Советую прочесть доку. Если засомневаешься, можешь поиграть с микрофреймворком вроде Slim, Silex.
Аноним 2016/07/28 18:54:17  №807539 643
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
ПЕРЕКАТ https://2ch.hk/pr/res/807538.html
Аноним 2016/07/28 19:43:11  №807576 644
>>793705 (OP)
Кокой из тредов теперь легитимный? Посоны, мне нужна жс галерейка типа такой:
http://www.family.su/woman.html
+ в идеале, подписи запилить к каждой
увеличиваемой пикче.
+ очень опционально - форма заказа.
Сам вряд ли справлюсь. Подскажете какую-нибудь готовую и максимум лаконичную и понятную реализацию, просто готовый скрипт "встрой в страницу и забудь" или русскоязычный гайд по самостоятельному запилу подобного на жс? Попова не предлагать, там не то и еще большие азы.
Аноним 2016/07/28 19:55:18  №807592 645
>>807576
Этот тред. Пока ОП лично не объявит перекат.
Аноним 2016/07/28 20:41:44  №807639 646
>>803901

>> `cookie_token` varchar(100) NOT NULL,
>Я бы тут добавил уникальный ключ для защиты от глупых ошибок, например когда туда вставляется пустая строка или что-то такое.
Гугл говорит, что в MySQL для запрета вставки пустой строки нужно писать триггер. CHECK молча игнорирует проверку. Не думал, что уникальный ключ можно использовать для этого. Правда, таки один студент с пустым токеном в таблице для этого нужен, но его можно и самому создать.

> Эта штука мне напоминает тест. Это не тест? Тебе определенно стоит почитать урок про тесты
Я читал ещё твои посты по тестированию, адресованные другим анонам, мне очень нравится идея автотестов. Попробую начать с простого - написать тесты к калькулятору. Если разберусь, потом посмотрю в сторону функциональных и опробую их на студентах.

> В реализации роутов у тебя есть подвох. Параметры роута определяются по порядковым номерам, а не по названиям. То есть можно легко написать в роуте плейсхолдеры /:a/:b/:c, а в контроллере function doSomething($c, $b, $a) и не заметить ошибки.
Сделал проверку на соответствие плейсхолдеров с именами аргументов экшна. То есть теперь имена аргументов экшна должны идеально совпадать с плейсхолдерами. Это не так плохо, как если бы ошибки просто умалчивались, но и никакого автоматического связывания аргументов нет.
Вот коммит, отвечающий за изменения в роутинге: https://github.com/applejacky/students/commit/f996fe2fcf3bb978047e4135e427a7bd4abc9a73

>> protected static $table;
> Лучше делать это через абстрактный метод. А то где гарантия что переопределят имя таблицы?
>> public static $table = 'students';
> Непонятно почему тут public.
В общем, все эти проблемы были из-за AbstractMapper, который использовал позднее статическое связывание. Идея такая: у всех мапперов методы findById, findAll, и т.д. одинаковые, меняется только название таблицы в SQL-запросе. Позднее статическое связывание позволяет наследнику вызывать метод родителя, подставляя туда свои статические значения. Но, поле должно быть публичным. Делать абстрактную функцию (чтобы гарантировать возвращение $table), а потом использовать $table в контексте статического связывания кажется бредовейшей идеей, поэтому я просто удалил AbstractMapper.

> https://github.com/applejacky/students/blob/master/app/Controller/AuthController.php
> тут мне не нравится, что отдельные функции для GET и POST
Я всё поправил кроме этого. Вот старая версия с методами getRegisterOrUpdate и postRegisterOrUpdate: https://github.com/applejacky/students/blob/6402ad4269599b63a12c6e67b47bed1f858bacba/app/Controller/FormController.php#L72
Суть в том, что для GET и POST на одну страницу у меня используются разные экшны (как во фреймворках), поэтому после объединения методов даже для меня код стал сложнее читаем ввиду множественных ветвлений. Роутер только ради этого и писал, чтобы он на основе HTTP-метода определял контроллер и экшн, тогда в экшнах не нужно писать if'ы вроде if request = GET { ... } elseif request = POST { ... }
Если делать так, то и роутер можно выбрасывать.

> https://github.com/applejacky/students/blob/master/app/Lib/StudentValidator.php#L36
> Здесь странно что проверки email и пароля делаются только для новых студентов. А что, редактировать email или пароль нельзя?
Нет, нельзя, email используется для регистрационного токена, то есть при смене email нужно токен перегенерировать.

> Нет ли тут ошибки, что пользователь может при обновлении передать емайл или пароль и они принимаются без валидации?
Думаю что нет, на странице редактирования профиля нет возможности изменить email и пароль: https://github.com/applejacky/students/blob/master/app/View/auth/index.phtml#L54

В валидатор приходят не пустые email и пароль, пользователь во время редактирования профиля уже изменяет объект студента со своими данными: https://github.com/applejacky/students/blob/master/app/Controller/AuthController.php#L88
Если пользователь регистрируется, а не изменяет профиль, то он "заполняет" нового студента: https://github.com/applejacky/students/blob/master/app/Controller/AuthController.php#L129
Думаешь, стоит реализовать смену email?
Аноним 2016/07/28 20:49:25  №807645 647
14697281655450.png (223, 829x554)
554x829
14697281655501.png (198, 837x438)
438x837
14697281655542.png (183, 857x439)
439x857
>>807539
Добавь тред в избранное, зачем перекат? Вот гайд для нетерпеливых, здесь кто-то спрашивал об этом. Несколько тредов назад.
Аноним 2016/07/28 21:11:31  №807658 648
>>807645
кто-то создавал тред что не нашел пхп, этот я еле отрыл где-то очень далеко внизу, увидел что уже 600+ постов, запилил перекат, но если нет так нет
Аноним 2016/07/28 21:15:30  №807660 649
>>807658
Есть же поиск по тредам. Или ты всегда скроллишь до треда, если он у тебя не в избранных?
Аноним 2016/07/28 21:16:22  №807662 650
Аноним 2016/07/28 21:16:38  №807663 651
Аноним 2016/07/28 21:17:39  №807666 652
>>807662
Тоже мне, программист. Оптимизировать всё нужно и искать самые быстрые и простые пути.
Аноним 2016/07/28 21:21:27  №807671 653
14697300874380.jpg (4, 200x149)
149x200
Аноним 2016/07/28 22:16:18  №807732 654
Аноним 2016/07/28 23:15:35  №807816 655
Аноним 2016/07/29 00:21:55  №807896 656
Правильно ли я понимаю, что в mysql timestamp это обычная дата? А если я хочу хранить временную метку в базе вида 1469740858? В int(4) это делать?
Аноним 2016/07/29 00:51:52  №807931 657
>>807896
Неправильно, твой sql-клиент вводит тебя в заблуждение.
Аноним 2016/07/29 00:58:16  №807937 658
>>807931
...По поводу int(4). Что, по-твоему, значит цифра в скобках?
Аноним 2016/07/29 04:14:08  №807973 659
Аноним 2016/07/29 04:21:28  №807974 660
>>807931
Нашел такое объяснение:
TIMESTAMP Дата и время в формате timestamp. Однако при получении значения поля оно отображается не в формате timestamp, а в виде ГГГГММДДЧЧММСС, что сильно умаляет преимущества его использования в PHP

http://www.spravkaweb.ru/mysql/sql/vartype

Как-то не понимаю как без посылания значения-то, если я сам выставляю метку из пхп кода.
Аноним 2016/07/29 09:29:12  №808027 661
>>806657
Внимательно прочитай подсказки к задаче. Сам этого не сделал и долго мучался (в конце поста скинул)
Возьми свою 1000 рублей и вставь в функции.
кредитный баланс получается минусовое значение. Общий платеж тоже минус, потому что ежемесячный платеж больше.
Это минусовое значение подставляется в ежемесячный платеж и выплат тоже минус. Банк должен ). Подумай, как сделать так , чтобы избавится от минуса и чтобы он рассчитывал реальное значение долга.


"Исправь и переделай программу, чтобы она работала нормально. Например, эта версия позволяет школьнику переплатить за кредит и уйти в минус, так, что банк ему становится должен — это плохо! Подсказка: перед тем, как платить, надо проверять, сколько осталось долга, и если он меньше 5000, то платить только остаток и завершать цикл через break"
Аноним 2016/07/29 10:24:38  №808051 662
>>806589
>В некоторых случаях лучше использовать абстрактне методы вместо полей. Их нельзя забыть переопределить. Поля можно использовать когда в них по умолчанию разумные значения и переопределять их не обязательно.

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

Вместо
private $coffe;
public function getCoffe() {
return $this->coffe;
}

в родителе и
private $coffe = 20; в наследнике

нужно писать что-то типа:
abstract private function getBasicCoffe();

public function getCoffe() {
$result = $this->getBasicCoffe() * ....
return $result;
}



в предке, и соответственно

private function getBasicCoffe() {
return 20;
}

в наследниках?


Я понимаю вроде как идею, тип у нас такая вот на