Прошлые домены больше не функционируют, используйте адрес ARHIVACH.HK.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.
Это не чат! Пожалуйста не флудите, а старайтесь постить только вопросы, решения и ответы. Сколько лет вы не можете найти работу никому не интересно. Высказывайтесь одним большим постом а не цепочкой мелких
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>678185 (OP) (1000 постов!)
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в 2-3 дня, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию. Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492 ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет. Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Код надо писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Вообще, в 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 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?» Не годится: «В гугле забанили?» Не годится: «Твой код плохой» Хорошо: «Вот, как можно улучшить этот код: ...» Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Не придирайся к знанию английского языка.
Объясняй
Не очень хорошо: «сделай как в этом коде» Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)» Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
На работе дали задачу сделать модуль на yii. А я верстальщик и знаю только js и php на уровне учебника в шапке. Не получится ли так же, как если начинать учить js через jquery?
Извини анончик, но если мы не будем такое пресекать, то опять начнется флуд и тред уйдет в бамплимит за 4 дня. Каждый работает в своем темпе, если ты не уверен или запутался ты можешь показать код и спросить мнение ОПа или других анонов. Никто не запрещает пользоваться подсказками и обсуждать как лучше реализовать ту или иную вещь.
Также может быть что-то полезное есть в комментариях к самой задаче.
Давайте стараться больше уделять внимания техническим вопросам, коду, а не общим обсуждениям.
ОП, суперсерьезный вопрос века по верстке. В макете красиво нарисовано так что цифра 05 прижимается верхними пикселями к верхней же границе картинки В реальности несмотря на все сбросы маржинов и паддингов у заголовка (желтый блок) все равно остаются пробелы сверху и снизу. Мне на тостере прояснили что это высота строки, такая характеристика шрифта и что никаким другим путем кроме подбирания вручную line-height не добиться требуемого результата. пик 1: line-height: 1em, не круто пик 2: line-height: .61em, вроде норм, но 1. кумарит подбирать вручную 2. при смене семейства шрифта надо опять подбирать 3. текст как бы выезжает за границы блока(желтого), вроде ничего страшного но мало ли 4. от этого блока в свою очередь зависит другой, там где месяц тоже надо поджимать и изменение одного влечет бардак с остальными 5. если заголовок будет содержать две строки с отличающимся line-height ничего не выйдет Есть еще конечно вариант подвигать маржином но это вообще мрачно. Собственно вопрос, почему верстка это такая боль и что тут делать, сидеть подбирать или делать первый вариант где поджимается блок, а не шрифт.
Ребят, как настроить xdebug в open server на phpstrom? Что бы можно было по людски выделять строчку, и нажимать жучка и видеть в консоли что хрониться в переменной, делать пошаговую отладку?
>>689696 Ну вот, дадут мне макет на собеседовании, скажут сверстай. Поджимать блок и не париться за эти пробелы, если что валить на то что дизайнер сильно много хочет? Лепить из говна и палок где у каждого второго блока будут логарифмы уровня font: 2.654em/.812em ?
Вообще, конечно, по идее такое выравнивание надо делать за счет vertical-align: top или text-top, но это требует чтобы блок с картинкой были инлайн-блокам и и шли рядом, это не всегда приемлемо.
(кстати ты знаешь что на jsfiddle работает emmet сокращалка css, можно писать div.class или fl:l или w200)
>>689753 О, уже работает, но долго грузится. Полчаса назад сервис лежал, пруф на скриншоте. Ну и индус в issues свидетель, что работать сервис стал нестабильно.
Подковырял код фейкера под другой сервис (как будто он не может полечь). https://gist.github.com/anonymous/5c53e40ac7c519313a96 Фактически там только заменен адрес lorempixel.com на unsplash.it, еще удалены теги категорий из урла, потому что у unsplash категорий не наблюдаю.
Встает вопрос по наследованию. Можно как-то дропнуть метод или свойство, унаследованное от предка? Вот у меня есть класс Faker\Provider\Image, у него статическое защищенное свойство $categories, в котором хранится массив категорий сервиса lorempixel. От него я наследую свой класс, в котором переопределяю методы imageUrl и image. А с унаследованным свойством categories что делать? Мне эта байда в новом классе ни к чему. Что делать? Пусть валяется? Как-то нехорошо, лишний мусор.
Думаю, fzaninotto неудачно спроектировал в этом месте. Нужно было учесть, что сервисов для генерации картинок больше одного, и сделать один абстрактный класс Image, а от него уже унаследовать LoremImage, тогда у меня была бы возможность унаследоваться не от LoremImage как сейчас, а от абстрактного класса. Метод image можно оставить в абстрактном классе, а imageUrl и все связанные с ним свойства и может быть приватные методы уже раскидать по конкретным классам.
> Встает вопрос по наследованию. Можно как-то дропнуть метод или свойство, унаследованное от предка?
Нет так как оно может быть нужно классам-предкам. Также, это нарушит принцип подстановки Лисков так как класс-наследник должен подставляться на место предка (то есть быть совместимым с ним).
> Думаю, fzaninotto неудачно спроектировал в этом месте. Возможно. Но конфигурирование не позволило бы получать картинку одной строчкой.
> Нужно было учесть, что сервисов для генерации картинок больше одного, и сделать один абстрактный класс Image, а от него уже унаследовать LoremImage, тогда у меня была бы возможность унаследоваться не от LoremImage как сейчас, а от абстрактного класса. Тут не нужно наследование, хватит строки с URL с плейсхолдерами мне кажется (хотя конечно может и нет).
>>689752 Ну с выравниванием по верхнему краю ручной подбор line-height помогает, да. Но озвученные проблемы никуда не пропадают. С выравниванием по нижнему краю еще хуже, отрицательные значения в line-height не допускаются, выходит, там только маржином выталкивать >(кстати ты знаешь что на jsfiddle работает emmet сокращалка css, можно писать div.class или fl:l или w200) Я на jade пишу, сокращает здорово.
>>689704 Чтобы в итоге вывелось, сколько потрачено месяцев и т.п.? Ну ты как будто не сам решал задачу - просто после цикла поставь echo с нужными параметрами.
>Надо проверить номер на правильность Сделано в предыдущей части задания в 2 вариантах. Короткий >>689422 Усложненный (строгий формат, хотя как видим это было не нужно, в след.части задачи чистим все лишние символы preg_replace) >>689487
>и привести любой номер к единому формату 89114044411 (то есть, заменить +7 на 8 и выкинуть весь мусор вроде пробелов, скобок и минусов, кроме цифр) Может быть можно было одним выражением, но прогнал дважды через preg_replace, вернее скормил ему массивы. Первый раз заменяем пробелы, скобки и проч.символы на пустую строку; второй раз заменяем +\s?7 на 8. http://ideone.com/yxipgN
> Напиши скрипт, выводящий все email, встречающиеся в тексте Мы кажется в итоге пришли к выводу, что сейчас в имени почты может содержаться что угодно, где-то там была статья на хабре, которая убеждает вместо одной крайности (писать длиннющую регулярку с перечислением всех доменных имен, встречающихся в природе) броситься в другую (регулярка вида /[^@]+@[^@]+/ или что-то в этом роде). Но я пока использую регулярное выражение из урока http://archive-ipq-co.narod.ru/l1/regexp.html
Вкатился к вам из верстка-треда в воркаче, поясните ньюфагу пару вещей. Уже умею верстать говносайтики и могу пойти работать в говноконторке, но в вакансиях на фронтендера\версталу нужен пхп. Так вот что именно мне нужно?
>>689910 потратить два-три года на изучение пхп, жаваскрипт и еще какого-нибудь типизированного языка, не забудь прочитать и переписать паттерны, а также алгоритмы.
>>689915 >static function getStudentList(){ >$db = Database::connect(); >$sql = "SELECT id, name, surname, class, points FROM student" Разве тебе ОП не говорил что так делать не стоит? Ты можешь класс StudentDataGateway сделать зависимым от PDO, это называется Dependency Injection, почитай урок https://gist.github.com/codedokode/e1d31a31b37d5f635057 Это поможет тебе избавится от вызова статистического метода connect() и каждый раз при вызове функции ты сможешь использовать уже готовый PDO. >while($row = $result->fetch()){ Вот этот цикл я вообще не понял зачем тут, еще и переменная $i какая-то. Если ты используешь PDO, в нем есть метод fetchAll(), который сможет вывести все результаты в массив или объект. Почитать про него можешь тут http://php.net/manual/en/pdostatement.fetchall.php http://php.net/manual/ru/pdostatement.fetchall.php - на русском
По поводу твоей ошибки >Fatal error: Call to a member function fetch() on boolean Очевидно что твоя переменная $result равняется false, а это как известно из-за ошибки при работе с базой данных. Чтобы получить больше информации, включи выбрасывание исключений при ошибках в PDO, это лучше всего делать при подключении вот так: >$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); Тогда PDO при любой ошибке работы с базой данных выбросит исключение и завершит выполнение скрипта, что позволит тебе узнать в чем именно проблема. И пытайся избавляться от статистических методов.
>>689924 Вордпресс. Опционально джумла, друпал или битрикс. Из php синтаксис хотя бы.
Не знаю, w3schools например http://www.w3schools.com/php/default.asp Или всякие видеокурсы посмотри на трекерах, этого будет достаточно чтобы натянуть верстку или пофиксить плагин.
А как вообще в жизни выглядит написание сайта? 1)Берётся WordPress, вставляются туда свои данные, картиночки, ???????, PROFIT! 2)Берётся WordPress, делается основной каркас, затем открывается код, плюётся на индусопись, стирается, пишется руками на пхп. 3)Сразу берётся и пишется руками на пхп? 4)Берётся уже написанный ранее сайт, редактируются css-стили, вставляются новые картиночки, новый сайт готов?
Оп, пытался решить твою задачку по айфону в кредит. Вроде почти всё получилось, но не могу сделать так, чтобы выводило последний месяц, посмотри пожалуйста :3 И еще, код очень криво написан, да ?
Я не знаю, что адекватного в этих советах. Я тоже из мухосрани, я знаю уже ТРИ языка, включая говноверстку, кучу сопутствующих фреймворков, два бд, у меня семь проектов в гитхабе на всех этих технологиях. И все, что мне могут предложить сейчас - это 40 штук, и то еще нужно еще один фреймворк учить и не знаю, справлюсь ли я с работой. Ах, да, когда я пришел в местные конторы три года назад с двумя сверстанными сайтами, на меня посмотрели, как на говно, сказали мне в лицо, что я сделал говно и послали нахуй.
>>690034 Если ты toppestkek (даже гитхаб назвал по-дегенератски), то мы в курсе уровня твоих знаний. Еще у тебя психические проблемы. Или соглашайся на низкоквалифицированную работу (ничего в этом позорного, вон миллионы людей работают на заводах или кассирами), или да, смирись и годами прилежно учись.
Аноны, кто знает, как получить ID человека в фейсбуке через его ссылку на фейсбук? Год назад убрали такую возможность, судя по всему, но все еще есть сайты, которые предоставляют информацию о ID.
>>690046 Дегенерат на сосаче детектирует у других псих проблемы, спешите видеть. Когда в последний раз на говно/поней/фурри/трапов дрочил? Что касается гитхаба, я его вообще just for lulz завел, там вон одни парсеры борд. За красивыми гитами тебе к пидорасам типа айдихи, у которого на две строчки кода многотомный дискрипшн с картинками))
>>690060 >Если ты направо и налево обзываешь всех больными, может проблемы у тебя? А по моему он прав, зачем сидеть в треде, который ты ненавидишь и считаешь всех червями-школьниками, но при малейшей проблеме идти и плакаться в него-же?
Господа, пилю какую-то хуету для себя, вычитал что лучше обрабатывать ошибки своим классом. Расскажите как лучше реализовать. Сделать какой-нибудь класс отдельный, в который передавать сообщения ошибок? Может есть какой общепризнанный паттерн там, яхз. Помогите долбаебу.
Знаю, что к Евгению Попову вы здесь относитесь хуёво, но у меня возник вопрос, я тут нашёл раздачу, где почти все его основные поделия, из годного там HTML+CSS практика и PhP и MySQL для начинающих. Но сам видеоурок 2007 года. Что посоветуете: изучать по книге из ОП-поста или сначала посмотреть видеоуроки эти, а потом уже за книгу браться? И да, по JavaScript и JQuery тоже нашёл его курс, он хоть сгодится?
т.е. если меня не брали в мухосранскую контору версталой, то значит у меня псих. проблемы. вообще ахуеваю с этой логики. про псих проблемы мне еще и натурально ОП ПИДОРАС говорит. ты знаешь, что гомосексуализм - официально псих. болезнь во многих странах?
А вот вы тут так неохотно вёрстку затрагиваете, при выполнении всяческих фриланс-заказов, непосредственно к самой вёрстке приходится прибегать только при редактировании каких-то особенных элементов? А всё остальное Джумлой или Вордпрессом делаете? Вообще, такое ощущение создаётся, что веб-разработчик и верстальщик это разные профессии.
>>690218 лол, конечно разные. На крупных проектах программист делает логику и основной функционал, верстальщик все это дело оборачивает в приятный глазу вид под уже нарисованный дизайнером шаблон.
ОП, я оказывается кое-что упустил. Я мало что знаю про сетевые протоколы и про OSI, про структуру интернета и как он вообще работает. Вот начал гуглить, там описывается 7 уровней сетевого взаимодействия. Но для меня это теория, абстракция. Их вообще можно потестить, поюзать? Проверить как это пошагово выполняется? Ты мне задачу про сокеты кидал и план изучения. Так вот строение интернета и сетевые протоколы я как раз и не понимаю. Надеюсь на подробный ответ.
Почему здесь https://jsfiddle.net/bhvdnb9j/ всё работает так как надо, картинка становится по центру, как по вертикале, так и по горизонтале, а в браузере при копировании этого кода, картинка не выравнивается по вертикале.
>>689532 >Надо варнинги перехватыват и очищать, там есть функция. Но зачем мне знать об этих неминуемых варнингах? Проще собаку поставить.
> Ну и как я вижу, там много случае где твой парсер не вырезает яваскрипт-ссылки. А ведь есть еще data-ссылки. Плоховато у тебя с теорией. Надо использовать белый список, то есть разрешить толкьо определенные протоколы в ссылках. Но ведь DOM тоже не имеет автомата для выреза такого шлака. Через DOM я могу только перебрать аттрибуты.
>>690343 >там описывается 7 уровней сетевого взаимодействия. Но для меня это теория, абстракция А это и есть абстракция. 5 и 6 уровни существуют только в стандартах фактически - вот написали такие уебанские стандарты, deal with it. 1 уровень - витуха, воткнутая в твой комп. В ней бегают электрические сигналы. 2 уровень - твоя сетевая карта и свитч провайдера. Они знают друг друга по MAC-адресам. 3 уровень - маршрутизация, IP-адреса. IP-адреса в сети существуют поверх MAC-адресов. Устройство может иметь мак, но не иметь IP, но не может иметь IP и не иметь MAC. 4 уровень - тот самый TCP/IP, отвечает за установку соединения между двумя точками. Различие между 3 и 4 уровнем в том, что 3 уровень - это карта с маршрутами, а 4 уровень - налаженные грузоперевозки по этой карте с маршрутами. Ну и 7 уровень это все, что ходит поверх TCP/IP. То есть весь Интернет. HTTP и так далее.
>>690317 >Имя слишком длинное (до 13 символов Интересный ты. А если кто-то введет ФИО? Вот ты и потерял заказ. Не нужно делать жесткую валидацию вещей, которые потом все равно будет читать человек.
>htmlspecialchars Эта функция нужна для вывода данных в html-код. Убери это. Кроме того, e-mail сообщение по умолчанию plain/text.
>Если ввести буквы - выводит что номер превысил 13 символов. strlen возвращает длину строку в байтах. 7 русских букв - 14 байтов. Используй mb_strlen, а в начале кода пропиши mb_internal_encoding('utf-8');
Если ты будешь проверять номера телефонов сугубо на цифры - будешь терять заказы. Твоя регулярка верна, только убери модификатор i. Заглавных цифр не существует.
>>690112 >2007 года Не смотреть ни в коем случае. >Евгению Попову вы здесь относитесь хуёво Его код был ужасен даже в 2007. Если ты сейчас обучишься по его шедеврам, ты будешь писать хуже, чем писал бы самостоятельно.
>>690068 >Пропущена запятая перед предлогом "а" или "но". А если предложение начинается с предлога?
>>690388 Если предложение начинается с предлога, то перед ним не будет пробела и... а, ну да. Будет точка и пробел. Добавил точку во фрагмент [^.,]\s\b(но|а) http://ideone.com/DBrEeG
Скобки, скобки, тысячи их. Признаюсь честно, под конец уже как дебил наугад расставлял номера подмасок. Там как-то явно можно лучше решить.
В условии предлагается >Подсказки для глупеньких: слова с опечатками найти легко: это слово, которое начинается с одной или нескольких русских букв, за которыми идет латинская Не согласен, зайчик. А вдруг слово начинается с большой латинской буквы, например [K]алининградская область, или [M]агнитогорск. Так что пришлось исходить из того, что либо слева от латинской буквы кириллица (тогда справа ее нет), либо справа (тогда слева ее нет). Потому что две подряд латинские буквы это уже слишком. Хотя... можно подобрать и такие слова наверное. Или я усложняю?
Кстати, а эту дырочку на сайте госзаказов хоть прикрыли за эти годы? Если нет, может настучим на них (куда? задорнов.джопег. Нет, ну мелкую сошку то никто крышевать не будет). Прикрепляю песню "ансамбля Христа Спасителя", призывающую граждан бороться с произволом бандитов во власти. https://www.youtube.com/watch?v=VyxcHbdLhac
>>690409 Это условная подмаска, поросеночек http://php.net/manual/ru/regexp.reference.conditional.php Лол, помнишь ту серию сауспарка? "Как ты его назвал? - Поросенком... - Нет, ты должен был назвать его говнюком, как настоящий мужЫк! - Пап, но я... - А ну быстро назови своего друга говнюком!"
>>690410 Я устал, не добивай. Точку с запятой, тире сам смог вспонмить. У тире там еще кажется много видов. Кстати, нельзя ли в регулярках писать код типа U+2014. Ну в общем идея понятна, список знаков препинания можно дополнять если что. http://ideone.com/DBrEeG
>>690595 Так php-скрипты могут выполняться не только в веб-среде, данные не обязательно приходят из формы, из консоли его могут запустить например. Нужна именно универсальная функция. Переменным давай внятные имена, не calkR, а exchangeDollarsToRoubles, чтобы можно было из названия понять, что делает эта функция. Большое приложение полностью будет состоять из таких вызовов, и ни желания ни времени не будет лезть в их код и смотреть что они там внутри делают. Английский желательно подтянуть, это понадобится не только для того чтобы давать имена переменным, вся литература к сожалению только на английском. Набирать на клавиатуре нужно быстро и вслепую, а не как клуша двумя пальцами.
>обернуть возвращенные значения в переменные, чтоб помещать туда итог Да, так лучше. Логика (всякие вычисления) должны быть отделены от представления (как ты результат собираешься выводить). Полученный результат можно вывести в браузере при помощи html-разметки. А может быть это консольное приложение, тогда вывод будет другим, может программа вообще ничего не выводит, может она пишет в файл, тоже неизвестно в каком формате.
Этот анон >>690615 правильно написал в общем, а я еще дополню. Важно уметь разделять код на независимые части, а не смешивать все в кучу. Потому получение данных из формы и расчет должны быть в разных местах. Один код который работает с формой, и отдельно универсальная функция перевода валют.
Код важно разделять даже если мы никогда эту функцию не будем как-то еще использовать - разделять надо ради упрощения и читабельности.
>>690625 Там короче файлы нужно помещать не в www, а в www/html. Да, в apache2.conf написано <Directory /var/www/>. Только вот зайди в sites-available, там файл 000-default.conf, а в нем DocumentRoot /var/www/html
Но я в общем тоже краб, помню некоторые настройки, но не понимаю за что они отвечают.
Лучше приучаться сразу писать нормально а не заставлять людей расшифровывать сокращения. Раз скрипт небольшой, то и функций в нем немного, значит и много усилий правильные имена не потребуют.
>>690725 >$REQUEST_METHOD Что за переменная request_method? Она вообще есть? Может ты хотел написать $_SERVER['REQUEST_METHOD']? Логи попробуй поискать в /var/log/apache2/ httpd это и есть сервер.
>>690742 Твои данные в массиве $_POST. Имя html элемента соответствует индексу в массиве $_POST. Например <input type="text" name="username"> При отправке $_POST запроса значение этого поля ты сможешь получить через $_POST['username'].
Расскажите, как организована командная работа в серьезных конторах? Есть ли разделение труда, типа отдел верстальщиков-фронтендеров, бекенд-программисты, системные администраторы, или везде фулстаки (которые на словах умеют "все", но делают это все плохо)? Проводят ли старшие программисты код-ревью, то есть проверку кода джунов? Есть ли семинары или что-то подобное для повышения квалификации? Как проходит именно рабочий процесс? Тимлид бегает и раздает всем мелкие задания, следит за выполнением и подсказывает (инбифо: размечтался), или все более бюрократично, типа вон список задач, бери шо хочешь, делай как хочешь, сдавай как хочешь. Только если будет жалоба, тебя выпизднут.
Про скрам слышал, в теории красиво, но из того что читал в интернете складывается впечатление что это манагерская хуита, лишь бы больше времени апщаца и меньше заниматься делом.
Какие виды деятельности преобладают? Я имею ввиду, что есть мелкие студии, которые исключительно специализируются по натягиванию верстки на cms; есть большие конторы со своими проектами, которые ведутся годами, а есть всеядные конторы, где ничем не брезгуют, есть и свои проекты, и легаси, и пофиксить вон тот говносайт. Я бы предпочел именно третий вариант, такую контору средней руки. Там наверное и коллектив небольшой с четко налаженной работой, тогда как в больших компаниях бюрократия, а в вебстудиях дно и бесперспективность.
tldr: как организован рабочий процесс? Вот завтра я приду на работу, усажу свой зад на стул или что у них там из мебели, дальше что? Контроль работы, коллективная работа, оценка проделанной работы, список задач?
>>690750 Работаю вот в такой всеядной конторке, менеджеры раскидывают задания, иногда местные страшие что-то скипают если сидишь без работы. Старшые при вопросах отправляют в гугл, только если уж совсем пизда, то помогут.
Можно ли устроиться хоть куда-нибудь работать в ДС после учебника ОПа, но не сделав студентов? Доедаю последние хуйцы с гречкой, студенты кое-как идут, но больше не идут, чем идут
Если в коде упоминается класс, то должен быть и доступ к этому классу. Поэтому сначала объявляли все классы прямо в том же файле: <?php class Example { 100500 строк; } class AnotherExample { еще 100500 строк } // а теперь эти классы используются, в данном случае создаем экземпляры объектов $example = new Example; $anotherExample = new AnotherExample;
Так как в больших проектах программа требует сотни и тысячи классов, неудобно их описывать в одном файле. Тогда каждый класс стали писать в отдельном файле, и подключать их к главному скрипту при помощи выражения require. require грубо говоря копирует содержимое файла и вставляет его в то место, где прописана эта инструкция.
Теперь код выглядит require '/classes/Example.php'; require '/classes/AnotherExample.php'; $example = new Example; $anotherExample = new AnotherExample;
Уже лучше, но если нужны сотни классов, придется писать сотни строк require classname. Тогда разработчики сделали возможность объявить функцию, которая будет вызываться при обращении к классу, которого не видит php. spl_autoload_register(function ($className) { $path = 'classes/' . $className . '.php'; if (file_exists($path)) { require_once $path; } }); $example = new Example; $anotherExample = new AnotherExample;
Что произойдет в такой программе? Php зарегистрирует функцию автозагрузки, т.е. положит ее куда-то себе в память и забудет о ней, пока не нужна. Дальше он видит строку $example = new Example; и спрашивает себя: а есть ли в коде выше объявление этого класса? Нету. Значит нужно запустить ту функцию, которую зарегистрировали через spl_autoload_register, передав ей в качестве аргумента название класса Example. Выполняется функция, к имени класса добавляется путь к папке 'classes/', получается 'classes/Example.php'. Вот теперь произойдет require_once 'classes/Example.php'; и программа создаст экземпляр этого класса. (Если такой файл существует по указанному пути)
Дальше скрипт наткнется на выражение $anotherExample = new AnotherExample, повторить вышеописанный порядок действий.
Короче, когда php не может найти класс, он перед тем как орать об ошибке выполнит функцию, которую ты зарегистрировал, передавая ей в качестве параметра название класса. А внутри этой свой функции автозагрузки ты и делаешь require путь/к/классу/НазваниеКласса.php
>>690803 Т.е. одной функцией spl_autoload_register(function ($className) я автоматически буду подгружать все классы из указанного $path (папки) в свой проект при необходимости(при запросе)?
И ещё такой момент: в конце статьи ОП-чик говорит что-то про composer.json, чем полностью выбил меня из колеи (впервые слышу об этом), в студентах это пока не потрубется и можно использовать только spl_autoload_register,
>require грубо говоря копирует содержимое файла и вставляет его в то место, где прописана эта инструкция. Нет, не так. Это не Си. require просто выполняет код из указанного файла. Соответственно если в том файле описан класс, то при выполнении require этот класс будет создан в памяти PHP и станет доступен для использования.
Я думаю, все эти аналогии вроде "реквайр подключает файл" непарвильные. Он просто загружает файл и выполняет код из него.
>>690827 Неймспейс не используешь потому что. Нужно писать new \Classes\Student; И "classes" это для примера, если бы в примере было написано ваш/путь/к/папке/c/классами, ты создал бы тоже создал такую структуру директорий? Пути должны быть более осмысленными, по стандарту psr0 Назови неймспейс по имени своего приложения. Например Students, или College, или как-нибудь осмысленно. Как бы ты назвал свой сайт? Какое бы хотел видеть доменное имя, вместо http://localhost? (только не example.com или site.ru, пожалуйста)
Проблема с симфони и задачей TestHub : Как выводить эти формы или вывести одну форму для трех сущностей Я в тупике EntityType - не подходит, как я понял, но может я не правильно понял ArrayCollection - тоже как то не то, хотя опять же Поясните как использовать EntityType или ArrayCollection если они решат проблему, или посоветуйте что-нибудь друзья
Хотя я знаком с Симфони, но несколько раз приходится перечитать пост чтобы понять в чем проблема. Ты бы написал какую часть приложения (модели, формы) ты делаешь. Видимо обе.
Первое что надо вспомнить - что в Симфони формы обычно работают с моделями. То есть они используют объекты моделей для хранения данных. При обработке запроса данные из POST переносятся в модель, при выводе формы данные из модели выводятся с помощью шаблона.
Потому начни с проектирования моделей Doctrine, которые бы описывали тест с вопросами и ответами. Обрати внимание, что есть разные типы вопросов - это классический пример наследования таблиц - и надо определиться с выборо паттерна наследоваия таблиц (с оглядкой на то, поддерживается ли он доктриной или нет).
Если не уверен, можешь мне показать промежуточный вариант.
Насколько я помню, в тесте вопросы добавляются динамически. Значит каждый вопрос - это форма, а все вместе - коллекция форм. В Симфони форма и поле формы наследуют один общий класс и потому поля и формы могут произвольно вкладываться друг в друга. Хороший повод перечитать документацию, посмотреть исходный код форм симфони.
Я не уверен что стандартными средствами Симфони можно сделать все, что требуется, так что будь готов дописывать какой-то кастомный яваскрипт, который будет генерировать эти формы, например из шаблона.
Ты наверно заметил что прямого ответа на вопрос нет. Придется подумать самому.
Вот рекомендуемый порядок действий:
- определиться с схемой БД - сделать соответствующие модели доктрины представляющие части теста - сделать формы для редактирования этих моделей
Можешь показывать промежуточные результаты
> Поясните как использовать EntityType или ArrayCollection если они решат проблему Ты по моему все смешал - ArrayCollection это класс представляющий коллекцию моделей доктрины, а EntityType это что-то из форм.
Дымящаяся куча вводных слов под спойлером. Давно не был в треде. Я тот анон, который захламлял тред яваскриптом и версткой пока делал макет. ОП, скорее всего вспомнишь меня по куче километровых паст, которыми мы обменялись месяцев 5 назад. Так вот ближе к делу. Как-то недавно мне посоветовали не сидеть за учебниками а написать что-то свое. До этого недели 2 потратил на учебник с DOMом но после долгого перерыва как-то сложно было вкатиться, да и сам DOM каким-то сложным мне показался. Но вдруг я подумал о совете про свой проект и за неделю я написал целую игру с экономикой, кучей счетчиков, циклами, магазином, улучшениями и сложными скриптами. Даже чертовыми фреймворками воспользовался и сохранение игры через куки сделал. И все без какой-либо помощи в написании кода. Только одних скриптов больше тысячи(!1!) строк. На некоторые копипасты мне конечно указали, но в целом очень даже похвалили за такие успехи. Заодно еще и вспомнил штмл с ксс. Ссылку не дам :3 Так как помню, что у тебя пунктик на проверку всего что сюда скидывают, а там много кода и время у анонов я отнимать не хочу, ведь это не задача из твоего учебника. Так вот вот взглянув на всю эту продуктивность я подумал, а почему бы не продолжать в том же духе и взяться за что-то еще более серьезное. И вот я придумал еще одну игру, но там уже даже познаний моего знакомого, который не один год работает программистом уже не хватает, вот я и вернулся в тред за помощью. Напомню, что с твоей помощью уже выучил HTML, CSS, Javascript и самостоятельно DOM. Не весь конечно, но если что догуглю пробелы.
Планирую написать игру. Саму идею рассказывать не буду. Скажу лишь, что мне нужно будет рандомно соединять двух желающих поиграть людей. Примерно как это сделано в хартстоуне. Нет, у меня не карточная игра, не клон этого хартстоуна, и вообще оригинальная, что я аж сам офигел от того что ее придумал. Серьезно :3 Как я понял мне нужно знать базы данных и приступить наконец к учебнику по PHP для написания серверной части. И вот как раз перед учебником по PHP я бы хотел получить знания по базам данных. Написать что-нибудь с помощью их. Я предполагаю в качестве тренировки я смогу запилить что-то типа чата чтобы написанные пользователями сообщения отправлялись в базу данных а оттуда в окно чата и могли бы быть видны всем. Ну это все теория в которой я даже не разбираюсь. А надо бы разобраться. Что мне нужно учить для создания баз данных? SQL? Это ведь отдельный язык баз данных? А потом уже искать учебник по определенной базе данных типа MySQL? Или может мне не MySQL понадобится а что-то другое, а он уже давно устарел и все тру пользуются чем-то другим?
>>690983 Да я помню как ОП проверял даже сайт где анон падающие цифры как в матрице делал и пастой ему отвечал. Не хочу чтобы он сидел и гору левого кода смотрел. Не то что бы мне стыдно за него, я наоборот очень даже им горд. Потому как все полгода пока я изучал здесь программирование я ныл что не умею ничего активного делать. Даже не мог сделать чтобы по кнопке что-нибудь в стиле "скрыть\показать картинку" происходило. А тут сел и через неделю игра целая.
>>690997 Дай посмотреть-то, интересно же. Советы ОПа всегда уместны, он тоже дополнительно прокачивает скилл, когда смотрит на говнокод, инфа соточка. Иначе не отвечал бы всем нам тут. Какого уровня игра, вот как здесь, например: http://codecanyon.net/category/html5/games Там игры на HTML5, простые браузерки, можно в страничку встроить, canvas, все дела. Хотелось бы научиться такие делать тоже.
>>691015 Много кто. Посмотри в wordstat.yandex запрос "играть онлайн на сайте" или подобные. Там сотни тысяч в месяц запросов, а то и миллионы. >flappy bird >полмиллиарда установок >кто в это играет
>>691015 Никто не играет, там же написано кол-во продаж (1-2 в среднем).
>>690977 Прямо умиление берет от этого восторженного наивного ребенка))) Но молодец, практика это главное. Не будешь писать код, не будет прогресса. Ошибок там конечно наверняка море, но это не главное, главное усердие. Непонятно правда, в чем вопрос был.
>>691049 Мне 39 лет, какой еще ребенок? Шучу, конечно :3 Ясное дело как со стороны выглядит, ну да и ладно, может так и есть, кто знает. Вопрос в базах данных. Пока я даже понятия не имею как их делать, подключать, писать, использовать и все такое. Просил годной литературы и какого-нибудь краткого общего объяснения.
>>691006 Да я бы даже скинул, но там счетчик онлайна со встроенным диваноном по айпишникам. Пришлось бы всем прокси надевать. Да и чат в виде виджета вк запилен в котором можно меня легко задиванонить, так что лучше не буду. Чтобы было хоть какое-то представление - смесь куки кликера и какой-нибудь стратегии со всякими улучшениями.
>>691068 Вполне. Только лучше бесплатные приложения для Андроид и iOS, это я как диванный эксперт тебе говорю. Вот не об игре, просто читал сегодня как раз: https://vc.ru/p/currency >>691070 Не, флаппи бесплатная, там только реклама была от Гугла, пока создатель не удалил её.
>>691029 В оп-посте ссылки на задания по файлообменнику и сайту для студентов. К ним подробные комментарии как писать веб-приложения. Это для учебы, в реальности конечно все пишут на фреймворках (или cms, кому что ближе).
>>691058 Все шапке, что ты не как олдфак треда. Ссылки на оповские мануалы на гитхабе в шапке. https://gist.github.com/codedokode/10539213 Но там в основном собрана туча ссылок на разные скучные справочники и документации. Php вряд ли годится для онлайн-игры, хотя в учебных целях почему бы и нет. Если ты знаешь javascript, есть смысл смотреть в сторону nodjs. Хотя там свои сложности. И mysql для браузерной игры особо не нужен, есть же локальное хранилище. Ну или хранить на сервере в редисе. Не знаю, подожди опа.
>>691091 На Андроид установи какую-нибудь игру - там хер пропустишь. Вот живой пример: чашка Петри, чел сделал аналог игры Агарио. Там счет заработанного идет уже на миллионы.
>>691099 Платят и за показы, и за клики, только по-разному. Ещё могут быть оплаты за игровую валюту: посмотри видео от партнеров - получи 30 плюшек на счёт. Но это для топовых игр, конечно. Так-то тупо блок Адсенса обычно, во время игры меняется реклама врем от времени.
>>691089 MySQL не нужен в том смысле что вообще базы данных не нужны? А как же регистрации, аккаунты, личная статистика и все такое. Да и играть будут два человека друг против друга. "Локальное хранилище" в моем понимании что-то в стиле кук и хранится в браузере, а мне то надо чтобы нельзя было читерить и цифры хранились в базе.
Насчет шапки. Ее-то я посмотрел уже. Учебник по SQL там ну уж слишком большой. Знакомый сказал мне особо много не понадобится, всего-лишь небольшой набор элементарных вещей. И из целого учебника выцеживать то, что я даже не знаю что мне нужно, как-то не хочется.
>>691125 Судя по твоему посту, ты совсем не понимаешь откуда начать, так что для тебя сложно. А так серверная часть для крестиков-ноликов даже на PHP реализуется за один вечер.
Привет, это опять я. >>686858 >>686858 Вот мои посты выше. Пост с обьяснением проблемы и пост с моим гитхабом. В чем дело. Я таки полазил и понял, что не работает конкретно добавление в базу данных. Ставил условие чтобы делать header только если mysqli_query возвращает true и не перенаправляло. Скажите, что из моего кода может быть устаревшим для 7php, mysql 5.7, apache2.4? Проблема так и не пофикшена, не работает оно. Если у кого-то установлены именно 7php, mysql 5.7, apache2.4 убедительная просьба - запустите проект с гита(ссылка на пост с ним выше) и напишите в тред результат. Если я не найду решения то прийдется таки работать с денвером, чего я очень не хочу, а сроки поджимают.
Вопрос по поводу Silex у меня есть layout, там есть возможность на контроллере срендерить блок и отдать к темплейтам, а как делать ебануню менюшку, вот в чем вопрос, неужели все глобальными переменными хуячить?
>>691226 И тут же еще один вопрос, мне нужно в функцию контроллера передавать маппер, что бы не нарушать DI, если я его правильно понимаю, как это реализовать? public function index(Request $request, Application $app) вот же как выглядит контроллер
При DI обычно зависимости передаются в конструктор а не функцию. Ну и для контроллеров обычно DI не делают (но есть люди которые наоборот считают что надо делать, по их мнению контроллер это такой же сервис), так как это управляющий всем процессом скрипт и он может сам получать нужные ему объекты как хочет.
То есть можешь просто передать DI контейнер в конструктор контроллера и далее его исопльзовать.
> Знакомый сказал мне особо много не понадобится, всего-лишь небольшой набор элементарных вещей. У нас есть в шапке задания по SQL и там перечислено что надо знать чтобы использовать и проектировать базы данных. Не представляю как можно что-то нормально сделать не зная этого.
Ну и если ты про учебник Пирамидина, то он по моему простой, а объем там из-за того что элементарные вещи по несколько страниц объясняют.
Да, но так как у меня не очень много времени, в первую очередь буду смотреть код тех кто решает наши задачи или у кого есть какой-то конкретный вопрос.
Писать свое - хорошая идея, но надо все равно продолжать учиться. Я замечаю такую вещь, что когда начинающий анон например доходит до задачи про студентов, или например до задачи про минера на JS, у него появляется завышенная оценка своих сопсобностей. Сделав простое приложение, люди думают что теперь-то они могут сделать что угодно, и дальше учиться незачем.
Но это именно ложное ощущение. Ведь мало знать синтаксис и популярные стандартные функции. Реальные задачи отличаются от наших тем, что в них приходится работать с огромными по объему приложениями. Десятки тысяч файлов с кодом - не редкость. И чтобы работать с таким кодом, мало знания синтаксиса. Нужно уметь писать простой и поддерживаемый код, контролировать его сложность, уметь правильно проектировать классы и взаимодействие между ними.
Потому вам все равно надо продолжать учиться.
> я бы хотел получить знания по базам данных. Написать что-нибудь с помощью их. Ты не можешь написать что-то "на базах данных" так как это система хранения данных, а не среда программирования. База данных не будет тебе выдавать веб-странички и не позволит отправлять данные в нее с них.
У нас есть в ОП посте урок и задачи по MySQL, там написано что надо выучить и какие задачи стоит решить для проверки знаний. даже решив их все, ты все равно не сможешь написать чат без знаний серверного языка программирования.
То есть тебе нужен как минимум PHP. Причем если делать чат серьезно, с сокетами и асинхронщиной, то придется еще изучать эти сокеты и сетевое программирование. Путь не короткий.
SQL это язык для написания запросов к БД. MySQL это СУБД поддерживающая SQL. Язык MySQL на 90% соответствует стандарту SQL и на 10% состоит из своих особенностей и дополнений.
В таких ситуациях надо ставить эхо в загрузчик, чтобы выводилось имя класса и предполагаемый путь к файлу. И по ним смотреть что не так.
Как минимум надо учесть что неймспейсы в имени класса содержат бекслеши в то время как в именах файлах надо использовать прямые слеши - в линуксе только они работают.
Если под ОПом ты имеешь в виду ОПа этого треда (меня) то я ничего подобного не говорил. Если тебя не брали куда-то на работу значит ты не соответствуешь их требованиям и надо учиться дальше. Давай на этом закроем эту тему и не будем возвращаться к ней.
Это тред про программирование. Обсуждать как ты не прошел собеседование можно в нытик-треде который всегда висит на первой странице раздела.
- имя может содержать другие символы вроде знака процента. - домен может содержать как минимум цифры - рано или поздно начнут появляться кириллические адреса - стандарты не запрещают вроде
Ксс не идеален и приходится искать компромиссы. Отрицательный маргин подобранный под размер шрифта не такой и старшный компромисс при условии что этот шрифт распространен.
> отрицательные значения в line-height не допускаются Логично, как высота строки может быть отрицательной.
Слишком много кода в шапке цикла, тяжеловато читать. Я бы перенес увеличение года в скобки, а депозит вынес. Хотя праивла позволяют даже указать обе переменных через запятую.
Ну и посмотри внимательно: если наберется ровно миллион, твой цикл будет выполняться дальше.
>>691196 Короче завел твое добро на php-7.0+mysql-5.7.8+apache-2.4. С дефолтной установкой вылезли две проблемы: 1. Можно войти в mysql только с рута в системе. Толи криво встал у меня, толи теперь такая политика безопасности я х.з. Ну создал пользователя, подключение пошло. Воткни хотя бы после подключения к бд для вывода ошибок: if (!$link) { echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit; } 2. При вставке в register.php вылетает ошибка, user_hash не передается и не задано дефолтное значение. Решение: добавить default '0' для этого столбца, как у тебя сделано для user_ip. После этого все заработало. А где ты этот ад взял вообще и зачем он тебе?
Про то что в mysqli надо всегда проверять результат, я пишу везде где могу. Люди все равно продолжают его не проверять. Не знаю кто виноват. плохие учебники, невнимательные люди или разработчики, заложившие по умолчанию вариант "игнорирвоать все ошибки". Переходите на PDO лучше.
Ответы 13-16 марта в стром тредеАноним18/03/16 Птн 05:07:42#159№691331
Проверил все задачи в старом треде. Если кого-то забыл - напомните о себе тут. Вот ответы:
>>691326 >>691331 > array_push($topsOut, $amount); > array_push($topsIncluded, $amount-$nomination); > array_push($weights, $nomination); > мне кажется не очень удачная идея вести 3 стека
Это способ хранение графа с помощью списка рёбер $topsOut - массив вершин, из которых выходят рёбра. $topsIncluded - массив вершин, в которые входят рёбра. $weights - массив весов рёбер.
Я так до конца и не смог додуматься, как организовать перебор всех комбинаций и при этом учитывать количество заданных банкнот. Короче так я и не осили эту задачу в полном объеме.
>>689935 А как вообще в жизни выглядит приготовление жратвы? 1) Берется доширак, заливается кипятком, вставляются туда опциональные фигни типа лавровых листов, ????? PROFIT! 2) Берется лапша, варится соус, добавляются овощи, затем смешивается все. 3) Сразу берется мясо, разделывается, раскатывается тесто, варятся овощи, добавляются специи и делается блюдо? 4) Берется уже готовое блюдо, в него добавляются новые ингридиенты, новое блюдо готово? Думай.
Тебе надо подписать что хранят эти массивы. Если это граф - то что является узлами и связями. Сами названия переменных мне ничего не говорят, а сидеть реверс-инжинирить твой код мне было некогда. Если ты не делаешь свой код понятным, тебе не смогут ничего посоветовать.
Аналогично стоит подписать что делает функция, что у нее на входе и что на выходе.
Тем более, если у тебя граф, для них есть много стандартных алгоритмов.
> Я так до конца и не смог додуматься, как организовать перебор всех комбинаций и при этом учитывать количество заданных банкнот. Короче так я и не осили эту задачу в полном объеме. Можно начать с наивного варианта: перебирать все допустимые комбинации купюр пока не выпадет нужная.
>>691501 >$stavka >$komissiya >. " месяц кредита, " . "В этом месяце кредит составил " . round($credit) . ", " . "Всего было выплачено уже: " . $totalPayment . "<br>" Ты так и не стал на путь исправления... Считает неверно: там должно получиться 61270 рублей со многими копейками. Конкретно у тебя не считается последняя выплата в 262 рубля, к которой прибавлена комиссия в 1000р и три процента на 8 с небольшим рублей.
>>691278 $app->get('/', 'Controllers\IndexController::index')->bind('homepage'); Вот мапится контроллер к роутеру. Мне нужно передать в IndexControoller конструктор хотя бы $app['db'], как это сделать?
>>691527 С силексом я не работал, но в слиме можно поместить контроллер в контейнер и передать ему все что хочешь. >$container['ExampleController'] = function ($container) { >return new ExampleController($container); >}; Потом в роутере ты просто пользуешься контроллером который у тебя в контейнере вот так >$app->get('/path/to/controller', 'ExampleController'); Так же можно указать функцию которая будет вызвана, например >$app->get('/path/to/controller', 'ExampleController:someFunction'); Если её не указывать, будет вызвана функция __invoke()
Попробуй погуглить, может в силексе тоже можно как-нибудь подобным образом сделать, разработчик у слима и силекса один, насколько я понимаю.
Чики-пуки, пехопач. В требованиях на вакансиях верстальщика часто встречается "базовое знание php", "хотя бы понимать что такое PHP". Что они хотят видеть и к чему я должен быть готов?
>>691571 >ЧТо жуткого в БЭМ? Ээээ.... Как бы общее впечатление от легаси моей конторы. Ладно там проекты масштаба яндекса. А для микродрисни мне такой слон не нужен.
>>691591 Так считает же неправильно всё равно, ты о чём? Поставь в сумму кредита 1000 - должно получиться 2030, а у тебя вот что: http://ideone.com/NNceu6 Уходит в минус всё, выплачивается два месяца.
Надо чтобы работало на любых суммах кредииа, любых разумных значениях процентов, комиссий и лимитов. То есть если кредит выплачиваемый - программа должна его правильно считать.
Я бы советовал радикально упростить код. Сейчас в нем очень много действий и легко допустить ошибку.
Незачем повторять код 2 раза для обычных платедей и последнего. Надо написать универсальный код. В примечаниях к задаче есть подсказки вроде бы.
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
конструкция из IF в в функции переименования маленьких чисел похожа на фрактал. Но совершенно не редактируема, как литой кусок говна. Каждый раз, после ошибки, приходится переписывать ее занаво, т.к. не получается разобраться. Даже с комментами. Просто количество скобочек сбивает с толку. Мне кажется есть более лучшее решение.
>>691613 Аа, соррян, это ОП поменял описание недавно, наверное, а я не разобрался в твоём коде. Да, сейчас всё правильно работает с 40000: http://ideone.com/9LfriQ Но с 1000 работает неправильно, я выше ссылку давал. Надо это исправлять.
>>691628 Не хочется ковыряться вилкой в твоём коде: всё эти кавычки, конкатенация на пустом месте. Но алгоритм должен быть таким: 1. Прибавляем к $creditBalance проценты и $servicePayment. 2. Если получившаяся переменная меньше $monthlyPayment, то выплачиваем именно её и прибавляем её к $paymentTotal. После этого завершаем цикл. 3. Если получившаяся переменная больше или равна $monthlyPayment, то отнимаем от неё $monthlyPayment, продолжаем цикл. Это работает на любых суммах правильно. Самый естественный алгоритм.
>>691630 Ты как моя математичка - написала ебовую дробь и "ОЙ НУ ТУТ ТАК ПРОСТА И ПАНЯТНА ЧТО НИПАЙМЕТ ТОЛЬКО КАМАР". В итоге из 25 человек математику сдали нормально лишь трое, которые репетиторов нанимали. Я хер знает как на такой мелкий кредит сделать проверку. Он сразу соответствует двум критериям и действие выполнится дважды.
>>691640 >Я хер знает как на такой мелкий кредит сделать проверку. Он сразу соответствует двум критериям и действие выполнится дважды. Это значит, что ты перемудрил с решением. >if ($credit - $payment/2 < 0) Что? Что это вообще за чушь? Для чего нужно узнавать, когда разница суммы кредита и разделённой надвое суммы выплат будет меньше нуля? Чё-то ты загнался куда-то, попробуй сделать по алгоритму выше.
>>691640 Потому что я работаю, и если ты собираешься работать, будь готов что тебя пошлют нахер, при тупых вопросах и попросят показать, что ты уже пробывал.
Подсказка: На самом начале надо чекнуть, не больше ли сума месячного платежа, чем собственно говоря сам кредит.
>>691690 Почему тебе так сложно просто кодом изобразить вот этот алгоритм: >>691636 ? Всё же по полочкам разложено. Ты же вполне опытный мазафака (судя по привычкам конкатенировать строки в echo и другим моментам), должно легко получиться.
>>691705 Первое, что тебе надо сделать, это связать всё с "сумма кредита равняется к сумме кредита прибавить проценты и комиссию за пользование", без отнимания месячной выплаты. Это надо проверять: если больше месячной выплаты - всё продолжается, если меньше - выплачиваем и заканчиваем.
>>691713 Попробуй проще подходить к сути. Попробуй для себя расписать шаги, которые должна выполнять программа, мне очень помогает такое. Вот тут что надо сделать? 1. Прибавляем к сумме кредита 3 процента и 1000 рублей комиссии. 2. Если это больше месячной выплаты в 5000, то отнимаем от суммы кредита эти 5000, прибавляем к общим выплатам эти пять тысяч. Цикл продолжается. 3. Если это ("Прибавляем к сумме кредита 3 процента и 1000 рублей комиссии") меньше 5000, то выплачиваем только "это" - и всё прекращаем. Что тут такого непонятного? Мне слегка припекло от того, что я почему-то не могу объяснить тебе это, обычно получалось. Как было бы в реальности: ты прибавляешь к сумме кредита три процента и тысячу комиссии, а потом отнимаешь пять тысяч - месячную плату. Когда у тебя сумма кредита стала рублей 200-300, то ты снова прибавляешь к ней 3 процента и 1000 комиссии, а потом выплачиваешь только получившееся. Что тут непонятного-то?..
Алсо если ты уж взял доктрину, бери doctrine ORM. Чуть-чуть похимичив с аннотациями ты получишь готовый маппер, способный сохранять и загружать твои модели в базу.
>>691806 У меня в маппере собственно говоря две функции, зачем мне лишний раз грузить ORM, лол? И getLastId мне не нравится, ибо с двумя одновремнными загрузками могут возникнуть траблы.
>>691314 Нашел этот код в интернете. Спасибо, тогда перепишу сам, нормально. >>691245 Я менял подключение к базе по разному и через обычное INSERT INTO users VALUES, также использовал link->query(), не работало. Тогда лучшим вариантом будет переписать код самому.
В какую папку на убунту в апач нужно положить свой проект чтобы проверить его на виртуальном сервере? Убунту ставить буду позже, небольшой опыт работы с ней есть, хочу заранее знать как это реализуется.
ОП и другие крутые версталы, зацените верстку http://w99953g4.bget.ru/ Кнопки и ссылки не работают, все статичное, только нескучные обои и анимацию добавил. Там есть сомнительные моменты, но они и в макете такие. Под мобильные макета нет, на свое усмотрение там чуть столбцы подвигал при 320 и 640, шрифт и картинки уже лень подгонять. В последнем хроме и лисе вроде ничего не ломается. Джипег макета пикрил
>>691866 Почему в десктопном масштабе меню собрано в кнопку? Понятно, что там меню нет и это просто значок, но всё же. Также при уменьшении масштаба страница не становится похожей на твой макет - картинки-превью по ширине экрана располагаются, а всё остальное просто уменьшается. Нет жёлтого фона по сторонам, общий темный фон так и остаётся. Не могу загрузить картинку, тут скрин: https://gyazo.com/d0bc673a0579d1d20b0f3cccd441514c
>>691870 Плагины для жквери своровал, а так сам. >>691876 Фулстекобоярам верстка не нужна? >>691883 Меню в макете нет, а сам я не знаю как сделать красивые кнопочки. >Нет жёлтого фона по сторонам Это не часть макета, в psd его нет >картинки-превью по ширине экрана располагаются, а всё остальное просто уменьшается Честно говоря из макета я не понял как этот блок себя должен вести при масштабировании. Поправил только что на альтернативную версию, так лучше?
Начал заниматься год назад. Только недавно нашел работу. При этом занимался довольно дохуя и выполнил все задания (правда не все доводил до идеального состояния) кроме последнего. Освоил ООП, MVC, Симфони немного, микрофреймворк Silex, верстку (не охуенный кросбраузерный адаптив конечно, но все же), JS правда пока некогда занятся, но не думаю, что там будут проблемы. ЗП 20к. Нахуя так жить? Заем вы этим занимаетесь? Ожидаете зарабатывать 200к в час?
анчоусы, нужен скрипт, превращающий строку текста в картинку png, располагая текст посередине, рассчитывающий размер шрифта так, чтобы текст вмещался в установленную ширину пикчи. Как это все сделать и рассчитывать?
А как отлаживать PHP-код? Хочу просмотреть в процессе исполнения поэтапно в IDE Netbeans с точками останова и в красивом окошке. Выводить на страницу не подходит.
>>691705 Вы тут задачку из гайда Опа разбираете, с кредитом на айфон, я правильно понял? Я короче вот так решил: http://ideone.com/M5gkaB Добавил переменную последний_платеж которая юзается если остаток меньше или равен ежемесячному_платежу. Вышло в ноль, процент посчитан, комиссия за обслуживание тоже. Правильно сделал? Мимо только два часа назад начал читать гайд Опа, до этого код в глаза не видел.
>>692046 Можно сократить всё, чтобы два раза echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n"; не повторялось. >( $creditBalance * $percent ) + $servicePayment Вот это повторяется несколько раз, надо избавиться от повторов.
>>691924 это я знаю; просто не так сформулировал вопрос. Как рассчитать размер шрифта так, чтоб слово вместилось по ширине в пикчу (без переносов)? Например, ширина пикчи 100рх.
>>692047 Ну для ( $creditBalance $percent ) + $servicePayment* вроде как можно отдельную переменную ввести, или надо как то все реорганизовать? Не в курсе просто стандартов написания кода видимо не дошел еще. Вывод информации после срабатывания условия тоже вообще не представляю как не повторяя строку сделать видимо опять же еще не дошел. В целом то решение хотя бы близко к верному?
Суп, котаны. Подскажите, как организовать поиск в базе со связью "многие ко многим"? Вот у меня есть три таблицы, как этой пикче. Я хочу сделать следующее: выбрать все записи из таблицы items, которым в таблице items_filters соответствуют значения фильтров, которые передаёт пользователь. Хуёво сформулировал, поэтому вот небольшое пояснение. Например, если пользователь передал два фильтра с каким-либо filter_id (допустим, filter_id = 1 и filter_id = 2), то выбраться должны такие записи из таблицы items, которым соответствуют записи в таблице items_filters, у которых `items`.`item_id`=`items_filters`.`item_id` И `items_filters`.`filter_id`равняются '1' И '2' Опять нихуя не понятно, ну да ладно. В общем, я составляю запросы вот такого вида, но они, понятное дело, выводят объявления, где filter_id=1 ИЛИ filter_id=2 SELECT * FROM `items_filters` INNER JOIN `items` ON `items`.`item_id`=`items_filters`.`item_id` WHERE `items_filters`.`filter_id`=4 OR `items_filters`.`filter_id`=6 Если заменить OR на AND, то выводиться ничего не будет по вполне понятным причинам.
>>692065 Считает всё верно. Но надо стремиться к оптимуму, чтобы не копипастить и не делать лишних телодвижений в программе. >Вывод информации после срабатывания условия тоже вообще не представляю как не повторяя строку сделать Просто echo должно быть за пределами всех условий.
>>691866 Добротно, про мобильность уже сказали, я бы просто забил на нее и сделал без нее, если уж полноценно ее не поддерживать. лучше никакой чем хуевая
>>691256 >аватарка знакомая maketi.esy.es Может вспомнишь так :3 Ну да ладно, не важно.
>Писать свое - хорошая идея, но надо все равно продолжать учиться. А я и не забрасываю. Просто буду учить параллельно и по мере необходимости что-ли.
>То есть тебе нужен как минимум PHP. Причем если делать чат серьезно, с сокетами и асинхронщиной, то придется еще изучать эти сокеты и сетевое программирование. Путь не короткий. Ну значит приступаю к твоему учебнику по PHP, наконец.
Ну вот опять какое-то слово мудреное принес ахах, для меня "сокеты" это алмазики из WoW, которые в доспехи вставлять надо.Тред не зашкварен, лет 5 назад играл.
Сложновато чутка перестраиваться в PHP после JS и вот вопросы которые у меня возникли по твоему учебнику. Вот задача на игру в кубики. https://ideone.com/uufpgm
1)В строке где показываем выпавшие номера переменные заключены в фигурные скобки. Для чего? Только для читаемости?
2)Так же в if при перечислении нескольких условий, они заключены в скобки. Это обязательно?
3)Так странно эти переносы строки выглядят посреди текста. Не легче ли там сделать два эха на выпавшие у анона и компа номера, а то общая строка меня смущает и длиной и этими переносами. Или типа лишние действия не нужны, зачем усложнять, все будет медленнее работать и все такое?
>>692131 >В строке где показываем выпавшие номера переменные заключены в фигурные скобки. Для чего? Только для читаемости? Фигурные скобки нужны чтобы разделять переменные и текст, когда идет подставление. Представь ситуацию когда нужно вывести переменную и рядом с ней поставить какой-нибудь символ не ставя при этом пробел. Тут есть несколько способов, но если нет желания использовать конкатенацию строк (во втором посте про неё написано, кстати) то можно сделать вот так >echo("Example {$variable}string");
>2)Так же в if при перечислении нескольких условий, они заключены в скобки. Это обязательно? Это не совсем понял. Если подразумеваешь вот такое >if($foo == true && $bar == false) То там не нужны скобки.
> 2)Так же в if при перечислении нескольких условий, они заключены в скобки. Это обязательно? Чтобы не надо было гадать, какой порядок выполнения операций и лезть в мануал, мы ставим скобки и задаем его явно.
> Не легче ли там сделать два эха на выпавшие у анона и компа номера, а то общая строка меня смущает и длиной и этими переносами как хочешь, так и делай.
Хороший вопрос у тебя, прямо хоть в задачи добавляй. Аноны, кто изучает mysql, почитайте вопрос, предложите свои варианты.
Твоя задача, так же как и многие другие решается аналогично - джойним, отбираем строки с помощью WHERE, группируем, фильтруем группы через HAVING
Соответственно ответ направшивается сам собой:
- либо в WHERE поставить OR а потом через HAVING выбрать группы содержащие ровно 2 строки - либо в HAVING написать условие что группа должна содержать И первый id, и второй
И есть еще третий вариант. Ты можешь приджойнить таблицу item_files 2 раза и записать 2 условия в WHERE. Это может быть выгоднее в плане производительности за счет использования индексов. А может и нет - надо тестировать
Если тебе не понятны эти варианты, тебе стоит подучить теорию, например решить нашу заадчку на лайки в уроке по mysql из ОП поста.
>>692171 Я не понял его вопрос. Нужно выбрать все items, которым соответствуют filter_id 1 и 2? Почему не написать тогда WHERE IN? SELECT i.* FROM items i JOIN items_filters fi ON i.item_id = it.item_id WHERE filter_id IN (1, 2)
>>690343 Дальше стал изучать самостоятельно. Немного про сети почитал. От компа по кабелю бегут импульсы, коммутатор их считывает, читает мак адрес. Если такого хоста нет в коммутаторе, то он рассылает на все порты полученный фрейм и ищет нужный. Дальше 3 уровня я не вижу, где IP. По сути ведь коммутатор передаст на хост фреймы и все. Где 3й уровень? Знаю, что далее фрейм инкапсулируется в IP-пакеты, при этом стирается предыдущий заголовок с мак адресом и записывается новый с IP-адресом. Читаю теорию сетей, об устройстве интернета, и в голове каша. Немного про вланы почитал, интересно все это. Я хотя бы немного стал понимать как оно все работает на физическом уровне. Вообщем, ОП, такие дела, помоги мне разобраться.
Кевин Янк "ПХП и МУСКЛ от новичка к профессионалу"
Страница 134. Связь многие к многим ... Таблица jokecategory связывает идентификаторы шуток jokeid и категорий categoryid. Таблица joke содержит шутки. Таблица category содержит категории. ... Теперь, когда промежуточная таблица готова (jokecategory) и содержит назначенные категории, вы можете использовать оператор JOIN, чтобы сформулировать несколько интересных и практичных запросов, например вывести список всех шуток в категории «О д'Артаньяне». SELECT joketext FROM joke INNER JOIN jokecategory ON joke.id = jokeid INNER JOIN category ON categoryid = category.id WHERE name = "о д'Артаньяне" Как видите, в этом запросе используются два оператора JOIN. Первый объединяет таблицы jоке и jokecategory , а второй берет готовые данные и объединяет их с таблицей category .
Следующий запрос выводит список категорий, в которых содержатся шутки, начинающиеся словами «сколько адвокатов». SELECT name FROM joke INNER JOIN jokecategory ON joke.id = jokeid INNER JOIN category ON categoryid = category.id WHERE joketext LIKE «Сколько адвокатов^»
>>692330 >if ($credit + $komissiya < $payment) А где же проценты? Почему ты не пытаешься сделать так, как я предлагал выше? Самый же простой и естественный алгоритм? Какого, спрашивается, хера? Также без этой задачи ты не сможешь правильно решить следующую - кредит на Айпад. Я сам сидел с ней целую неделю. Это стоит того.
В общем нужно сделать следующее. При клике на элемент страницы должно меняться содержимое другого элемента, например нажимаю на чекбокс - меняется число в другом элементе на нужное мне и все это без перезагрузки естественно. Видимо это Ajax. Думаю там пару строчек кода, но я не шарю в JS абсолютно. черканите как это реализовать.
>>692330 >$credit = $credit + ($credit * $stavka); >$credit = $credit - $payment + $komissiya; Это вообще что за бред? Вот твоя тенденция всё усложнять идёт от кучи кавычек и конкатенации через идиотские названия у переменных и усложнение вычислений. Будь проще, и всё получится.
>>692339 Да, я увидел потом. Это как-то всё странно, не нужны такие усложнения. Просто попробуй в if и else расписать тот алгоритм, который я выше тебе расписал.
>>692340 если элемент не передается в форму никакую (да и если даже передается) $('selector).click(function(){ $('anotherSelector').val() или $('anotherSelector').html() });
>>692343 Это как в универе, когда учился, дали задачу школьную, где все решение было в 1 строчку, а мы давай матрицы строить, графики, системами уравнений решать
>>692344 В val() передавать то что мне надо? Например есть такое <div class="data">100</div> При нажатии на чекбокс мн нужно чтобы к тому что в диве прибавилось 10. Что тогда в val() писать?
>>692345 Не нужно вычитать платёж сразу! Я же писал тебе два раза!
>>692347 То да. Но я сам через такое же прошёл с этой задачей в конце прошлого года, могу понять братишек. Я помню почти все значения $creditBalance наизусть, кроме копеек, конечно, я не настолько поехал.
>>692358 Надо это делать внутри условия. Если это больше месячной платы - вычитаем месячную плату. Если это меньше месячной платы - вычитаем только это. Всё, больше ничего тут не нужно.
>>691323 > $auth = $regHelper->getUpdatedFields($auth, $student); >Это на мой взгляд можно было сделать лучше. Не создавать отдельный объект студента для передачи в update, а передавать туда $student. Алсо, название переменной auth плохое. Там идея была в том, чтобы загрузить студента из БД, и заполнять его из POST, только если в форме присутствует поле, ты мне об этом писал пару тредов назад. Проблема была из-за того что объект студента все равно заполнялся из формы, независимо от того авторизирован он или нет. И для этого я сделал отдельный объект студента который никак не менялся (кроме как перед заполнением). Сейчас я сделал по другому - чтобы не менять весь алгоритм заполнения формы, я немного поменял функцию заполнения модели студента из POST. Наверное так нужно было сделать с самого начала, просто я об этом тогда не подумал.
>Давай поскорее добьем задачу и пойдем дальше. У меня почти готов файлообменник на слиме, я делал его паралельно с студентами, там осталось только мелкие баги пофиксить и комментарии к файлам доделать. Пользуясь случаем, задам пару вопросов про оформление на гитхабе и поиск. 1. Я сделал поиск через сфинкс, нужно ли в репозиторий включать мой sphinx.conf с настроенными индексами, или лучше оставить все заполнение для людей которые будут устанавливать приложение? 2. Так же, переиндексацию я сделал через cron, для этого пришлось написать CLI скрипт на PHP который очищает реалтайм индекс при переиндексации (как очистить rt индексы из командной строки я не нашел). Нужно ли включать его в репозиторий (с bash скриптом для крона) или опять же, это оставить для тех кто устанавливает? 3. Если приложению не удалось подключится к поисковому демону (сфинкс просто не устанавливали, например), в этом случае достаточно будет вывести ошибку 503 и написать что подключения к демону нет, или лучше будет на странице с поиском вывести заглушку "Поиск временно недоступен" с кодом 200 и основной навигацией приложения?
>>692415 Нет. Тут же написано http://php.net/manual/ru/function.array-rand.php#refsect1-function.array-rand-returnvalues >При выборе только одного элемента, array_rand() возвращает ключ для случайного элемента. В твоем случае переменная $random будет случайным ключом из массива $answers. Потом ты конечно можешь написать так >echo($answers[$random]); Но это уже усложнение, там в мануале еще и примеры использования функции есть.
>>Это одномерный массив, двухмерный это когда массив в массив вложен. >>Плохо что исправления - в отдельном массиве, легче ощибиться... >>Выражения для зделал/зделаю можно собрать в одно.
>>692462 >>Это не чат! Пожалуйста не флудите, а старайтесь постить только вопросы, решения и ответы. Сколько лет вы не можете найти работу никому не интересно. Высказывайтесь одним большим постом а не цепочкой мелких
>>692245 Если использовать твой пример, то должно получиться следующее: я хочу отобрать шутки, которые относятся сразу к нескольким категориям. >>692171 Ну, я тоже подумал про подобный метод. Считать количество фильтров, передаваемых пользователем, затем выбирать группы, содержащие столько строк, сколько передано фильтров. Джойнить два раза - зачем? А если будет передано десять фильтров? >>692208 Получается то же самое, что и при использовании OR в условии в моём запросе.
>>692541 Скрыл твой пост из-за ожидания собственного бугурта. Советов ты не слушаешь, делаешь всё так, что ни черта не понятно. Пусть аноны с более крепкими сраками тебе помогают.
>>692556 >>692559 Очевидно он не поставил точку с запятой после скобки. И интерпретатор об этом написал, кстати. Очень плохо что ты не умеешь или не хочешь понимать сообщения об ошибках.
>>692576 Пробелы-то надо убирать из того текста, который получился у нас после перевода в нижний регистр. Где логика в твоём решении? >>692576 break поставь. Только от этого не исправится неправильное решение.
>>692585 Там нужен Break, но совсем не для того, чтобы >убрать повторение того, что выводиться в echo Сейчас он поставит его бездумно и у него echo будет выводиться один раз, как он и хочет, но не потому что так правильно, а потому у цикла будет всего одна итерация.
А так почему не правильно? http://ideone.com/IgCOr6 Может ли быть из-за того, что сравниваются только первый и последний символ? При сравнение не увеличевается число?
>>692591 Хм, что-то не пойму тебя. Там именно нужен break и в правильном решении. Потому что как только символы не совпали - всё, выходим из цикла и выдаём "Не палиндром". Именно в этом условии - когда символы не равны друг другу, а не в другом условии, когда они равны.
Анончик, ты конечно красивую картинку добавил, но так и не написал что значат в твоем графе цифры на вершинах и связах. Вот вершина с цифрой 8 - это что? Сумма?
Ну ептить. Проблема кредита в айфоне была в том, что я последний платеж считал не верно. Тьфу. Нужно было всего-то создать переменную с последним значением кредита с % и комиссией и вычесть ее из суммы остатка кредита.
>>692667 > Вот вершина с цифрой 8 Эта заданная сумма. Следующая вершина, это заданная сумма минус номинал банкноты (вес связи) и т.д. до нуля, причем подсчитывая сколько раз взяли банкноту. Вообще это херовый вариант.
Фронтенд-макака, не занимавшаяся бекэндом, вкатывается. Как можно реализовать такую хуйню: сервер получает json с определенными данными и создает отдельный файл с содержимым json на стороне сервера?
Пасаны, как вам? http://www.emoji.esy.es/ [кто не понял, выбираем смайлики и пишем текст — получаем код, который можно вставить в личные сообщения вк или в комментарии к записям, например]
В Апаче должен быть модуль-посредник, который будет передавать запросы интерпретатору PHP на выполнение. И он должен быть включен и настроен в конфиге: http://php.net/manual/ru/install.php
Насколько я помню, в убуте/дебиане это все делается автоматически при установке пакета php5-apache2 - поищи пакеты, содержащие в названии оба этих слова.
Я тот, кто присылал класс Announcement на рецензию. Внимательно прочитал ваши ответы, вы меня разгромили. Скачал с рутрекера книжку про ООП в PHP. Намереваюсь осилить. http://rutracker.org/forum/viewtopic.php?t=5109503 Годнота?
>>692927 Стремно грузится - пропиши смайликам ширину/высоту. Не очень ясный интерфейс. Алсо, ничто не мешает тебе сделать предпросмотр. И показывать не код смайлика в полях, к тому же испорченный, а сам смайлик. Ну и буквы жуткие получаются.
Помогите, аноны. Меня все еще интересует как получить значения (из value="значение(int)") всех отмеченных чекбоксов на странице через Джабаскрипт. Все что нагугливаю не работает(((
>>692951 >Насчет предпросмотра не очень понял — это как? Ну что тебе мешает обновлять не значение value поля, а src картинки? Чтобы вместо поля был смайлик. Код ничего не говорит человеку.
<script> var checked = document.querySelectorAll("input[type='checkbox']:checked"); for (var i = 0; i < checked.length; i++) { str+=checked.value; } alert(str); </script>
Аноны, решаю учебник, дошёл до Толстого, начал решать - получилось вот это http://ideone.com/fBOwbB Хоть всё и работает, я уверен, что это единичный случай, который развалится, если добавить к нему хотя бы одно слово. Поясните чем можно сократить код так, чтобы не пришлось прописывать рандом для каждой переменной.
Я слышал в языках с отступами инлайновые теги вроде span неудобно писать.
Ну и мимопроходя, замечу что в верстке странно расставлены теги (h1-h2-h3-h4 - заголовков больше чем обычного текста), подозрительно много дивов и бессимтемно составлены названия классов
> Сделано в предыдущей части задания в 2 вариантах. Старые версии задачи я проверил в старом же треде.
>Может быть можно было одним выражением, но прогнал дважды через preg_replace, вернее скормил ему массивы. > Первый раз заменяем пробелы, скобки и проч.символы на пустую строку; второй раз заменяем +\s?7 на 8. Можно и так, почему нет. Нормализация номеров сделана верно.
> Мы кажется в итоге пришли к выводу, что сейчас в имени почты может содержаться что угодно В общем да, так же как и в телефоне. Тут такие аргументы:
- если это поле ввода которое будет читать человек то надо минимально его ограничивать - тот же номер телефона можно написать в разном формате - с другой стороны, валидация может помочь в случаях когда человек опечатался и например ввел вместо 10 цифр номера только 9.
Здесь мы ищем емайл в тексте - нужно определиться с правилами.
Ты плохо знаешь PDO и это мешает тебе полноценно использовать его возможности. Полистай мануал по нему, может что интересное найдешь: http://php.net/manual/ru/book.pdo.php
Как минимум цикл с fetch бессмысленный - это можно сделать лучше.
Насчет статических методов и бессмысленных классов вроде Db::connect - избавляйся от них. Я знаю, такой код можно увидеть в других учебниках, но это лишь говорит о том что их авторы не осилившие ООП.
Ты ее взял очевидно из кода в учебнике. Но там специально дан неправильный код, и именно эта строчка неправильная, так что не надо было ее копировать. И все почему-то ее копируют, только потому что она там была в исходном коде, хотя я специально написал ее неправильно и копировать ее как раз не надо.
Лучше всего написать код самому.
Твой код потому неправильно работает и дает неправильный ответ, должно быть 61270.
Вот правильный алгоритм:
- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!) - если остаток маленький, выплачиваем сколько осталось и уходим - иначе платим 5000
> // не могу придумать внятное имя В линуксовой программе grep это называется context - думаю, хорошее название, даже по русски говорят "в каком контексте (=окружении) встречается это слово"
Вообще, контекст конечно можно еще реализовать по другому. У функции preg_match_all есть опция, которая при нахождении совпадения возвращает отступ от начала строки в байтах. Можно преобразовать этот отступ в число символов и взять N символов справа и слева. Но это сложно.
> .{0,{$offset}}\b\w[жш]ы\w*\b. Вот сложновато, я бы просто написал .{0,$offset}[жш]ы.{0,$offset}
OSI это именно что теория, 7 уровней это не значит что в любом протоколе из ровно семь, то есть часть уровней может отсутствовать. Но польза в том что эта теория определяет названия для этих уровней, ну и вообще, позволяет разобрать почти любой протокол на уровни.
1) изучи команду tracert/traceroute. Возьми какой-нибудь сервер, например reddit.com, и определи через какие города и страны идут пакеты от тебя к нему. С помощью traceroute ты определяешь путь, а далее с помощью whois (например whois7.ru) определяешь местоположение узлов.
Попробуй сделать traceroute для узла bad.horse
Понимаешь ли ты алгоритм работы программе traceroute? Как она определяет путь?
2) посмотри что выведет команда ipconfig, route print, arp -a (если ты под windows) или ifconfig, route -n, ip route list, arp -a под линукс. Понимаешь ли ты что такое маска сети? Зачем она нужна? Шлюз по умолчанию? Зачем нужен ARP? Как компьютер получает сетевые настройки когда подсоединяется например к вайфай сети?
Как работает DHCP? Есть ли риски безопасности при использовании DHCP в публичной сети? Может ли сетевая карта иметь несколько IP адресов? Может ли компьютер иметь несколько IP адресов? Видит ли гугл твой MAC адрес когда ты заходишь на его сайт? Видит ли гугл IP адрес твоей сетевой карты? Зачем нужен NAT? Что такое "серые" IP? Легально ли их использование?
Как NAT понимает, кому в локальной сети передавать приходящие из интернета пакеты если они все адресованы одному и тому же IP? Какой у него алгоритм работы?
Зачем нужен маршрутизатор/роутер? Можно ли подсоединить к интернету больше 4 млрд устройств (то есть больше числа возможных Ipv4 адресов)? Чем Ipv6 оличается от IPv4? Работает ли у твоего провайдера IPv6? Правда ли что UDP лучше чем TCP и скоро заменит его?
Что такое автономная сеть (AS)?
Можешь ли ты кратко (кратко!) написать что происходит когда ты пытаешься соединиться с удаленным хостом, например через telnet google.com 80? Какие пакеты отправляются и что с ними происходит? Какие протоколы используются? Кратко.
3) соединись с каким-нибудь сайтом через telnet/netcat и отправь вручную GET запрос, если конечно ты раньше этого не делал. Команда выглядит примерно как cat request.txt | nc -vv google.com 80 или telnet google.com 80 < request.txt
В одной консоли открой любой порт на прослушивание, в другой консоли подсоединись к нему и перешли какую-нибудь строку.
5) освой программу wireshark (c ГУИ, кроссплатформенный) либо tcpdump (линукс, консольный). Изучи, какие пакеты принимает и отправляет твой компьютер. Позапускай разные программы и посмотри, что они шлют в интернет. Попробуй через telnet/netcat куда-нибудь соединиться и что-нибудь отправить, попробуй сделать ping или traceroute. Также, возможно ты увидишь широковещательный мусор который шлют твои соседи по сети провайдера (если только ты не за роутером).
В Wireshark ты видишь заголовки разных уровней: и заголовки протокола TCP, и IP, и Ethernet заголовки, в которые пакет завернут как луковица.
Собака уберет не только варнинги но и настоящие ошибки. Это не то что нам надо.
> Но ведь DOM тоже не имеет автомата для выреза такого шлака. Через DOM я могу только перебрать аттрибуты. DOM дает удобное представление кода в виде дерева. Можно написать легкий и понятный алгоритм обхода этого дерева и его трансформации. Например, если я хочу добавить удаление атрибута, я могу написать просто
$node->removeAttribute('x');
Твой код не дает удобного представления. Малейшие изменения требуют анализа твоего конечного автомата, проектирования нового, тестирования. То есть из-за того что твой код не понятен и не нагляден, работа с ним требует больше времени. Это может и оправдано если ты перерабатываешь гигабайты кода, но мне кажется это не так.
Ну представь простое правило. Например, если после тега h1 идет div с классом .some-div, то надо добавить их общему родителю класс .has-h1-and-some-div. Или например запрет на размещение картинок внутри тега h1. В DOM это решается довольно простым и читаемым кодом, а что насчет твоего подхода? Рискнешь такое напсиать?
То есть DOM дает нам удобный способ работы с деревом. Ты пишешь, что что-то там неудобно - но скорее всего ты просто невнимательно изучил эту библиотеку. В сравнении с уровнем на котором работает твоя программа (уровень лексического анализа) - это небо и земля, это позволяет быстрее и проще писать код.
И код очистки тегов/атрибутов по списку, написанный на DOM, будет простым и лаконичным. Алгоритм там такой:
Загружаем HTML код в дерево
Обходим дерево, для каждого узла: - если это запрещенный узел, удаляем его, оставляя содержимое - если это разрешенный узел, обходим атрибуты, для каждого -- есди это запрещенный атрибут, удаляем -- если разрешенный, и содержит ссылку, проверяем ее формат
Выгружаем дерево в HTML
Вот посмотри на этот алгоритм. Это 2 цикла + 2 ифа. Там конечно будут вспомогательныей функции, но сам алгоритм элементарен. Я его написал не думая за полминуты. Твой алгоритм можно описать за полминуты? В этом сила ДОМа. Плюс, там есть XPath (а поверх него можно реализовать поиск по CSS селектору).
На эту модель можно натягивать более высокоуровневые протоколы - например REST API, поверх HTTPS, который передает данные поверх SSL, работающем поверх TCP/IP. Для REST API транспорт это HTTPS.
> От компа по кабелю бегут импульсы, коммутатор их считывает, читает мак адрес. Если такого хоста нет в коммутаторе, то он рассылает на все порты полученный фрейм и ищет нужный. Тут есть 2 уровня: Ethernet и IP.
Ethernet - это технология связи небольшого числа близко расположенных компьютеров в локальную сеть. Мы ставим коммутатор, и кабелями втыкаем в него компьютеры (в древние времена коммутаторов не было, был просто один общий кабель, к которому подключались компьютеры). Теперь они могут пересылать друг другу пакеты по MAC адресу (это серийный номер сетевой карты, гарантированно разный у разных устройств). Принцип работы примерно такой:
- узел хочет отправить пакет. Он берет полезные данные, приписывает спереди к ним заголовки (формат пакета посмотри в википедии сам) и отправляет пакет в сеть. Этот пакет получают все сетевые карты, подсоединенные к ней, и они сравнивают адрес назначения со своим мак-адресом. Если совпадает - пакет принимается, и сетевая карта уведомляет процессор о его прибытии. Если нет- пакет отбрасывается - также, есть специальный широковещательный адрес - пакет с таким адресом принимают все компьютеры - также, сетевую карту можно перевести в отладочный (promiscious mode) режим и она будет ловить все пакеты
Теперь твоя очередь подумать и ответить на вопрос:
- чем ограничено число компьютеров в сегменте Ethernet и макс. расстояние между ними? - что поменялось после замены общего кабеля на коммутатор? Я понимаю, что ты можешь не знать как он устроен, но подумай, каким преимущества у него могут быть?
Давным-давно были чистые Ethernet-сети (например сеть внутри компании), без других протоколов вроде IP, но сейчас конечно их никто в чистом виде не использует.
> вланы Влан это просто имитация рздельных ethernet сетей программно. То есть пакеты идут по одному кабелю, но коммутатор фильтрует их, и не позволяет узлам из одного влана общаться с узлами из другого, создавая видимость что у нас 2 несвязанных отдельных сети. Все это делается прозрачно для узлов, они не могут никак проверить реально ли они изолированы или просто в отдельном влане.
Идем далее, на уровень IP. Протокол IP позволяет нам связать несколько сегментов Enternet в одну общую IP-сеть. В отличие от технологии Ethernet, число компьютеров в этой сети и расстояние между ними может быть большим - например на нашей планете есть глобальная IP-сеть с миллиардом подключенных к ней устройств. Каждое напрямую подсоединенное устройство имеет уникальный IP адрес и любые 2 устройства могут обмениваться пакетами, указав адрес назначения. Адреса распределяет IANA и это гарантирует их уникальность.
Поскольку ethernet пакет не содержит полей для указания IP адреса, придуман Ip пакет, который вкладывается внутрь ethernet пакета. Почитай в википедии подробнее.
Формально Интернет - это объединение автономных сетей. Автономная сеть - это сеть, которая принадлежит одной организации. Например, сеть провайдера или сеть крупной компании. Организации договариваются об обмене трафиком и таким образом автономные сети объединяются в интернет. Интернет - это не телефонная сеть у которой есть центр и один владелец. Это объединение независимых сетей.
Сети связываются таким образом: между 2 или более соседними ethernet сегментами ставится маршрутизатор (роутер), имеющий 2 или более сетевых карты. Он позволяет пересылать пакеты между сетями. Маршрутизатор знает о соседних маршрутизаторах и знает куда надо переслать пакет в зависимости от его IP адреса. Более того, схема связей может перестраиваться - например при аварии в одном ethernet сегменте роутер может посылать пакеты через другие сегменты. За это отвечают протоколы вроде BGP.
Я выше написал что интернет - это огромная IP-сеть из множества узлов. Но вообще, кроме основной глобальной сети есть еще множество локальных IP-сетей - например внутренняя сеть провайдера. Это что-то вроде отдельного "интернета" в пределах города. В ней могут быть свои "серые" IP адреса, которые не имеют прямой связи с узлами в интернете. Локальная сеть может соединяться с глобальным интернетом через NAT, который позволяет внутренним узлам отправлять пакеты наружу.
Вопросы:
- опиши кратко алгоритм работы роутера сязывающего 2 сети - есть ли у коммутатора IP адрес? У роутера? - каким образом компьютер в IP сети узнает свой IP адрес? - опиши что делает ОС когда программа просит ее отправить IP пакет с такими-то данными на такой-то IP адрес - если в сегменте ethernet упадет маршрутизатор, связывающий его с другими сегментами, смогут ли узлы в этом сегменте пересылать пакеты друг другу? - что если компьютер получает пакет в котором указан его мак-адрес, но не его IP? Или наоборот, его IP, но не его мак? - что такое маска сети? - что такое широковещательный IP адрес? В чем отличие от широковещательного мак адреса?
Айпад в кредит. https://ideone.com/e8QRaC Все думал, почему же не работает. Только перечитав дошло, что в отличие от JS функции в PHP не видят внешних переменных.
Народ , поясните за связи в БД , пожалуйста.. Покажите лайтовый примерчик , что бы я понимал , что да как. Есть у меня допустим таблица новостей , а в ней поле category, и как мне сделать что бы category зависело допустим от другой таблички , и я сюда бы просто подставлял 1/2/3/4/ , а оно брало инфу из другой таблицы?
Пиздец блять, охуенно порешал задачку про айфон. Сидел, тупил, расплакался из-за своей тупости, умылся, забил. У меня даже мысли в голове выстроить не получается, одна каша в голове, а теперь она ещё и болит. Завтра ещё попробую, когда голова пройдет. Если это для тех, кто с нуля, то я, наверное, пиздец дебил.
Почему все так хвалят PHPstorm? Забагованная же прога. Даже в этом треде 100500 раз упоминалось что некоторые вещи только из-за него и не работают. При этом есть хайп, есть рекомендации от хороших лекторов...
Я вспоминаю только баги с встроенным пхп-сервером, но тебе ничего не мешает взять и поставить отдельный LAMP-стэк и деплоить свои приложения туда.
Пхпшторм очень мощная ИДЕ в которой есть интеграция практически со всеми фреймворками разного назначения, начиная от PHPUnit, заканчивая устаревшими версиями какого-нибудь Codeigniter. Ну и так как это ИДЕ, там присутствуют многие другие функции которых ты не найдешь в обычном текстовом редакторе.
А вообще это дело вкуса, мне например удобнее писать в редакторе, деплоить, тестировать и дебажить отдельными средствами.
http://learn.javascript.ru/xhr-longpoll не понял как тут реализована серверная часть? Куда сохраняются сообщения? Допустим я хочу сделать серверную часть на пхп, мне ведь нужно вставлять записи в бд или хотябы в файл, чтобы другой юзер мог получить его гет запросом. Тут это выглядит так, будто один пользователь отправляет сообщение напрямую другому, без сохранения куда-либо.
Fixview у меня теперь без htmlspecialchars, я его записываю вручную на выходе, поэтому на входе эту функцию оставляю.
> Также функция подсветки должна правильно делать htmlspecialchars, чтобы символы вроде & или < в HTML коде выводились корректно. Как сделать так чтобы htmlspecialchars не съел тег <mark>? Я пропускаю два значения через функцию paintFound заранее, а только потом его вставляю. Правильно?
Пикрелейтед 1. Пришлось поставить public свойства вместо private, потому что в последнем случае (private свойства) при добавлении модели и превращении ее в массив в ключи влезает имя класса, что вызывает у pdo ошибки. Могут ли свойства быть public или таки неправильно?
Добавил удаление лишнего пробела для строки запроса из двух слов вида "Иван Иванов". Так же смог конкатировать несколько столбцов по совету анона из прошлого треда и теперь тот самый иван иванов у меня находится и обводится(появился explode в ViewHelper::paintFound. Обводится Иван Иван(конец обводки)ов.
> require_once "../autoload.php"; > require_once "../src/config.php"; > require_once "../src/ini.php"; > Мне кажется хватило бы одного реквайра. Первые два рекваера делаются в последнем.
Переделал регулярку на имена чтобы новая возможность функции fix_view убирать лишние пробелы использовалась не только в поисковых запросах. Т.е. при регистрации имени ПробелПробелИван валидация пройдет в отличии от прошлого кода, эти два пробела сами уберутся.
> Проще сделать наверно через min/max. Или сделать функцию исправления числа страниц, которая проверит что она принимает разрешенные знаечния. Перенес условие как метод в pager.
Остальные советы тоже постарался сделать, просто не все расписал. Боюсь неправильно исключения сделал, хотя вроде работает.
>>693271 Ты ведь не в голове решал - показывай код, поможем разобраться. Эту задачу многие не могут решить с первого раза. Неделя над ней, когда идёшь с нуля, - это норма.
Почему стили в линуксе не удается в слиме подключить. стили лежат в одной папке со вью, пробую добавить __DIR__ все равно не видит. <!DOCTYPE html> <head> <link href="style.css" rel='stylesheet' type='text/css'/> <title>GuestBook</title> <meta charset="UTF-8">
>>693508 Открой дебаггер в хроме и посмотри куда указывает ссылка. Если браузер что-то не может загрузить, ошибка вместе с ссылкой будет в консоли. От этого уже сможешь понять что у тебя не так, и указать абсолютный путь, если нужно.
>>693121 >>693124 > каждая подключеннная к сети сетевая карта имеет уникальный IP адрес Уникальный ли? Я уже встречал такое, что файлообменник ругался на то, что с моего айпишника уже качали и надо подождать.
> это серийный номер сетевой карты, гарантированно разный у разных устройств Как раз читал, что теоретически - да, но практически бывали случаи совпадения.
> Понимаешь ли ты алгоритм работы программе traceroute? Как она определяет путь? traceroute посылает ICMP-пакеты на близжайший маршрутизатор со значением "время жизни" равному 1. Далее маршрутизатор отправляет обратно ответ, что "время жизни" пакета истекло, и он не в состоянии отправить его дальше. Таким образом traceroute увеличивает каждый раз "время жизни" пакет на 1, и соответственно пакет достигает более дальнего маршрутизатора. Пакет достигает конечного хоста, при этом в ICMP-пакете указан заведомо несуществующий порт, поэтому хост отдает ответ, что порт не доступен. По такому сообщению traceroute и узнает об окончании трассировки. Все верно я понял?
> посмотри что выведет команда ipconfig, route print, arp -a (если ты под windows) или ifconfig, route -n, ip route list, arp -a под линукс ifconfig выводит мои сетевые интерфейсы, один из которых так называемый loopback. Я правда не совсем понимаю, доходит ли пакет до маршрузитора, когда я отправляю пакет по адресу 127.0.0.1. В теоретической части я читал, что если пакет адресата содержит тот же мак-адрес, то маршрутизатор его отбрасывает. Считается, что данная информация (в пакете) уже известна хосту.
route -n что-то не то выдает. У меня внутренний ip адрес своей сети, который у каждого офиса в здании свой. В gateway адрес маршрутизатора, куда отправляются пакеты. А route -n выводит Destination 0.0.0.0 почему-то, но Gateway кстати верный.
А вот ip route list как раз все верно выводит, gateway и мой внутренний ip.
arp -a указывает куда я как раз шлю пакеты.
> маска сети Маска сети помогает найти границы подсети. Не помню как вычисляется. Вроде логическим умножением.
> Шлюз по умолчанию? А шлюз это же gateway? Куда все офисное здание шлет пакеты. Свитч?
> Зачем нужен ARP? Сейчас в википедии прочитал. Так это как раз то, о чем я и писал. Если адресат еще неизвестен в коммутаторе, то он отправляет широковещательный запрос на все порты, и ему откликается тот новый хост, передавая мак адрес. Теперь у коммутатора получается полная таблица соответствия мак адресов, айпишников и портов, ну и вланов вроде. Больше коммутатору не нужно будет отправлять широковещательный запрос.
> Как компьютер получает сетевые настройки когда подсоединяется например к вайфай сети? Вот этого я не знаю. Компьютер наверное отправит пару пакетов, получит ответы и готово.
> Как работает DHCP? DHCP-сервер это провайдер? При подключении кабеля, он мне автоматически отправляет ip, dns сервер, шлюз?
> Есть ли риски безопасности при использовании DHCP в публичной сети? Вот этого я не нашел, но логически понятно, что можно перехватить настройки, и как этим воспользоваться, наверное.
> Может ли сетевая карта иметь несколько IP адресов? Наверное нет.
> Может ли компьютер иметь несколько IP адресов? Компьютер да. Изначально уже есть 2 IP-адреса. Локальный и публичный.
> Видит ли гугл твой MAC адрес когда ты заходишь на его сайт? Нет, потому что на канальном уровне заголовок с MAC-адресом перезаписывается на IP.
> Видит ли гугл IP адрес твоей сетевой карты? Да, виден. А нет, может и нет. Прочитал следующий вопрос. Прочитал про NAT. Теперь да, смотря как компьютер подключен к сети, через NAT или нет.
> Зачем нужен NAT? Наверное потому что публичных айпишников ограниченное количество. И теперь понятно почему на некоторых файлообменниках мне писали, что с такого айпишник уже качали и нужно подождать.
> Что такое "серые" IP? Легально ли их использование? Ну вот как раз айпишники, которые за NAT. И да, более чем легально, я полагаю.
> Как NAT понимает, кому в локальной сети передавать приходящие из интернета пакеты если они все адресованы одному и тому же IP? Какой у него алгоритм работы? Когда роутер принимает пакет, то он на лету меняется IP-адрес отправителя на свой, а также записывает номер порта, чтобы различать присланные пакеты от разных компьтеров. Когда принимает ответный пакет из интернета, то меняет свой IP-адрес на адрес твоего компьютера. Вся эта информация содержится в некой таблице, базе данных, запись в которой стирается после закрытия соединения.
А влияет ли это на скорость, ОП?
> Зачем нужен маршрутизатор/роутер? Чтобы соединять сегменты сети друг с другом? Посылая запрос, например, гугл, пакеты проходят через огромное множество маршрутизаторов, пока не дойдут до пункта назначения.
> Можно ли подсоединить к интернету больше 4 млрд устройств (то есть больше числа возможных Ipv4 адресов)? Ну да, для этого и используют NAT.
> Чем Ipv6 оличается от IPv4? Количеством цифр в адресе?
> Работает ли у твоего провайдера IPv6? Да.
> Правда ли что UDP лучше чем TCP и скоро заменит его? Лучше в плане скорости, но UDP не отвечает за надежность доставки пакетов.
ОП, я что-то тогда не понимаю. У нас все офисное здание за NAT. Так вот google как то умудряется забанить только один компьютер за спам. С помощью кук получается?
> Что такое автономная сеть (AS)? Это какие то централизованные организации, которые предоставляют доступ к интернету провайдерам? Они же вроде и айпишники выдают.
> Можешь ли ты кратко (кратко!) написать что происходит когда ты пытаешься соединиться с удаленным хостом, например через telnet google.com 80? Отправляю пакеты на шлюз, тот меняет мой айпишник на свой. Отправляет на следующий маршрутизатор, и так до пункта назначения и обратно.
> В одной консоли открой любой порт на прослушивание, в другой консоли подсоединись к нему и перешли какую-нибудь строку. Забавно, я в локалке чатик создал.
> Также, возможно ты увидишь широковещательный мусор который шлют твои соседи по сети провайдера (если только ты не за роутером). Да-да, постоянно какие то пакеты идут.
Всем хай, нужна ваша помощь. Создаю тест с вопросами/ответами/баллами/нужное вставить, делаю это все через формы. Нужна помощь анона в таком вопросе: вот хочу чтобы каждый вопрос выводился последовательно после предыдущего или в зависимости от данного ответа, знаю что нужно использовать js/jquery и хочу ознакомиться, но функций там очень много, потому прошу твоей помощи.
> Уникальный ли? Я уже встречал такое, что файлообменник ругался на то, что с моего айпишника уже качали и надо подождать. Это не твой айпишник, а айпишник твоего провайдера со всеми пользователями.
Это ты не изучил NAT. Если бы у нас была единая глобальная сеть - НАТ был бы не нужен и проблемы с фалообменником не было. Но большинство провайдеров подключают пользователей не напрямую в интернет, а в свою локальную сеть, которая соединена с интернетом через NAT, но не является его частью. Если смотреть снаружи - то весь ваш провайдер виден как 1 или несколько узлов, а локальная сеть и все ее пользоватеои не видны. То есть тут мы имеем 2 независимых IP-сети, связанных шлюзом с NAT.
> Как раз читал, что теоретически - да, но практически бывали случаи совпадения. По идее не должны быть, если пользователь не переопределяет мак адрес вручную. Наверно дело в этом. Ну или производитель безответственный - китаец какой-нибудь, который не получил префикс, а использует чужие адреса. Использование компонентов от хороших производителей решает эту проблему.
> Все верно я понял? Да, но тут есть ошибка:
> Пакет достигает конечного хоста, при этом в ICMP-пакете указан заведомо несуществующий порт В ICMP пакетах нет номера порта. Он посылает TCP пакет.
> Я правда не совсем понимаю, доходит ли пакет до маршрузитора, когда я отправляю пакет по адресу 127.0.0.1 Нет, пакет отправляенный на адрес интерфейса не идет через другие интерфейсы, а передается напрямую. Аналогично ты можешь отправить пакет на IP своей сетевой карты, и он тоже не покинет компьютер.
> arp -a указывает куда я как раз шлю пакеты. Вообще-то это кеш ARP запросов. Почитай что это такое.
> Маска сети помогает найти границы подсети. Зачем это нужно? Выглядит как ненужное усложнение.
> А шлюз это же gateway? Куда все офисное здание шлет пакеты. Свитч? Это узел имеющий соединение более чем с одним сегментом ethernet и умеющий передавать пакет между сегментами.
Логика тут простая:
- если цель находится на твоем же компьютере, пакет передатся ей - если цель в той же подсети что и ты, пакет шлется ей напрямую на ее мак адрес. - если нет, то пакет шлется на мак-адрес шлюза. Потому и важно знать кто является шлюзом.
Эти правила описаны в таблице роутинга. которую выводит ip route list. Если у узла больше 1 сетевой карты, правила чуть усложняются. Также, в этом случае можно включить в ОС настройку, делающую твой компьютер роутером, или наоборот, отключающую эту возможность.
Как узел узнает мак-адрес другого узла - узнай самостоятельно.
> Если адресат еще неизвестен в коммутаторе, то он отправляет широковещательный запрос на все порты, и ему откликается тот новый хост, передавая мак адрес Нет, все неправильно. ARP это протокол, который позволяет узлу получить по IP мак-адрес своего собрата находящегося в том же сегменте. Исплоьзуется отправка пакета на широковещательный мак-адрес (ff:ff:ff:ff:ff:ff по моему). То есть выглядит это так:
10.0.0.2 - всем: who-has IP 10.0.0.3 ? 10.0.0.3 - 10.0.0.2: это я
Из ответа первый узел узнает мак второго. Все это работает только внутри одного сегмента езернет.
То что ты написал про коммутатор не имеет отношения. Там описано другое. процесс обучения, в ходе которого коммутатор запоминает мак адреса подсоединенных узлов, чтобы пересылать пакет только в нужный порт, а не всем. Это повышает пропускную способность сети, подумай почему. Заметь что это не гарантирует безопасность так как узел всегда может посылать пакеты от имени другого. Как и в старые добрые времена когда был кабель вместо коммутатора.
>> Как компьютер получает сетевые настройки > когда подсоединяется например к вайфай сети? Вот этого я не знаю. Компьютер наверное отправит пару пакетов, получит ответы и готово. Также как и в случае с любой сетью, не только вайфай, есть 2 варианта:
- ручная конфигурация адинистратором (самый надежный способ но не всегда удобен) - получение настроек через DHCP (почитай)
DHCP-сервер это программа, слушающая определенные типы широковещательных запросов. Узел может отправить широковещательный запрос с просьбой о выделении ип адреса и настроек сети, и DHCP сервер ему выдает в аренду на время адрес и сообщает настройки сети. Почитай про этот протокол и ответь на вопрос:
- если есть сеть где компьютеры используют DHCP, и в ней есть злоумышленник, может ли он перехватывать чужой трафик? Как можно с этим бороться?
> DHCP-сервер это провайдер? При подключении кабеля, он мне автоматически отправляет ip, dns сервер, шлюз? нет, это программа. Запущенная возможно на оборуовании провайдера.
> > Есть ли риски безопасности при использовании DHCP в публичной сети? > Вот этого я не нашел, но логически понятно, что можно перехватить настройки, и как этим воспользоваться, наверное. Нет риска в перехвате настроек. ЧТо с того что ты узнаешь маску сети, адрес шлюза и днс сервера если ты и так в этой сети? Я говорю про другие риски.Изучи протокол DHCP и поищи уязвимые места.
> > Может ли сетевая карта иметь несколько IP адресов? > Наверное нет. Вообще может. Почему нет?
при этом в системе это может выглядеть как несколько виртуальных сетевых карт.
При желании можно наверно сделать и карту с несколькими мак-адресами, как бы имитирующую несколько отдельных, но я не знаю, будет ли коммутатор с такой работать - наверно, нет.
> > Может ли сетевая карта иметь несколько IP адресов? > Наверное нет. Как я написал, может, однако это могут быть не любые адреса. Подумай, какие там есть ограничения.
> > Видит ли гугл твой MAC адрес когда ты заходишь на его сайт? > Нет, потому что на канальном уровне заголовок с MAC-адресом перезаписывается на IP. Верно, гугл видит мак ближайшего к нему роутера. Мак адреса видны только внутри сегмента езернет.
>> Видит ли гугл IP адрес твоей сетевой карты? > Да, виден. А нет, может и нет. Прочитал следующий вопрос. Прочитал про NAT. Теперь да, смотря как компьютер подключен к сети, через NAT или нет. верно. Кстати при изучении этой темы, не забывай что НАт скорее костыль - по задумке, должна была быть единая сеть - но из соображений безопасности, а также нехватки ип адресов их начали применять. Ну к примеру корпорация может не хотеть чтобы извне можно было посылать всякие пакеты во внутреннюю сеть, трейсроутить, дудосить и сканировать ее - она делает отдельную сеть и ставит НАТ. Конечно это можно сделать и без ната, грамотно настроив файерволл на границе, но это сложно, плюс легко сделать ошибку и открыть ворота.
IPv6 решает проблему нехватки адресов, но проблема безопасности остается.
Потому сейчас мы имеем огромное число сетей помимо интернета - локальные сети организаций, провайдеров, миллионы домашних сетей, не являющихся частью интернета, использующих серые адреса.
> > Что такое "серые" IP? Легально ли их использование? > Ну вот как раз айпишники, которые за NAT. И да, более чем легально, я полагаю. Неточно. Серые адреса = глобально не маршрутизируемые адреса, на которые нельзя сдать пакеты через интернет потому что там нет таких узлов. Также, серые адреса не требуют согласований с IANA, просто берешь и исплоьзуешь. Но слать или получать на них пакеты из интернета нельзя - только внутри твоей сети. Выучи их диапазоны наизусть.
Кстати. а что будет если ты будешь в своей домашней сети использовать не серые, а "белые" IP адреса? Ну например назначишь айпаду адрес google.com? Гугл упадет? Айпад сломается?
> Когда роутер принимает пакет, то он на лету меняется IP-адрес отправителя на свой, а также записывает номер порта, чтобы различать присланные пакеты от разных компьтеров Всего доступно 65535 портов, верно? Теперь вопрос. Если в локальной сети каждый компьютер открывает 100 соединений наружу через НАТ, сколько компьютеров способен обслужить этот НАТ? Хехе, какой я хороший вопрос придумал.
> запись в которой стирается после закрытия соединения. А как быть с UDP где нет соединений и ICMP где нет портов?
> А влияет ли это на скорость, ОП? Да, но если в качестве шлюза ставить профессиональное оборудование а не домашний компьютер с пентиумом, то незначительно. Ты ведь и сам можешь измерить задержку через traceroute.
> > Зачем нужен маршрутизатор/роутер? > Чтобы соединять сегменты сети друг с другом? Да, чтобы соединять езернет сегменты.
> > Чем Ipv6 оличается от IPv4? > Количеством цифр в адресе? По моему там еще были доработки: что-то ненужное выкинули и что-то добавили. Ну и пользователь будет получать не 1 ип адрес а большую подсеть.
> > Работает ли у твоего провайдера IPv6? > Да. А у меня нет ((
> Похоже у вас есть доступ только в IPv4 интернет. У вас не получится зайти на сайты использующие только IPv6. > Ваш DNS сервер (возможно, предоставляемый вашим провайдером) имеет доступ к IPv6 интернету. Это просто потому я использую гугловский DNS.
> ОП, я что-то тогда не понимаю. У нас все офисное здание за NAT. Так вот google как то умудряется забанить только один компьютер за спам. С помощью кук получается? Возможно, зависит от конфигурации ната. Я сам изредка вижу капчу, хотя никогда не спамлю и плохого ничего не делаю.
За авт. сетью закрепляется диапазон адресов и она добавляется в таблицы маршрутизации, так что роутеры знают через кого можно посылать пакеты в эту сеть. Ну то есть в таблицу вносится диапазон IP этой сети и список шлюзов через которые она связана с другими сетями. Роутер при получении пакета адресованного в ту сеть, определяет ближайший путь к ней и передает пакет дальше.
> > Можешь ли ты кратко (кратко!) написать что происходит когда ты пытаешься соединиться с удаленным хостом, например через telnet google.com 80? > Отправляю пакеты на шлюз, тот меняет мой айпишник на свой. Отправляет на следующий маршрутизатор, и так до пункта назначения и обратно. Меняет адреса НАТ (как следует из названия). Обычные роутеры без НАТ не меняют IP адреса.
>>693911 Неправильно считает: http://ideone.com/fLZtzF Должно получиться 61270 рублей с копейками при $monthlyPayment = 5000. >$loan -= ($monthlyPayment - $taxRate); Чё-т вообще не в ту степь. Вот такой алгоритм самый простой и естественный: 1. Прибавляем к $creditBalance проценты и $servicePayment. 2. Если получившаяся переменная меньше или равна $monthlyPayment, то выплачиваем именно её и прибавляем её к $paymentTotal. После этого завершаем цикл. 3. Если получившаяся переменная больше $monthlyPayment, то отнимаем от неё $monthlyPayment и продолжаем цикл.
>>694048 Тогда почему не $data = "Yoba Boba"; foreach (count_chars($data, 1) as $key => $value) { echo "chr($key) встречается в строке $value раз(а).\n"; } ? Проблема в том, что я так и не пойму, что ему надо.
>>694048 То есть вот так: $data = "Yoba Boba"; foreach (count_chars($data, 1) as $key => $value) { $i = chr($key); echo "$i встречается в строке $value раз(а).\n"; }
Как правильно будет организовать хранение такой информации. Есть товар, которому можно задавать цвета. То есть создать таблицу с цветами не пойдет, т.к. цвета могут быть каждый раз разные. Создать столбец в таблице с товаром тоже не покатит т.к. цветов может быть 1, а может и 10, все их в одном столбце хранить нельзя. Может вообще не в БД а как-то иначе такое надо реализовывать?
> Есть товар, которому можно задавать цвета. То есть создать таблицу с цветами не пойдет, т.к. цвета могут быть каждый раз разные. Не рекомендую. Завтра ты захочешь сделать поиск по цвету и их нужно будет как-то унифицировать. Посмотри любой магазин вроде lamoda.ru например - там просто набор цветов.
Соответственно делается сущность "цвета", и связь многие-ко-многим/один-ко-многим в зависимости от логики на товары.
> цветов может быть 1, а может и 10, все их в одном столбце хранить нельзя. Хорошо, что ты это понимаешь.
Не понимаю, скачал свой проект, который под виндой делал, установил конфиг дб, загрузил дб, прописал __DIR__ в директории роутеров и классов, а он 404 выдает. Это может быть из-за того, что под линуксом что-то иначе с путями и библиотекой работает?
анон, есть одна сессия и один проект на Yii. Вопрос такой: почему этот кусок кода всё время возвращает одно и то же значение, даже при перезагрузке сраницы? если что, то я не залогинен
что-то я застрял на студентах конкретно, уже 20-ый день мучаю, а прогресса почти нет. Есть у кого готовые студенты подглядеть и проникнуться решением? А то с ума сойду
Поясните за задачку с айфоном >http://archive-ipq-co.narod.ru/l1/loops.html >$percent = 1.03; / Банк начисляет 3% в месяц от суммы / Почему 1.03 если Процент — это одна сотая часть от числа т.е. 0.03 или это просто я тупой ?
>>694185 Ну, скажем, я запилил вот что: страница, которая показывает всех студентов и вторая страница - форма для вбивания нового студента.
Из условий задачи я понимаю, что вбив студента(себя) ты как бы "логинишься" на сайт и уже потом можешь смотреть всех, либо редактировать свои данные. Так вот, как делать это "логинивание"? Вообще нет идей
>>694067 Пройди, чо. Такой формат максимум YOBA: "Бесплатный видеокурс по PHP и пошаговый алгоритм по созданию полнофункционального блога с БД и аутентификацией с нуля". >>694072 Откуда новичку знать последовательность, что за чем, как то и как сё? Есть какие-то гайды, как самому создать пошагово? Это ты можешь думать, что сейчас вот то, потом вот сё, а новичок не знает ничего абсолютно. Учебнику ОПа не было бы цены, если бы были подобные гайды. Даже просто описание задачи на список студентов - это мрак и адище. Каждый пункт надо изучать дополнительно, ломается пошаговость. Ты или ОП можете многое сказать по этому поводу, только факта это не отменяет: это всё равно очень сложно для новичка.
>>683886 Ну никак у меня не получается hello-world сделать в slim. Единственное, чего я добился с прошлого треда, это иметь возможность взаимодействовать с htaccess запуская код не с phpstorm, а напрямую через браузер из папки apache/htdocs. Вот тогда httacess команды работают. Но у меня до сих пор 404.
>>694196 То, что папка вверху file-sharing, а в url test - не обращайте внимания, phpstorm здесь уже просто как редактор используется. Файлы в htdocs точно такие же.
>>694195 >Каждый пункт надо изучать дополнительно, ломается пошаговость. >это всё равно очень сложно для новичка Вот тут кстати соглашусь, как человек который сделал студентов не с нуля (я до этого кое-что знал). Между учебником ОПа и задачей про студентов есть очень большой пробел, но большинство подводных камней и новых понятий объясняется в самом условии (это не отменяет факта что новичку который читал только учебник ОПа придется все это гуглить). Может быть это так задумано ОПом, чтобы шло какое-то самообучение.
>>694205 Видимо не для меня, я что-то совсем там ничего не понимаю. Куки - это какая-то инфа, которую я буду посылать пользователю для того, чтоб он мог не авторизовываться? Так я и начинал с того, что даже не знаю, как делать сам процесс авторизации. Т.е.... что это вообще такое?
Да и как с ними работать, корочи, не ясно, не знаю, как объяснить нормально ,потому как просто тупо не понимаю
>>694202 Самообучение и так идёт. Решать задачи ОПа в первой части учебника - это и есть самообучение. Дело тут всё-таки в подаче материала. Но ОП и без того огромную работу проделал, чтобы я ещё и этого требовал от него. >>694210 Ты пока только функцию создал. Прочитай внимательно про то, как функция возвращает значения. И про то, как уже после вывести это значение через echo.
Господа, ну так есть кто-нибудь тут, кто сможет объяснить, как делать авторизацию для студентов? Т.е, чтоб браузер тебя запомнил после ввода своих данных и ты мог редактировать их в последствии?
>>694212 Посмотри на эту авторизацию с самого начала.
Каждая авторизация на любом сайте требует пароль. В нашем случае чтобы не заставлять пользователя каждый раз вводить свой пароль, ты генерируешь пароль сам, и сохраняешь этот пароль пользователю на компьютер. Для этого тебе нужны куки - чтобы хранить какую-то информацию на компьютере у пользователя. У каждой куки есть свое имя, значение которое она хранит, и время когда она кончится (т.е. удалится с компьютера пользователя). Так же, тебе нужно будет сохранить пароль который ты сгенерировал в базу данных, чтобы потом с помощью этого авторизировать пользователя. Таким образом, тебе на странице с формой нужно будет проверять, присутсвует ли у пользователя кука авторизации, если присутсвует и пользователь с таким паролем есть в базе данных - ты выводишь его данные и позволяешь редактировать информацию, если же какое-то из условий выше не было выполнено (у пользователя нет такой куки, или пользователя с таким паролем не существует в базе даных), ты выводишь форму заполнения данных. Конечно, как написано в условии, у этого способа есть недостатки, например если пользователь почистит куки или использует другой браузер - он потеряет возможность редактирования своих данных, но данный способ вполне подходит для задачи с студентами.
>>694239 >авторизация Что есть авторизация? Через что её делать? через <form>? Т.е. пользователь заполняет <form>, я создаю new Student и сохраняю его, и, скажем, как его переменную класса ->coockie передаю туда сгенерированную рандомную фразу/cлово через setcoockie()?
А как, собственное, создать "авторизуемость", т.е. как проверять какой куки у пользователя и его так называемый "личный кабинет"? Через что это делается, какими тегами?
>>694239 Перечитал то, что ты написал. Т.е. делаю так: 1. пользователь заполняет <form> 2. я создаю new Student и сохраняю его инфу 3. как его переменную класса ->coockie передаю туда сгенерированную рандомную фразу/cлово через setcoockie() 4. Перед выдачей формы я проверяю, совпадает ли ->сoockie и кука, которую хранит его браузер 5. если да, то вывожу его данные и он их редактирует 6. если нет, выдаю <form> как обычно
Задачка про парня, который срывает миллионный джекпот в банке: http://ideone.com/8W6bPw Понятно, что второе действие можно сократить, просто посчитав прибавку от годовых собственноручно, но мне хотелось всё сосчитать внутри кода. Ideone выдаёт превышение временных лимитов. Моя ошибка?
>>694258 >Что есть авторизация? Пользователь вводит логин и пароль, твое приложение проверяет все ли введено верно. Если все верно - пользователю дается кука в подтверждение того что он авторизирован. >Через что её делать? В случае с списком студентов тебе не нужно нагружать пользователя логинами\паролями. Тебе достаточно сгенерировать пароль самому, и записать его в куки пользователя и в базу данных. Тогда эта кука которую ты создал будет как бы "флагом" того, что пользователь авторизирован. >через <form>? Через форму пользователь вводит свою информацию (имя, фамилию), а работа с паролями и куками происходит исключительно на стороне сервера. >>694265 >как его переменную класса ->coockie передаю туда сгенерированную рандомную фразу/cлово через setcoockie() Ты должен сохранить в $_COOKIE только пароль который ты сгенерировал. И этот же пароль сохраняешь в базу данных вместе с студентом. Потом, когда тебе нужно будет проверить, авторизирован ли пользователь, ты можешь проверять наличие куки с авторизацией у пользователя >if(isset($_COOKIE['user_authorized'])) И если такая кука у пользователя есть, ты выбираешь из базы данных студента с паролем, который содержится в куке. Если такой студент в базе данных есть - значит пользователь авторизирован. Т.е. твой "пароль" это еще одна колонка в базе данных, а не переменная.
Идея такая куки- это кусочки информации в формате key=value которые браузер сохраняет у себя и отправляет на сервер вместе с каждым запросом. Когда браузер запрашивает страницу по протоколоу HTTP, сервер может в дополнение к самой странице отправить заголовок Set-Cookie содержащий куки и информацию о них: домен, путь, срок хранения. Браузер получив этот заголовок, добавляет куки в свое хранилище и в дальшейшем отсылает их вместе с каждым запросом.
Куки разграничены по доменам. браузер посылает на сервер только куки относящиеся к домену сайта. Сервер может ставить куки только для своего домена.
Мы используем куки для беспарольной авторизации. При регистрации генерируется случайный длинный сложноподбираемый код, сохраняется в БД и ставится в куки. При попытке редактирвоания код и кук сверяется с кодом в БД и таким образом подтверждается что это тот же пользователь который ранее зарегистрировался. Злоумышленник не может редактировать чужие профили так как не знает их секретный код.
>>694279 Return не в том месте. С ним ты можешь получить только окончательный результат работы функции. $creditSum там к чему возвращается? Там должна возвращаться окончательная сумма заплаченного, а не 0 ($creditSum станет нулём же в итоге).
>>694278 Хм... начинаю понимать, спасибо, что объясняешь такому долбоёбу, как я.
Т.е., скажем, пользователь ввёл свои данные. Нажал на submit, я создаю new Student и также создаю $password = рандомное вырадение и успешно записываю студента с его паролем-куки в таблицу sql.
Потом я делаю
setcoockie('student_password', $password); (теперь я правильно понимаю, что передаю куки равное тому сгенерированному выражению, браузеру чела, который только что зарегался?.)
И потом проверять, если у него в браузере есть такой куки под названием student_password, то смотрю по своей таблице sql и даю ему редактировать того, с чьим password совпало?боже, кажется, я понял
>>694301 цикл будет идти до тех пор пока $i<=1000000, условие внутри цикла $i>=1000000 никогда не выполнится, потому что к тому моменту цикл уже завершится.
>>694273 Так, другое недоразумение с этим кодом http://ideone.com/7neVzL Сначала в цикле присваивается значение переменным, затем проверяется условие (оно верно), потом выполняется тело цикла. Тогда в результате кода должно выехать несколько строк, начиная с "The guy is 16 while he's got USD 10000 in the bank", разве не так?
Секрет прост: ОП пока не написал промежуточных уроков. Единственное на что хватило времени - сделать задание + комментарии, а ведь раньше их не было и было еще хуже.
То есть имея ограниченное время я постарался начать с самого важного - сделать хоть что-то для изучения архитектуры веб приложений.
Тебе надо выучить и прочитать в мануале 2 метода работы с куками в PHP
- функция setcookie добавляет в ответ сервера заголовок Set-Cookie который добавит куку в хранилище браузера - перед запуском скрипта PHP анализирует пришедшие от браузера заголовки, ищет там заголовок Cookie и заполняет пришедшими от браузера куками массив _COOKIE
Обрати внимание, если ты меняешь _COOKIE то ты меняешь только этот массив, никаких заголовков не отправляется. Если ты делаешь setcookie то кука не добавляется в COOKIE так как это просто массив.
>>694332 >Алсо есть такой вариант промежуточного урока - что скажете? Вот я думаю это как раз то, чего не хватало, я помню в прошлых тредах некоторые люди закончили учебник в шапке, брались за студентов и совсем не могли понять с чего начать.
>>694198 >>694323 Вот вам новый скрин чтобы не вводить вас в заблуждение с папками. > Куда в конфиге сервера Апач указывает DocumentRoot? DocumentRoot "c:/Apache24/htdocs"
>>694363 Мод реврайт то хоть включен? Я имею ввиду активацию самого модуля, в дебиане это sudo a2enmod rewrite. Еще может быть нужно AllowOverride All в apache2.conf
Выложи сразу весь php.ini и apache2.conf, чтобы не засорять тред угадыванием причин.
>>694402 Return дает понять функции, что именно она должна вернуть в качестве своего результата. Мы можем делать разные вычисления в функции с разными переменными, но результат, как правило, нам нужен только один. http://ideone.com/jcefOw
>>694411 окей я понял что он делает,но я до сих пор не понимаю куда мне его сунуть,сейчас попробую разобраться, ну а код у меня хотя бы работать будет? >http://ideone.com/SmLXsx
>>694415 Может поставить его в самый конец после цикла, так как return сразу заканчивает работу функции и возвращает значение, для функции он примерно как break для цикла.
>>694415 Ты так и не сделал там $paymentTotal. Без него и возвращать нечего будет. return там должен быть после основного цикла в функции - тебе же только последнее значение нужно. Я поэтому и писал тебе, что ты будто не сам решал эту задачу - это же элементарно. И странно не понять этого, когда решил эту сложную задачу. >>694421 Так тебе это и нужно.
>>694432 Что значит "подумал так сойдет?". Ты случайные куски кода вставляешь наугад и ждешь, что оно само поймет, что тебе от него нужно? Ты ведь должен понимать что ты делаешь, когда решаешь задачу. Тебе нужно написать функцию, которая возвращает количество выплаченных денег, но где их взять, если ты даже никуда их не записываешь?
>>694432 Так ты не сам делал, что ли, я был прав? Ты сам себе наврал, получается. Кого ты обманываешь на анонимной борде, кроме как себя. >>694437 Тоже недоумение всё это вызывает, когда человек вроде бы сам решал.
>>694345 Спасибо. Сейчас пробую сделать задачу. Столкнулся с проблемой. Вот, скажем, я записываю все пары куки -- кол-во раз в массив.
Но как быть с тем, что при каждом обновлении страницы мой массив перезаписывается? Иными словами, как создать переменную, которая бы не перезаписывалась каждый бы раз?
>>694445 Короче, вот лучше сформулированный вопрос: каким образом лучше всего хранить массив объектов с парами куки-пароль? Я создал класс Coockie с переменными ->password(тут сама кука) и ->times(счётчик разов).
Как хранить эти объекты? Записываю их в массив - при каждом обновлении страницы всё сбрасывается.
Пердолинг с сессиями нынче в тренде, присоединюсь пожалуй.
Все-таки плохая у yii документация, годится только на хелловорлды. Чувак выше спрашивал про сессии в yii >>694117 я его код скопировал, у меня все работает, число инкрементируется при обновлении страницы, так что у него скорее всего дело в кешировании.
У меня возник другой вопрос, а где собственно фреймворк вызывает session_start?
В гайдах описывают 2 способа работы с сессией: 1. Через компонент session, будут вызовы вида Yii::app()->session->add('key', 'value'); Yii::app()->session->get('key', 'notFoundValue'); Требует конфига в main.php (или это опционально?) Правда непонятно что туда писать, если мне не нужны никакие параметры: autoStart по-дефолту true, cookieParams и cookieMode нужны только если включить режим сохранения данных сессии в куки.
2. Создать "независимый" объект класса CHttpSession и уже у него явно вызывать метод open. $session = new CHttpSession; $session->open(); // внутри этого метода session_start $session->add('key', 'value'); echo $session->get('key');
Вопрос у меня возник в связи с тем, что у меня сессии "работают" (то есть вызывается session_start) во всех 3 случаях. И когда я обращался к сессии первым способом (но не прописывал конфиг для компонента session!); и когда обращался вторым способом, через создание нового экземпляра CHttpSession (но не вызывал $session->open()!); и даже через родной $_SESSION не нужно вызывать session_start, более того фреймворк сообщает об ошибке, мол 500 A session had already been started - ignoring session_start()
Почему в доках такие моменты не разбираются, я имею ввиду например как приложение работает с сессией? Нá тебе голый апи и дергай ->add и ->get как обезьяна. Это что мне, самому перечитывать исходный код фреймворка, чтобы понять что происходит? Вроде уже сам разобрался, нет смысла постить, но не зря же я это набирал, хоть пожалуюсь на плохую документацию и похвастаюсь что сам дошел.
Аноны ,помогите -объясните нюфане процесс передачи аргументов по ссылке и отличие ее от передачи по значению.прочитал кучу источников,но так и не дошло полностью
0. Создаю class Coockie { public $pass; public $count = 1; } 1. Проверяю, есть ли у пользователя кука с названием "pass" --- isset($_COOKIE['pass']). 2. Если если нет, то создаю $coockie = new Cookie,генерирую пароль из 10 символов, передаю его в $coockie->pass и показываю "привет в 1-й раз". Сохраняю полученный объект в массив.
3. Если есть такая кука, то перебираю массив с объектами и сравниваю его с кукой. Если совпадает, пишу "привет в такой-то раз" и всё.
Вроде, всё логично и должно работать. Однако на практике я вижу, что мой массив каждый раз перезаписывается благодаря этой строке $allc = [];
А без неё не могу, т.к. не задав переменную нельзя foreach по ней делать. Картинку прилагаю. Как быть?
>>694611 Передача по ссылке не нужна, только по значению. Придерживайся функциональной чистоты: функция принимает значения, обрабатывает их, возвращает результат, не изменяя никакие другие данные. С результатом можно делать всё что нужно. Для упрощения можно использовать глобальные переменные.
>>694617 а как реализовать ввод ,допустим чисел на хтмл странице и передать результат в функцию с дальнейшим выводом.я так понимаю напрямую в пыхе такой функции нет?
Зачем там open если сессия всегда стартует? Может это для тех чуваков, которые насильно в конфиге выставляют autoStart в false? Непонятно. У меня этот способ работает без open.
>>694612 Почитай статьи из гугла, я могу только кратко пересказать в сотый раз.
Сессии в абстрактном виде это некая информация от пользователя, которую необходимо передавать между скриптами. Допустим у тебя есть какой-то тест, типа психологический, или на уровень icq. Каждый вопрос сделан отдельной страницей (ну или сгруппированы по 10-20). После того как юзер расставит чекбоксы, он сабмитит форму (кнопка "Дальше"). Ему выдается страница со следующей порцией ответов и т.д. В итоге он приходит на последнюю страницу, которая должна собрать результат работы всех предыдущих скриптов, обработать и выдать результат. Как передать данные от одного скрипта другому? Можно через куки. Кто-то выше уже писал, куки это пары 'имя'=>'значение', которые сохраняются в браузере. Но пользователь может отключить куки, он может их почистить, плюс может быть некоторую конфиденциальную информацию просто нельзя сохранять в куках. Тогда сохраняют на сервере в специальных файлах. Чтобы связать эти файлы с конкретным пользователем, посылающим запрос, создается сессионная кука с идентификатором (фактически с названием этого файла). Что это дает? Пользователь прошел первую страницу теста и сабмитит эту форму. Данные сохраняются в файл с определенным именем, пользователю ставится кука с таким именем. Редирект на вторую страницу. Пользователь заполняет форму и сабмитит. Поскольку у него есть кука с названием сессии, то сервер не создает новый файл, а дописывает в старый. Наконец на последней странице, на которой должен быть показан результат, скрипт выгребает из сессии все ответы пользователя, обрабатывает и отдает html. Сессионные данные кроме собственно сессионных файлов и кук можно еще хранить в бд, или в кастомных файлах на сервере (черт его знает, зачем это может понадобиться). Но вот например для юи зачем-то описывают и такое извращение http://styleroom-ya.livejournal.com/618998.html
Авторизация делается обычно куками, хотя опять-таки it depends.
Переменные хранятся в оперативной памяти. При завершении скрипта вся эти память очищается. Так что новый скрипт всегда начинает с "чистой страницы". Это хорошо.
Тебе надо изучить что такое куки. Ты прочел и понял всю статью про них в википедии?
Также отлаживать куки удобно developer tools в Хроме или ФФ (ctrl + shift + i). В Хроме куки, хранящиеся в браузере, выводятся на вкладке resources. Запросы можно увидеть на вкладке network.
Алгоритм надо упросить. Например что мешает тебе хранить число посещений в самой куке?
Ответь-ка также на вопросы для проверки:
- напиши какой-нибудь простой скрипт на php который выставляет куку, например x=1. Затем открой в браузере dev tools (Ctrl + Shift + I) на вкладке network и перезагрузи страницу пару раз. Посмотри какой запрос посылается и какой ответ приходит, и выпиши тут заголовки которые содержат эту куку, если таковые имеются - как в PHP выставить куку не используя функцию setcookie ? (например можно ли это сделать функцией header?) - допустим мы хотим на некоем сайте разрешить пользователям просматривать не более 3 статей бесплатно. Для этого мы при каждом просмотре берем куку view_count, увеличиваем ее значение на 1 и отдаем обратно пользователю с новым значением. Если кука в итоге больше или равна 3, мы вместо статьи показываем сообщение об ограничении доступа. Есть ли подвохи в нашей безупречной схеме? Попробуй написать скрипт который это реализует. Там должно быть несколько строк, ООП не нужен. - в одной вкладке браузера мы открываем страницу page1.php, которая выставляет куку x =1. Во второй вкладке мы открываем страницу page2.php, которая выставляет куку x=2. затем мы обновляем страницу в первой вкладке. Какое значение куки отправит на сервер браузер? Проверь себя с помощью dev tools.
> Создаю class Coockie { public $pass; public $count = 1; } Непонятно зачем он нужен и что хранит
> Проверяю, есть ли у пользователя кука с названием "pass" --- isset($_COOKIE['pass']). Зачем она нужна, с таким странным именем? Пароль? Зачем нам пароль чтобы просто посчитать число посещений?
> Если есть такая кука, то перебираю массив с объектами Он же пустой.
>>694620 Нету, да. Для ввода чисел можно реализовать форму (это фронтенд), которая будет по кнопке submit передавать данные в пхп-скрипт (бекэнд), где к ним можно особым образом доступаться, например: $first=$_POST['firstNumber']; $second=$_POST['secondNumber']; $third=callSum($first,$second);
Оп, вопрос по 3 задачке в массивах. Вот такая программа у меня получилась. http://ideone.com/mIYZwn > $youGotDis = array_rand($answers,7); Вот эта строка значит, что я создал еще 1 массив в котором я рандомно перемешал всё элементы из массива $answers, я правильно понял ? А можно просто переменной присвоить рандомный элемент массива ? И еще, я не совсем понимаю, как работает следующая строчка > echo $answers[$youGotDis[0]]. "\n"; Просто скопировал её с пхп.нет
Ты по моему переусложнил. Сессия это данные которые хранятся на сервере, индивидуальные для каждого пользвоателя. Пользователям каждому выдается кука с индивидуальным кодом (вроде hd6d5d4d8d9s9ds9ds0d0s0ds0d), а на сервере например создается файл с таким же именем (или запись в базе с таким идентификатором). Соответственно, когда пользователь в следующий раз заходит на сайт, по команде session_start() по этой куке ищется файл, и данные из него загружаются в массив SESSION. А по завершении скрипта - выгружаются из массива в файл. Сессии временные и файлы на сервере удаляются через 15-30 минут неактивности.
У сессий много особенностей и недостатков и они почти всегда не нужны. Авторизация делается и без них и может быть даже проще.
>>694628 >Чтобы связать эти файлы с конкретным пользователем, посылающим запрос, создается сессионная кука с идентификатором (фактически с названием этого файла).
Очень умно. Теперь я знаю, как можно реализовать сохранения для незарегистрированных пользователей моейненаписаннойигры на JavaScript ОП-няша об этом где-то пишет?
Сессии долго не живут. Для твоей игры наверно лучше хранить данные в базе данных. А чтобы не забивать базу зря, сохранять их туда если есть что сохранять. чтобы боты от гугла или зашедшие посмотреть не создавали тысячи пустых записей.
>>694646 Я же так и сказал. Сессии для частных случаев, когда нужно передать данные между php-скриптами, но нет возможности использовать базы данных или куки.
Твой подход с тестом имеет недостаток - если открыть 2 теста в 2 вкладках и заполнять параллельно, все перемешается. Это один из недостатков стандартных сессий. Для борьбы с ним придется сделать свою систему сессий, то есть генерировать идентификатор и передавать его не в куках, а через POST или GET параметры.
"передавать" плохой термин. Лучше сказать "хранить".
> Зацени регулярку. > Auto-generated class. CSS syntax highlighting Скорее всего в исходнике генератора синтаксис описан в нормальном виде, а по нему генерируется код. Так что претензий нет.
Практически ни в какой. Очень редкие случаи - это когда надо обрабатывать ошибки, например ошибку чтения файла функцией file_get_contents:
$x = file_get_contents($y);
к примеру, даже если мы проверили что файл существует, тут может возникнуть какая-то редкая ошибка в процессе чтения (особенно если файл на сетевом диске), ошибка прав доступа. Эта ошибка приведет к варнингу который пишется в логи, и может быть мы хотели бы этого избежать (то есть мы знаем что файл может не прочитаться и это штатная ситуация).
Правильное решение проблемы - использовать исключения. Ну например в Питоне или JS при каких-то ошибках чтения файла выбрасывается исключение, которое можно поймать и обработать.
но ради одной функции это может быть слишком много возни.
В общем в 99% случаев собака не нужна и только вредит.
Там очень плохо сделано.
session_start может давать ошибки при повторном вызове, при вызове слишком поздно (что она уже не может выставить куку), при ошибке файловой системы (переполнен диск). Игнорировать все эти ошибки и притворяться что все ок абсолютно не правильно. Такой подход приводит к тому что при отладке программист потратит больше времени на выяснение причин чем если бы он знал о произошедших ошибках сразу. Это называется подход fail fast.
В Юи 1 много странностей, авторы часто пытаются проявлять оригинальность там где не следует.
Точнее, они там не игнорируют ошибки, они просто пишут ее в лог вместо того чтобы сделать фатальную ошибку и завершить скрипт. Это неправильно, ведь фактически мы не смогли открыть сессию, а скрипт продолжает работать. Что если на сессию завязан какой-то важный функционал, связанный с оплатой например?
>>694639 Да уж, перемудрил я. Спасибо тебе(ты ОП? похоже по стилю письма) Перечитал на вики и твоё сообщение пять раз и наконец понял. Решил задачу и довольно просто. Пикрилейтед (проверь, пожалуйста, верно?)
Теперь наконец применю знание по кукам на студентах.
Вопрос: правильно я понимаю, что там нужно генерировать каждому студенту куки-пароль и записывать его в БД. При каждом заходе проверяю куку - если совпадает с кукой-паролем от какого-либо студента, то позволяю править инфу, связанную с этим студентом? Т.е. подход будет отличаться от этой задачи довольно сильно?
-нехорошо 2 раза писать setookie когда мы можем вынести ее из ифа - для кук желательно ставить путь и время жизни. Почитай про параметр path у кук: http://citforum.ru/internet/html/cookie.shtml
Также, поломай голову и попробуй ответить на мои вопросы выше. Нужно хорошо закрепить знание кук прежде чем переходить дальше.
> При каждом заходе проверяю куку - если совпадает с кукой-паролем от какого-либо студента, то позволяю править инфу, связанную с этим студентом? Т.е. подход будет отличаться от этой задачи довольно сильно? да, в данном случае мы можем использовать куку с токеном (это обычно называют токен), чтобы и идентифицировать студента (то есть понять кто перед нами) и аутентифицировать (подвердить что он тот за кого себя выдает).
В случае обычной регистрации используют 2 куки: первая, идентификационная, хранит id или email пользователя, вторая, аутентификационная, - токен или хеш от пароля.
>>694703 Cпасибо опять. Я тот кун, что чёрно-белые фото прикладывал ко всем задачам, когда твой учебник проходил где-то месяц назад, если помнишь ещё. Вот до студентов добрался и карабкаюсь вверх потихоньку.
Т.е. в студентах мыслить в сторону модели: 1. человек заполняет форму. 2. генерирую куку-пароль, заношу в БД вместе с именем отдельной колонкой. 3. передаю этому пользователю ДВЕ куки: 1. id 2. куку-пароль(из БД).
Ты пишешь >чтобы и идентифицировать студента но разве Разве не будет достаточно лишь уникального пароля(из БД)? Зачем нам кука-id?
В случае с студентами хватит одной куки. Один токен служит и для идентификации (благодаря тому что он уникален) и для аутентификации (так как его сложно подобрать).
Две куки нжны в традиционных системах регистрации с паролем и логином, одна кука для идентификации, вторая для аутентификации.
Как относитесь к бирже freelansim.ru? Вроде заказы интересные, индусов не так много, как на апворке, цены приемлимые. Стоит регистрация свои 500 рублей? Хочу иметь 2 профиля: на апворке и фрилансим, где я не прав?
Помогите пожалуйста есть скрипт перебирает прокси адреса,хочу его зациклить,чтобы когда адреса допустим с 1 по 50 перебрались-цикл for,цикл while запустил for по новой с 4.Но цикл while почему то не работает..
var start=1; var end=4; var i = 0; while (true){ for (start;start<end;start++) { alert(start); } }
>>694936 Меня интересует насколько это ресурсозатратно. Вытащить 100 строк (select *) из мускула или таких же 100 строк из csv файла. Проверить сам — слишком ленивый.
Есть два способа сделать одну и ту же кнопочку play с треугольником 1. Картинка в фоне (из спрайта) 2. Иконка со спецсимволом ( ∆ ) и через transition: rotate поворачиваем набок Какой лучше?
Есть текст вида: >66006 33764 18799 4//// 3//// 1//// 8//// 9//// 00000=3D >HUI=3D13.9CM >PIZDA=3D335mm >GO to HOME: >error:69 >SPERM=3D0.0ml >TIME=3D22-03-2016T09:00:09:+03:00 Нужно выдернуть значение хуя, пизды, спермы и времени, либо элементами массива, либо присвоив их неким переменным. Причем желательно дропнуть "3D" злоебучее.
>>695139 >parse_ini_file Он только файлы жрет? Пытался подсунуть ему переменную с нужным текстом, пиздит, ругается. Можно наебать как-то? писать/читать 12к файлов желания нет.
>>695144 Тогда сначала разбить текст на строки через explode или preg_split. У меня почему-то explode по \n не сработал, помогло использование PHP_EOL в качестве разделителя. Потом разбить по символу =.
http://ideone.com/BTJ8uJ Аноны, задача сделать из полученных слогов массива целое слово. Как я понял, надо из выпавших слогов создать ещё один массив и с помощью implode составить имя. Как реализовать?
>>695259 Если форма не отправлена то свойство будет пустое и htmlspecialchars будет получать ошибку^ <br /><b>Notice</b>: Undefined variable: postForm in <b>form.php</b> on line <b>2</b><br /><br /><b>Notice</b>: Trying to get property of non-object in <b>form.php</b> on line <b>2</b><br />
Это доставляет мне много проблем из-за которых мне приходиться придумывать такие костыли.
>>695285 Мне вот непонятно, вот сейчас, никто же не пишет на __чистом__ PHP? У каждой компании у каждого программиста свой набор инструментов, ведь так?
Мой код читается так: "если переменная не пуста, ..."
Твой код читается: "если существует переменная и у нее есть поле". Вместо того чтобы прямо написать что ты хочешь сделать, ты ищешь какие-то обходные пути и проверяешь совсем другие вещи. делаешь код тяжело читаемым и засталяешь того, кто его разбирает, тратить лишнее время.
Да и вообще я не понял почему ты так написал. Ни одной убедительной причины найти не могу.
Алсо в твоем коде я не вижу причин по которым переменная может быть пуста. Если у тебя класс представляет данные из формы, то он должен существовать всегда когда есть эта форма.
Ок, я там мог ошибиться так как ты показал только кусок кода и не видно откуда берется эта переменная. Но все равно, isset это ненормально и ненормально что ты обращаешься то к полю, то к методу.
>>689537 (OP) такая проблема: Allowed memory size of 134217728 bytes exhausted (tried to allocate 80732160 bytes) на такой строчке echo file_get_contents('filename.7z'); Вопрос: есть ли способ из пхп выдать файл клиенту не загрузив его в память? Редирект не катит сразу. Щас склоняюсь к варианту настроить htaccess чтоб если правильный айпи то отправляло сразу на файл в обход пхп.
>>694944 >Меня интересует насколько это ресурсозатратно. >Вытащить 100 строк (select *) из мускула или таких же 100 строк из csv файла. >Проверить сам — слишком ленивый. Ну просто вытащить - хз, а вот более сложные вещи явно затратнее.
>>693571 > В ICMP пакетах нет номера порта. Он посылает TCP пакет.
https://ru.wikipedia.org/wiki/Traceroute > Достижение пункта назначения определяется следующим образом: отсылаемые traceroute датаграммы содержат UDP-пакет с заведомо неиспользуемым номером порта на адресуемом хосте. Номер порта будет равен 33434 + (максимальное количество транзитных участков до узла) — 1. Значит там не TCP-пакеты, а UDP?
> Зачем это нужно? Выглядит как ненужное усложнение. Ну сеть же делится на несколько подсетей. Вот маска подсети как раз и нужна, чтобы маршрутизатор мог определить в какую подсеть слать пакет.
> Как узел узнает мак-адрес другого узла - узнай самостоятельно. Ну узел же получает от DHCP-сервера все настройки и наверное mac-адрес устройства куда передавать пакеты. Ну или оно вручную забивается.
>>695247 Нужна конкатенация переменной $name в цикле. При каждом проходе надо приклеивать новый слог к имени, а потом в итоге просто вывести $name в echo.
>> Зачем это нужно? Выглядит как ненужное усложнение. > Ну сеть же делится на несколько подсетей. Вот маска подсети как раз и нужна, чтобы маршрутизатор мог определить в какую подсеть слать пакет. Неверно. Маска нужна чтобы определить: находится ли другой узел в одной сети с нами и можно слать ему пакет напрямую или же он в другой и надо слать пакет на шлюз.
>> Как узел узнает мак-адрес другого узла - узнай самостоятельно. > Ну узел же получает от DHCP-сервера все настройки и наверное mac-адрес устройства куда передавать пакеты. Ну или оно вручную забивается. Нет, не получает, только IP шлюза. Аналогично при ручной настройке указывается только IP. Подумай еще.
> Ну или оно вручную забивается. Тогда тебе надо забивать вручную мак адреса всех соседей в езернет-сегменте и как-то отслеживать их изменение.
Не дождался доброанонов, в итоге напиздив кусочков из гугла, сотворил следующую хуйню: http://ideone.com/i6DutH Хакиры, посоветуйте оптимизацию, ибо чую, что в регулярках хуйня полная, да и вообще. На красоту похуй, главное чтобы отрабатывалось как можно быстрее. вот этот вот >>695120 хуй
В соседнем треде прочитал что, неправильно использовать в функциях класса суперглобальные массивы Пост, Гет или подобные, это не правильно и не ООП. Это так? Как же тогда верно?
Идея в том что каждый класс и функция должны заниматься своим делом. Разбирать пришедшие из формы данные - это одна задача, а например что-то по ним считать - другая, потому этот код должен быть разнесен.
>>695333 >ненормально что ты обращаешься то к полю, то к методу. Если в isset обращаться к методу, то выдается ошибка что не может проверить результат метода. Что я могу поделать? Приходиться как-то выходить из этого положения. Я бы так обращался всегда через метод.
Вообще, я очень часто замечаю странные вещи в php. Это проблема языка или только у меня такое? Какие языки по-вашему мнению самые простые в написании?
Я, например, считаю что символ $ для объявления переменной лишний, точка с запятой ; - тоже. С радостью бы поставил плагин который фиксит это, если такое возможно. Просыпается интерес к другим языкам и его синтаксису. Думаю, по логике везде тоже самое. Очень интересует Haskell. У кого-нибудь есть опыт в работе с ним? Интересен ваш фидбэк.
Нет ничего лучше чем самому попробовать язык. Возьми и попробуй на хаскелле написать код делающий то же самое что твой код на PHP - выводящий форму и обрабатывающий данные из нее.
Насчет isset, он все равно неправильный. isset нет смысла использовать для проверки есть ли поле в объекте так как оно всегда есть, если есть сам объект.
> Я, например, считаю что символ $ для объявления переменной лишний, точка с запятой ; - тоже А как тогда обозначать конец команды? Как сделать чтобы команда занимала несколько строк?
> \b\w+[,;!?:]\S+\b На мой взгляд регулярку можно упростить еще. Ну например, зачем \b перед \w? Без нее все будет точно так же прекрасно искаться. Или зачем \b после \S?
> v\b\w★[жш]ы\w★\b То же самое - тут на мой взгляд много лишнего - надо бы упростить
> [^.!?;:—,]\s\b(но|а)\b Здесь ты предполагаешь что пробел всегда стоит ровно один - но это может быть не так. Например пробелов может быть 2, и первый может оказаться захваченным квадратными скобками. Лучше всего сделать выражение вроде "слово", "пробелы", "а или но"
> Задание на поиск "опечаток" на коррумпированных сайтах. Не видит русских букв в английских словах: http://ideone.com/DZlzuK
Я думаю, задачу можно свести к такому условию: надо искать русские буквы в английских словах и английские в русских, то есть слово с буквами 2 алфавитов. Определять, русское слово или английское, можно либо по первой букве либо по большинству букв.
Опять же регулярка какая-то сложная, достаточно ведь искать слова где есть буквы разных алфавитов, а дальше такие слова можно уже как-то вручную проанализирвоать.
> Не согласен, зайчик. А вдруг слово начинается с большой латинской буквы, например [K]алининградская область, или [M]агнитогорск. Тогда можно по тому каких букв больше. Или по буквам у которых нет аналогов в другом алфавите. ну вообще меня устроило бы и по первой букве.
> а эту дырочку на сайте госзаказов хоть прикрыли за эти годы? Там теперь цветом выделяют такие буквы. А так, никакой ответственности вроде никто не понес.
> Кстати, нельзя ли в регулярках писать код типа U+2014. Нет, пока единственный способ - закодировать символ 16-чными кодами в utf-8 вроде \xd1\xc8. В PHP7 (не в регулярках, а вообще в строках) появится возможность писать "..\u{2014}...": https://wiki.php.net/rfc/unicode_escape
В ОП посте есть задания на SQL/MySQL. Освоив их, ты будешь понимать базы данных и остается только освоить библиотеку вроде PDO чтобы делать запросы к базе данных не руками, а из php скрипта. Ну а дальше, если захочешь, можно уже за паттерны работы с БД браться (TableGateway, ACtiveRecord).
Ты всегда заменяешь латинницу на кириллицу. Но латинница может быть частью английского слова. Надо замену делать только в ловах со смешанными алфавитами. Если это урсское слово - подсвечивать и менять в нем только латинские буквы, и наоборот.
Анончик, переусложнил ты все. Ну посмотри сколько кода, причем с копипастой, сложно и запутанно. Там раза 3 одно и то же скопировано. Плохо.
Вот правильный алгоритм
- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!) - если остаток маленький, выплачиваем сколько осталось и уходим - иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
Не использовать статические методы. Конечно с ними никакой DI не получится. Надо использовать либо такие контроллеры, где ты создаешь их сам и можешь передать что-то в конструктор:
> function inclineWord($number, $word) { Функция искуственно переусложнена на мой взгляд. Во-первых ты исукственно ввел ограничение что она склоняет только 3 слова (рубли, тысячи, миллионы) хотя проще сделать универсальную функцию, склоняющую любое слово. Пусть функция принимает на вход 3 варианта слова и выбирает один из них.
Если ты создаешь переменную внутри ветки в ифе, ты не должен ее исплоьзовать снаружи так как есть шанс что ни одно из условий не выполнится и переменная не будет существовать.
Далее, программа склоняет неправильно:
> На вашем счету 1571887 один миллионов пятьсот семьдесят одна тысяча восемьсот восемьдесят шесть рублей
> function smallNumberToText($number, $isFemale) { тут аж 4 уровня вложенности ифов. Слишком сложно разбирать такой код, надо упрощать. Более того, там есть копипаста из-за чего функция стала огромной и нечитаемой. Избавься от копипасты. Ну например вместо того чтобы делать огромные ветки, попробуй обрабатывать части слова по очереди:
- если в числе есть сотни, добавляем слово для сотен - ... слово для 11-19 - ... слово десятков - ... слово единиц
Части строки удобно складывать в массив.
> $number000 = strtr($number000, $spelling); Странная конструкция. Для поиска в массиве по индексу есть оператор - квадратные скобки
> function bitNumber ($number) { имя функции должно начинаться с глагола
> while ($number>=10) { > $number = $number/10; > $bitNumber++; Тут можно использовать логарифм по основанию 10 вместо цикла. Логарифм показывает в какую степень надо возвести основание (10) чтобы получить данное число.
> if (((mb_strlen($number) - $position) % 3) == 0 ) { > $pieceNumber = mb_substr($number, $position, $len); Не используй строковые функции с числами
> if ($bitNumber >= 7) { Гораздо проще просто проверить что число больше или равно миллиону
В общем, код пока не годится - надо исправлять.
> конструкция из IF в в функции переименования маленьких чисел похожа на фрактал. Но совершенно не редактируема, как литой кусок говна В таких случаях можно выносить блоки в отдельные функции с понятными именами. Но в твоем случае надо вообще менять алгоритм как я описал выше - там будет всего несколько последовательно идущих ифов.
> Каждый раз, после ошибки, приходится переписывать ее занаво, т.к. не получается разобраться. Даже с комментами. Просто количество скобочек сбивает с толку Ну вот, ты сам видишь что такой код не годится. Код должен быть понятен.
Надо просто описать действия вкладчика, примерно так:
- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!) - если остаток маленький, выплачиваем сколько осталось и уходим - иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
Не возникнет. last id считается отдельно для каждого соединения с базой данных, так что 2 скрипта увидят каждый свой id.
Насчет доктрины - тут такая штука, что это уже готовый маппер. Ты только описываешь каким колонкам соответствуют поля объекта, а она за тебя генерирует маппер. Плюс умеет делать связи между объектами. Когда у тебя боьше одной таблицы, это здорово упрощает жизнь и избавляет от рутинного кода. Потому было бы неплохо повозиться с ней. Ну нет, так нет, лишаешь себя полезного инструмента.
Я открыл страницу с отключенным яваскриптом и у меня первый экран черный целиком, кроме пустого красного квадрата слева. И только прокрутив, появляется какой-то контент. Зачем так делать? Надо сначала сверстать нормальную страницу, а потом добавлять на нее эффекты - это называется progressive enhancement. Тут нет никакой причины делать черный блок в шапке.
Более того, у меня подозрение что анимацию выезжающей картинки можно сделать вообще средствами CSS. А еще лучше конечно ее вообще не делать.
Дизайн мне не нравится - на моем экране он слишком большой и информации на экране помещается мало. Ну и вообще я любитель черных букв на белом фоне. При том что все гигантское, во многих местах шрифт мелкий и серый, так что надо вглядываться - даже человеку с нормальным зрением. Этот диазйнер по моему ничего не смыслит в дизайне и подаче информации. Если он считает что текст настолько не нужен, то пусть не помещает его на страницу вообще.
На макете поля вокруг страницы сделаны градиентом - а на странице нет градиента, просто черные поля.
> 10 Respirators Тут у тебя цифра сливается с текстом в блоке тарифов
Фон на блоке outr skills у тебя черный, а на макете там что-то размытое.
Эффекты ужасные, они затрудняют восприятие сайта. Только я прокрутил и пытаюсь прочесть надписи, как прямо поверх них едет картинка или что-нибудь анимируется и взгляд срывается с текста. Зачем так делать? Анимация позвляет направлять внимание пользователя в нужную сторону, но тут она использована бездумно - просто чтобы было.
Кнопка с меню не работает. Более того, прятать меню на большом экране - глупая на мой взгляд идея так как:
- пользователь не видит что в меню - надо делать лишний клик чтобы куда-то перейти
Форма обратной связи не выглядит как форма. Пользователь может и не понять что это такое.
Если уменьшить масштаб в браузере то почему-то верстка разваливается. блоки с тарифами становятся узкими и текст в них начинает переноситься. В Our skills съезжают графиики.
Если увеличить масштаб, то при наведении на картинку, плашка над надписью view more вываливается из блока. Блок our clients разваливается.
Если сделать окно узким, появляется вторая вертикальная линейка прокрутки.
> <h2 class="page-header-hgroup__title">we’re sarbat</h2> > <h3 class="page-header-hgroup__slogan">a creative design agency</h3> Где это видано чтобы текст состоял из 4 заголовков подряд?
> <div class="row m-b-100"> > <div class="col-md-4"> 2 бесполезных дива. Зачем они тут нужны? Также, ты закладываешь что в гриде будет ровно 3 колонки и делаешь его неадаптивным.
> <hr/> Где мой 2000 год. И что это за слеш в конце? Ты часом XML с HTML не путаешь?
> <section class="feedback"> > <div class="feedback-slider"> > <div class="page-wrapper"> > <div class="grid"> > <div class="row"> > <div class="col-sm-6"> > <div class="feedback-comment"> > <div class="feedback-comment__avatar f-l"><img src="img/content/feedback-avatar-2.jpg"/></div> > <div class="feedback-comment-details"> > <h2 class="feedback-comment__headi такое ощущение что верстальщику платят за дивы. Это же надо такую лестницу нагородить ради примитивного блока с картинкой и текстом.
> font-family: "Notosans italic"; > font-family: "Notosans bold italic"; > font-family: "Montserrat bold"; Непраивльно объявлены шрифты - это одно семейство.
> src: url(../fonts/montserrat-bold.otf) Всего один формат - почему?
> html, body { > overflow-x: hidden; Это тоже кошмар
> ul { > list-style-type: none; } Теперь все списки на странице останутся без точек
В ксс коде куча копипасты. Нет вендорных префиксов.
В общем, я надеюсь что ты просто пока начинающий и первый блин комом. Это конечно надо переделывать все, от HTML до JS, в идеале вместе с дизайном. Пока качество ниже плинтуса.
>>695932 Vot eto da. > такое ощущение что верстальщику платят за дивы. Это же надо такую лестницу нагородить ради примитивного блока с картинкой и текстом. Объясни, пожалуйста, как сделать лучше. > Непраивльно объявлены шрифты - это одно семейство. Это критично?
Поясните, какие типы в Mysql лучше всего использовать для хранения телефонов? Координат? Булевых значений? Может, есть какие-то гайды, как рассчитать наиболее подходящее поле.
>>691331 >github.com/foobar1643/student-list/ Ну офигеть, я чет думал там все намного проще будет. Оп, можешь выложить список решений этой задачки? Очень интересно посмотреть как аноны делали.
>>696187 Я решил все задачи, кроме "Навигатора" в бонусных. Филолог, 32 года, изучаю с декабря. Сейчас вожусь с ООП, сделал также все задачи на HTML+CSS.
> Их даже не все "специалисты" решить могут, лол. Если ты про учебник то задачи там элементарные. Профессиональный программист их в уме решит и ни одного сложного места для него нет.
Здрасьте. Наконец поверил в себя и решился открыть для себя мир пхп. И уже на первых задачках для нубов натолкнулся на преграду http://ideone.com/JgT3ws . Буду благодарен за объяснение моей ошибки. Кстати спасибо ОПу за такой подробный гайд :3 Кота запостил.
>>696209 В твоем коде на самом деле несколько ошибок которые ты допустил по невнимательности.
Первая из них на 11 строке >echo "У анона выпало {$anonDice1} и {$anonDice2}\nУ компьютера выпало {$compDice1} и {$compDice2}\n; Тут ты не закрыл кавычки, из-за этого интепретатор PHP воспринимает весь код дальше как строку. Нужно всегда быть внимательным и закрывать кавычки.
Вторая ошибка на 16 строке >$doubles = Даблы. Игра закончена.; Тут ты объявить переменную $doubles как строку, но не используешь кавычки.
Третья ошибка на 27 строке >} else ($anonSum == $compSum) { В else не может быть условия, условие может быть в else if.
У Студента слишком много свойств чтобы передавать их все в конструктор, меня смущает что нужно создавать класс студента посреди класса отвечающего за работу с ДБ:
public function getStudentById($id) { ...
$result = $student->fetch(\PDO::FETCH_ASSOC);
$student = new Student() $student->setName($result['name']); ...
Давай разберем вопрос объектов и массивов. Очевидно, что функции которые принимают или возвращают студента, должны хранить его в переменной в каком-то виде.
$student = new Student; $student->name = 'Ivan'; // или setName() $student->birthYear = 1990;
Что мне очевидно, так это то что выгоднее выбрать какой-то единый способ, чем сделать чтобы в половине функций использовался массив, а в половине объект. Иначе нам придется делать лишние преобразования.
Соответственно вопрос: подумай, какие преимущества и недостатки есть у каждого способа. И когда какой лучше использовать.
Насчет этого:
> меня смущает что нужно создавать класс студента посреди класса отвечающего за работу с ДБ: Ну ведь метод должен вернуть что-то что хранит информацию о студенте. Либо массив либо объект. Что-то все равно придется создать. В этом и есть смысл метода getStudentById.
> У Студента слишком много свойств чтобы передавать их все в конструктор, Их и не требуется передавать. Можно сделать пустой конструктор и заполнять свойства позднее. В конструктор обычно передают вещи без которых объект работать не может, но студента вполне можно создать не заполняя его поля, с значениями по умолчанию.
Может, кто-нибудь сталкивался с функцией mail(). Получается, с этой функцией можно отправлять письма даже от "дикого" адреса например с [email protected] Она требует какой-то доп. настройки сервера или работает с plain Apache?
Я хотел сказать что можно возвращать сам id или прописывать его в объект-студента. А тут нарушение инкапсуляции. Инкапсуляция подразумевает сокрытие внутри класса деталей его работы. То есть когда мы вызываем метод вставитСтудентаВТаблицу нас не интересует какой именно библиотекой (PDO/mysqli) это делается, какие параметры соединения с БД, какая это БД (mysql или mongodb). Это внутреннее дело класса TDGateway. Мы лишь знаем что можем дать ему объект и он его сохранит.
И возвращая из него наружу объект связанный с PDO, ты нарушаешь этот принцип. Ты раскрываешь внутреннюю реализацию окружающему коду и делаешь его зависящим от нее.
Чем это плохо? Ну тем что функционал работы с базой данных вытекает из класса в окружающий код и смешивается с другим функционалом.
Ну к примеру если мы завтра решим перейти с PDO на mysqli нам придется править не только класс TDG, а еще искать где используется этот утекший объект PDO и менять код там.
И даже если мы никуда не переходим, а просто хотим разобраться как работает класс, это может доставить неудобства.
Конечно на твоем простом приложении это не чувствуется. Но представь большое приложение над которым работает 100 человек. Сегодня ты выдал наружу объект PDO - завтра он уже используется в 50 местах и отрефакторить код становится намного сложнее.
Нет, это серьезная ошибка и она показывает что ты пока не понял концепцию инкапсуляции и разбиения кода на независимые части.
Так плохо написать на Яве вряд ли получится. Плюс она требует больше усилий для изучения что отсеивает ленивых и плохих кодеров. Там ведь без ООП тебя даже на стажера не возьмут.
Проблема тут только в том что человек не доучился. Он изучил синтаксис, но не дошел даже до ООП, архитектуры, не говоря хотя бы про умение писать читабельный и поддерживаемый код. То есть написать скрипт на 15 строк этот человек способен. а на большое приложение его знаний не хватает.
Увы, в нашей сфере такого много. Даже люди с опытом часто плохо разбираются в тонкостях ООП дизайна или исключениях. плохо знают обработку ошибок в PHP, а некоторые даже не могут объяснить как правильно экранировать данные.
Разумеется если вы будете учится по нашим задачам, вам придется во всем этом разобраться и код как на скриншотах вам тут никто не позволит писать.
Поясните такой момент по SQL. У нас же есть там FOREIGN KEY и ими нужно пользоваться. Но смотрите: Есть 2 таблицы, допустим таблиза `user` с айдишником юзера и его именем и допустим таблица `user_age` в которой есть id, user_id (внешний ключ) и age. Понятно, что возраст можно тоже в первую таблицу, но чисто для примера. Так вот. Добавляется пользователь на сайт, заполняя форму с именем и возрастом, в таблицу user он норм добавляется, там его id автоинкремент и все ок, но как тут же добавлять его во вторую таблицу если мы еще не знаем его id? Можно конечно написать какой-то костыль, но мне кажется логичным если бы это можно было делать средствами SQL
>>696331 >>код как на скриншотах вам тут никто не позволит писать
Вроде бы у вас тут все такие няшечки почти как доброчан но вот от таких утверждений "холодок" пробирает. Может, все-таки дать возможность выбора стиля? На работе приходится писать код вместе с другими людьми, а в этом треде люди просто наслаждаются кодом.
>>696344 Создать триггер Вот тут есть специфический костыль: http://dev.mysql.com/doc/refman/5.7/en/getting-unique-id.html INSERT INTO foo (auto,text) VALUES(NULL,'text'); # generate ID by inserting NULL INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text'); # use ID in second table
>>696346 Ты сам бы хотел ковырять вилкой подобный код от того, кто особо не заморачивался? Давай теперь по тротуарам ездить и переходить улицы где попало, шишка встанет, возбудимся.
>>696377 Ковырял код сайта на Битриксе, по чужому примеру написал нужный мне компонент. Мне норм. Можно разобраться, если есть комментарии и код хоть как-нибудь структурирован (хоть в виде цельных функций с небольшим количеством точек входа, а не просто слабосвязные фрагменты в разных файлах). Тот код ещё tolerable
Нет, не дадим. Надо с самого начала приучать писать правильно. Как бонус, если вы научитесь ваш код в тестовом задании или собеедовании будет выгодно выделяться.
В уроке описаны функции работы со строками mb_substr и mb_strtoupper - ты читал? mb_usfirst это функция которую написал автор кода, с вопросами надо к нему обращаться.
И не копируй этот код - мало того что он неряшливо отформатирован, он еще и написан неэффективно, неправильные циклы использвоаны, много лишних вещей.
Функции вроде mb_strtoupper должны знать в какой кодировке текст чтобы его обработать. Потому что в одной кодировке одна буква кодируется одним байтом, а в другой та же самая буква обозначается другим байтом в памяти. Соответственно без знания кодировки текста функции не могут выполнять свою работу.
Автоматически определить кодировку нельзя, текст в памяти это просто набор байтов (чисел).
Вот некоторые аноны жалуются что им долго все изучать и нельзя ли как-нибудь побыстрее все делать? Вот человек полгода по хардкору учился, берите пример: https://vc.ru/p/180-sites-in-180-days
Насчет ORM. Аноны, писать все эти мапперы или TDG руками - это каменный век. Вылезайте уже из прошлого и осваивайте доктрину. Или хотя бы сомнительный active record из Юи 2.
>>696554 А я вот где-то читал другое мнение, может быть даже в этом треде. Суть была в том что кто-то жаловался на то, что новички используют всякие ORM типа доктрины, а потом когда нужно написать TDG или EntityMapper руками, они ничего не могут и тупят.
Я смотрю аноны какой-то pimble-контейнер используют, поясните простым языком зачем оно надо? У меня подозрение есть, что вот мол на странице будет десяток отдельных типа плагинов выводы товаров, комментариев и на каждый надо свой контроллер, который использует какие то общие штуковины, например соединение с бд и типа удобно все это в одном месте держать. Я правильно понял? Ну там ошибки например в нем собирать, да-да?
Вообще с вью и моделью вроде все очевидно и понятно, а как обращаться с этими контроллерами нет. Весь день эту штуку курю, хочется разобраться как следует перед тем как начать.
>>696582 >удобно все это в одном месте держать. Я правильно понял? Да. Так же, в контейнере объект создается один раз, и каждый раз когда ты вызываешь метод get(), то получаешь уже созданный экземпляр объекта, а не создаешь его каждый раз заново. Еще контейнеры удобно использовать при Dependency Injection в контроллерах. Если делать контроллеры зависимыми от контейнера, это позволит убрать завязку контроллера на определенный класс, и в будущем сделать код более удобным для масштабирования. >Ну там ошибки например в нем собирать, да-да? Нет, ошибки в нем собирать не нужно. Контейнер существует только для того чтобы хранить объекты, и отдавать эти объекты по необходимости. Для ошибок существуют исключения, у ОПа есть урок на эту тему https://gist.github.com/codedokode/65d43ca5ac95c762bc1a И если ты не читал, почитай про Dependency Injection вот тут https://gist.github.com/codedokode/e1d31a31b37d5f635057
Подскажите по гитхабу, подскажите такой момент - я создал репозиторий, разместил там файлы и папки своего проекта, тот с кем я работаю сделал изменения в этом репозитории,изменения высветились на самом гитхабе, как мне сделать так, чтобы и у меня на ПК они тоже произошли? Что надо ввести в командной строке?
>>696334 КАК СТРАННО-ТО, ДА? Нет чтоб сидеть, учить, дрочить, изучать годами, живя под мостом или на дошираках, так эти пидоры НА РАБОТУ ХОТЯТ, да побыстрее. Согласен, да, степень охуевания крайняя. Пиздить их надо. Ногами.
>> Непраивльно объявлены шрифты - это одно семейство. > Это критично? Да, из-за этого например не будет такая штука работать:
<div>hello <em>world</em></div>
Так как у него курсивная версия шрифта объявлена как другой шрифт с другим font-family, то текст в em не станет курсивным или может получит "искуственный" наклон, сгенерированный браузером вместо настощяего курсивного шрифта.
Также, используется всего один формат шрифтов, не предоставляется напрмер современный woff для современных браузеров. Ну и вообще код подключения шрифтов там плохой, человек явно пропустил изучение этой темы.
>> такое ощущение что верстальщику платят за дивы. Это же надо такую лестницу нагородить ради примитивного блока с картинкой и текстом. > Объясни, пожалуйста, как сделать лучше. Надо начинать с семантичной верстки в HTML. То есть в HTML мы размечаем текст тегами по смыслу, а все оформление выносим в CSS.
Условно говоря, если там есть отзыв с фото, заголовком и текстом, как его можно разметить? Ну наверно так:
Посмотри на эту разметку: у нас есть отзыв (testimonial), внутри в него вложен заголовок, текст и картинка. Согласись, это логичный и минимальный вариант - дальше упрощать некуда.
Заметь что я использовал БЭМ-стиль для именования классов.
А только после этого мы с помощью CSS задаем оформление этих блоков. При этом нам может быть придется внести небольшие поправки. Ну например, если мы хотим вынести картинку вбок флоатом, нам придется переставить ее в начало блока, и может для сложной верстки нам где-то придется добавить один-другой див. Ну к примеру если у нас есть 3 колонки:
Нам может быть также придется завернуть их в див или section чтобы сделать clearfix.
То есть я понимаю, что CSS не всесилен, флексбокс пока не везде работает, и иногда HTML приходится чуть-чуть подправлять ради верстки. Но этого должно быть как можно меньше. Порядок всегда должен быть такой:
1) смысловая разметка текста тегами 2) написание CSS
В идеале мы бы хотели чтобы при смене дизайна HTML требовал минимальные изменения (кстати это помогает при адаптивной верстке так как адаптивная версия это фактически другой дизайн для той же страницы).
В макете мы видим что это не соблюдается. Если ты откроешь HTML то увидишь что он переполнен быссмыссленными вмпомогательными дивами, которые нужны только для того чтобы на них повесить какой-нибудь стиль. Большое число этих дивов говорит о слабом уровне автора. Он не смог отделить оформление от разметки и оформление из CSS вытекло в HTML. Плохо.
Контейнер создает и хранит сервисы. Он же следит чтобы они были в одном экземпляре, а не создавались каждый раз заново.
Сервис - это объект, который обычно существует в одном экземпляре и выполняет какие-то действия. Ну например, валидатор, класс TDG для работы с БД, объект PDO. Модель студента - это не сервис, это как раз противоположная вещь, модель, или говоря по-умному "модель предметной области" (Domain model). Она может быть в нескольких экземплярах, а может вообще не быть.
Стоит добавить или убрать слеш или пробел - и все сломается. Прекрасно - с таким кодом, постоянно требующим поддержки, разработчику явно не грозит увольнение.
Установи и настрой xdebug. Либо старый добрый var_dump. Твой способ с консолью имеет недостатки, что если например вызвать функцию внутри HTML атрибута, то тег скрипт разломает атрибут и сломает верстку.
Да и код не очень правильный, ты же фактически сделал 2 копии кода, который считает выплат за месяц, а зачем делать 2 копии когда можно сделать универсальный код.
> $creditBalance = $creditBalance - $monthlyPayment; > $paymentTotal = $paymentTotal + $monthlyPayment; Вот это скопировано 2 раза. Попробуй избавиться от копирования, вынеся это наружу из ифа и заменив иф на функцию min или max.
Твой запрос ищет записи у которых есть filter_id = 1 или 2. А надо найти записи у которых есть одновременно* оба этих значения. Ну например посты с тегами "юмор" и "политика" одновременно.
> $number = 0; > $op = $char; Эти 2 команды повторяются, можно вынести их из ифа чтобы не повторялись.
> (is_numeric($char) | $char=='.') Логическое ИЛИ пишется как ||, а у тебя тут битовое ИЛИ, которое может давать совсем другие результаты.
Также, лучше избегать exit внутри функции, так как это получается какая-то нехорошая функция которая может завершить скрипт и не вернуть нам управление.
Я все-таки подумал, надо бы при ошибке CSRF выводить соотв. сообщение и показывать заполненную форму. То есть относиться к ней как к обычной ошибке. Ну вдруг по какому-то стечению обстоятельств у пользователя куки отключены или он их почистил в процессе заполнения формы?
Плюс браузер имеет право удалять куки если их слишком много.
Ты же при ошибке CSRF теряешь введенные данные.
Я бы сделал так:
$errors = $regHelper->validateStudent($student); Если ошибка в токене, добавляем ее в errors. ....
> $student = $this->getFormData($student); Тут нет смысла возвращать студента так как объект передается в функцию как бы по ссылке
Что-то я не уверен что TableHelper это сервис. Это ведь объект представляющий информацию о выбранных фильтрах в таблице - тогда он не может быть сервисом, а должен быть обычным объектом. Сервис это объект который обычно есть в одном числе и выполняет какие-то действия над другими объектами или чем-то еще, а тут обычный объект не-сервис. Его надо просто создавать через new.
По идее концепция такая, что сервисы не хранят состояние, зависящее от текущего запроса. То есть один и тот же объект-сервис можно использовать для обработки нескольких запросов от разных пользователей. И TableHelper тогда не может быть сервисом так как для каждого запроса у нас свои параметры фильтрации таблицы.
Но тогда в эту концепцию не впишется сервис авторизации. Что-то я сам немного начинаю запутываться. Да, правильный сервис авторизации не должен хранить внутри себя текущего пользователя так как в разных запросах он может быть разный. Он может только предоставлять функцию которая смотрит на куки и возвращает текущего пользвоателя, но не хранит его внутри себя.
Вообще, состояние в сервисах это проблема. Вот например в Симфони 2 объект Request, хранящий информацию о запросе (GET/POST/COOKIE) хранился в контейнере как сервис. Но с ним была проблема, что до определенного момента он мог быть еще не заполнен данными. А в режиме командной строки GET или POST вообще нет. Более того, там можно было создавать искуственный объект Request для вложенной обработки подзапроса и все становилось запутанным, так как в один момент времени это был один объект, а в другой момент - другой.
Вот у тебя если подумать, есть та же проблема - пока TableHelper не заполнен информацией из GET, он будет возвращать неактуальные данные. И самое простое решение - превратить его из сервиса в обычный объект.
Сервисы не должны зависеть от того, что какойто контроллер должен заполнить их данными.
Но в любом случае, TableHelepr это не сервис, который может быть полезен в разных местах кода. Это объект представляющий состояние фильтров таблицы и нужный только в контроллере который с ней работает. Это что-то вроде модели студента, обычный объект.
Выбор пола и местный ли житель лучше сделать радиокнопками - селект требует больше кликов и скрывает варианты от глаз пользователя.
Я вижу, ты там getopt освоил? Молодец что не стал велосипед изобретать.
Также. тебе небольшая задачка чтобы подумать. Вот у тебя есть регулярные выражения для имени или фамилии в 2 местах кода. Разве это хорошо? Подумай, что можно сделать чтобы это исправить.
При попытке запустить CLI скрипт я получаю:
> php filler/databaseFiller.php > Warning: include(../app/init.php): failed to open stream: No such file or directory in /home/ubuntu/workspace/filler/databaseFiller.php on line 3 Надо писать абсолютные пути через __DIR__.
Также, совет. Если в первой строке скрипта написать
#!/usr/bin/php
или лучше
#!/usr/bin/env php
И сделать файл исполняемым (chmod a+x file) то в линуксе можно его запускать напрямую, командой
./filler/file.php
Также, вставка большого числа записей скорее всего будет быстрее если вставлять их не по 1 записи за транзакцию а например по 100 или 1000. ну это так, скорее на будущее, чтобы ты знал.
Ну и при вставке большого числа записей пагинация превращается в спортлото. стило бы конечно ограничить ее. Можно в пагинаторе сделать метод, возвращающий номера страниц которые надо вывести и выводить только певрую, последнюю и несколько страниц рядом с текущей (например +1, +2 и +10).
Вообще, проект произвел хорошее впечатление. Давай уже на фреймворки переходить.
> 1. Я сделал поиск через сфинкс, нужно ли в репозиторий включать мой sphinx.conf с настроенными индексами, или лучше оставить все заполнение для людей которые будут устанавливать приложение? Да, а как иначе? не самому же этот конфиг писать. Не забудь в установке упомянуть что надо запустить индексатор.
> 2. Так же, переиндексацию я сделал через cron, для этого пришлось написать CLI скрипт на PHP который очищает реалтайм индекс при переиндексации (как очистить rt индексы из командной строки я не нашел). Нужно ли включать его в репозиторий (с bash скриптом для крона) или опять же, это оставить для тех кто устанавливает? Да, нужно, конечно. И незабыть упомянуть все это в ридми. Переиндексацию желательно делать без остановки работы поиска.
> 3. Если приложению не удалось подключится к поисковому демону (сфинкс просто не устанавливали, например), в этом случае достаточно будет вывести ошибку 503 и написать что подключения к демону нет, или лучше будет на странице с поиском вывести заглушку "Поиск временно недоступен" с кодом 200 и основной навигацией приложения? Выкинуть исключение которое поймает общий обработчик исключений. Навигацию можно поместить на заглушку страницы 503. Не надо делать частный случай для неработающего демона.
Выдавать страницу с кодом 200 точно неправильно так как роботы могут ее проиндексировать.
Надежнее все же через HAVING ... AND ... проверять наличие всех нужных строк. Также, добавить то же условие в WHERE через OR или IN в надежде что может как-то удастся задействовать индексы для отсева заведомо не подходящих строк.
Если в вершине кроме суммы писать еще остаток запаса банкнот то вполне рабочий. В нашей задаче остаток банкнот тоже часть состояния, в отличие от задачи без ограничения.
И кстати когда ты это сделаешь можно будет обсудить варианты оптимизации, как выбирать путь по графу. ну к примеру вместо того чтобы 2 раза взять по 500 мы можем попробовать сначала сделать это одним прыжком. А если не получится, вернуться и попробовать другие варианты.
Это работает за счет того, что пустая регулярка соответствует "промежуткам" между буквами (пустая регулярка соответствует вообще любой строке) и разбивает по ним строку на буквы. Флаг PREG_SPLIT_NO_EMPTY в конце нужен чтобы удалить 2 пустых элемента в начале и конце массива.
Если вдаваться в детали, то работает это так:
preg_split идет по строке слева направо, начиная с 0-го символа и пытается проверить, подходит ли строка начиная с текущей позиции, под регулярку. Если нет, он переходит к следующему символу, если да, то вырезает часть текста совпавшую с регуляркой, а то что шло перед ней, добавляет в массив результатов и движется дальше.
Ну например вот дана такая строка:
$x = preg_split("/[0-9]+/u", "a123b456");
- проверяется совпадение строки начиная с первого символа, "a123b456", с регуляркой. Совпадения нет, так как регулярка требует наличия 1 или более цифр, потому preg_split переходит к следующему символу строки - проверяется совпадение строки, начиная со второго символа ("123b456"), c регуляркой. Совпадение есть - регулярка соответствует символам 123 (квантификатор плюс жадный и всегда стремится захватить максимум символов). Так как совпадение есть, то preg_split проскакивает совпавшую часть ("123"), а то что шло перед ней, добавляет в массив результатов ("a"). - проверяется совпадение оставшейся части строки "b456" с регуляркой - совпадения нет, потому preg_split переходит к следующему символу - проверяется совпадение строки "456" с регуляркой. Совпадение есть, потому preg_split добавляет в массив результатов "b", проскакивает цифры - обнаружен конец строки. Preg_split добавляет в массив результатов, все что от нее осталось, это пустая строка, и получается результат ["a", "b", ""]
Теперь вернемся к хаку.
Пустая регулярка соответствует любому тексту, потому на каждой позиции она дает совпадение. Но она не захватывает ни одного символа, потому preg_split просто отрезает буквы по одной и сохраняет в массив. Также, в массив попадают 2 пустых строки из начала и конца слова.
Обрати внимание на флаг u. Он говорит что текст в utf-8 и заставляет разбивать строку именно на буквы по границам utf-8 символов, а не на куски по 1 байту (в utf-8 1 символ кодируется несколькими байтами).
-----
Если ты разбил строку на символы, то проще их перевернуть через array_reverse, склеить обратно и сравнить с исходной строкой.
> if ($testText[$i] == $testText[count($testText) - $i - 1]) {} else { тут надо просто заменить равно на не-равно.
Юзверь на сервер загружает файл с двумя возможными кодировками. Первая "1251", вторая "ISO-чтототам" необходимо перекодить файл в utf8. Как узнать какой кодировки файл что бы заюзать iconv? Или можно два подряд iconv написать из 1251 в utf и потом сразу же из iso в utf. $var=содержимое файла. $var=iconv ("CP1251", "UTF-8", $var); $var=iconv ("ISO-8", "UTF-8", $var); Кракозябра на выходе не вылетит?
>>696875 Первая кодировка (CP1251), вторая (UCS-2 LE BOM); mb_detect_encoding определяет обе как ASCII ибо это файлы из эхеля. Если буду действовать как описал постом выше будет на выходе потеря данных. $var= iconv('ASCII', 'UTF-8//IGNORE', $var); Тоже не работает HELP
>>696745 > Так как у него курсивная версия шрифта объявлена как другой шрифт с другим font-family, то текст в em не станет курсивным или может получит "искуственный" наклон, сгенерированный браузером вместо настощяего курсивного шрифта. Понял, спасибо. > Ну и вообще код подключения шрифтов там плохой, человек явно пропустил изучение этой темы. Взял на заметку. > Порядок всегда должен быть такой: Оно логично, но тут имхо нужен опыт, чтоб суметь наперед построить всю структуру страницы в HTML. Впрочем, оно приходит со временем наверное. > Заметь что я использовал БЭМ-стиль для именования классов. Заметил, но кмк мне пока рановато вскрывать эту тему.
Нужно найти или написать свою функцию. Кодировку в произвольном случае определить по тексту невозможно. Однако в реальности можно статистически ее определить по частоте упоминания разных байтов и наличию невозможных в некоторых кодировках их сочетаний.
Погугли в интернете на эту тему. Разберись в предлагаемых решениях. Учти что они могут быть неправильными.
> Или можно два подряд iconv написать из 1251 в utf и потом сразу же из iso в utf. Тебе надо изучить что такое кодировки. Кодировка это таблица показывающая какими байтами кодируется символ. Бездумно применяя перекодировки ты только все сломаешь.
Вообще конечно, лучше было поручить эту задачу более опытному разработчику. Ведь ты не знал даже что detect encoding никогда не работала. Ну либо добавить в интерфейсе поля для выбора кодировки вручную.
>>696753 >>696587 ServiceLocator - это создаем класс и в нем складываем все хелперы, а в классе, имеющем зависимости, обращаемся к сл и берем у него что нужно. Dependency Injection - это то же самое, только попадает в зависимый класс через конструктор. Я правильно разницу понял?
>Он же следит чтобы они были в одном экземпляре Это типа создает объекты по мере необходимости? Круто придумали, чет не догадался бы до этого.
>>696943 > Ну так давайте набирать опыт в этом треде. Давайте. Мне пока званий не совсем хватает, точнее СОВСЕМ не хватает, хотя я вроде стараюсь и 8 часов уделяю. С 1 апреля начну верстать макеты, там уже и начну вас заебывать надоедать > ну не знаю, это не так сложно, и лучше сразу приучаться к какой-то системе именования. Логично, лучше чем никак. Принято, надеюсь что аукнется в дальнейшем.
> Это типа создает объекты по мере необходимости? Да. Посмотри исходники pimple.
> ServiceLocator - это создаем класс и в нем складываем все хелперы, а в классе, имеющем зависимости, обращаемся к сл и берем у него что нужно. Да, вроде того, и это обычно плохая штука когда в конструктор мы передаем сервис локатор вместо передачи конкретных сервисов.
>>696954 >и это обычно плохая штука когда в конструктор мы передаем сервис локатор вместо передачи конкретных сервисов > new Class($container->bdConnect, $container->helpUser); Да? За ссылки спасибо, буду курить.
Пару вопросов. Читаю материал, а умнее себя не чувствую, это норма? Каково должно быть соотношение теории/практики? Часто ли оперившиеся кодеры лезут в гугл за советами? Как иностранные клиенты/конторы относятся к русскоязычным погромистам? Нету выражения "русский код", случайно?
Какая сука посоветовала https://geekbrains.ru/records/927 Это говно какое-то, нахер я туда полез. Создателя курса надо за яйца подвесить и линчевать после этого за то, что ни хера не объясняет толком.
>>697160 Вызываешь несуществующую функцию ads(), об этом написано в ошибке. >PHP Fatal error: Call to undefined function ads() in /home/Kw5nGw/prog.php on line 10
>>696972 Давно хотел спросить, почему Symfony так пишется? По-английски пишется через ph. По-французски symphonie. Не могу допустить, что могли допустить такую ошибку, может это связано с авторскими правами, типа кто-то застолбил право на название раньше.
Какой ужасный сайт geekbrains, это просто нечто. Сообщения идут через жопу, курсы бесплатные - просто говно, юзабилити на нуле (зачем мне видеть постоянно, кто мне лайки поставил или оповещения об ответах). Прочитаешь сообщение - а оповещение о нём все висит на главной панели. Говно, яростно нерикаминдую. Если бесплатный курс настолько плох, то это не значит, что платный будет хорош. Сомневаюсь уже в этом.
>>696954 Сайт про паттерны шикарный. (Интересно, как ты находишь такую годноту? Я вбил "паттерны проектирования примеры", выдало неудобоваримые фекалии типа википедии или хабра). Хотя если честно код примеров который они приводят был бы более полезным, если бы они выводили их как физическую формулу, а не давали готовый код. Тут ведь нужно понять принцип, почему именно такая структура кода, а не выучить наизусть свойства и методы приведенных классов. Потом попробую сам написать такой пост с "выведением" паттерна из жизненного случая.
Пока такой технический вопрос: вот в описании простой фабрики они приводят пример, где у класса есть белый список объектов, которые фабрика может возвращать. http://designpatternsphp.readthedocs.org/ru/latest/Creational/SimpleFactory/README.html Это реализовано защищенным свойством protected $typeList, которому почему-то внутри конструктора присваивается значение массивом. А почему было не написать сразу значение по-умолчанию? protected $typeList = array('bicycle', 'scooter'); Я бы еще понял, если бы в конструктор можно было передать этот массив в виде аргумента и потом присвоить свойству. Может в ранних версиях php такое не воспринимал (принимал только простые значения типа строк или чисел). В 5.5 только что проверил, такая запись валидна.
Еще я видел что иногда такие вещи хранят в методах. Например в yii это набор правил валидации формы http://www.yiiframework.com/doc/api/1.1/CModel#rules-detail Но это пожалуй действительно неправильно, метод должен что-то делать, а не возвращать неизменяемое значение.
>>697277 >You can imagine to inject your own type list Виноват, привык не обращать внимания на phpdocs, а там оказывается иногда тоже бывает полезная информация.
Имей в виду что паттерны мало полезны без примеров использования, а для них надо изучать исходники фреймворков.
> Хотя если честно код примеров который они приводят был бы более полезным, если бы они выводили их как физическую формулу, а не давали готовый код. для этого попробуй поставить себе вопрос: как реализовать ту или иную вещь. Не знаю, что привести в пример, ну возьмем например паттерн NullObject: допустим у тебя класс зависит от класса логгирования, но ты не хочешь никуда выводить этот лог. Паттерн NullObject придет в голову сам собой.
> А почему было не написать сразу значение по-умолчанию? > protected $typeList = array('bicycle', 'scooter'); Потому что там использован оператор точка и ты не можешь в значении поля по умолчанию использовать выражения:
> 'bicycle' => __NAMESPACE__.'\Bicycle',
> Еще я видел что иногда такие вещи хранят в методах. Например в yii это набор правил валидации формы Там другая ситуация. В Юи правила валидации описываются в классе-наследнике, потому в базовом классе под них оставлены методы для возможности их определить.
> Но это пожалуй действительно неправильно, метод должен что-то делать, а не возвращать неизменяемое значение. Метод может возвращать значение. Более того, методы можно сделать абстрактными и таким образом заставить пользователя их определять, чтобы он точно не забыл.
Клонирование объекта происходит быстрее чем создание нового? Если да, то почему и насколько? Попробовал самостоятельно сделать сравнение, результат какой-то странный. http://ideone.com/DtqlJe На ideone клонирование занимает больше времени. На моем слабом ноутбуке почти одинаково (около секунды). Не знаю, о чем это говорит.
И про метод __clone на php.net непонятное описание. >Копия объекта создается с использованием ключевого слова clone (который вызывает метод __clone() объекта, если это возможно). Что значит "когда возможно"? Метод __clone обязательно должен быть объявлен? Проверил, объявлять необязательно.
А, вот >По завершении клонирования, если у класса был определен метод __clone(), то этот метод __clone() вызывается у свежесозданной копии объекта, для возможного изменения всех необходимых свойств. Назвали бы тогда __after_clone или как-то так, чтобы было понятно, что это необязательный метод для пост-обработки.
Метод clone позволяет переопределить поведение при копировании, а также запретить его (если его сделать приватным или выбрасывать исключение, или и то и другое).
> Метод __clone обязательно должен быть объявлен? только если ты хочешь делать что-то нестандартное при клонирование.
Ну например: можно запретить клонирование. Можно обнулять ссылку на какой-то объект чтобы клон на него не ссылался. Можно генерировать новый уникальный идентификатор.
> они объявляют пустой метод __clone Потому что он абстрактный в родителе. Ты невнимательно изучил код.
А почему он абстрактный? Ну наверно чтобы сказать что объект предназначен для клонирования и надо не забыть определить поведение при клонировании.
> На ideone клонирование занимает больше времени. На моем слабом ноутбуке почти одинаково (около секунды). Не знаю, о чем это говорит. Чтобы была разница надо чтобы при создании что-то делалось относительно тяжелое. Ну например заполняется множество полей, или что-то считается.
Как сделать, чтобы границы не менялись при изменении масштаба? Забыл прямо сейчас. Полчаса уже сижу и не могу вспомнить. Чтобы я уменьшал масштаб, а всё не расползалось, а так же уменьшалось?
Задачи на HTML+CSSАноним25/03/16 Птн 12:52:42#708№697690
Как ОП и аноны относятся к видеокурсам? Вот есть Специалист с овер 1к баксов за курс и со слитыми на nmm-club всеми курсами без возможности фидбека. Есть myrusakov за курсы по паре тыщ рублей и 2500 видосами от прошедших курсы, его хвалят, наверняка всё это есть на торрентах. Есть нетология и гикбрейнс. А есть наш ОП с отличным учебником до ООП (только вкатываюсь в ООП, пока не смотрел, что там). Наш ОП - по-любому, но, может, ещё что-нибудь в нагрузку посоветуете посмотреть? Часто иной подход помогает закрепить и лучше понять пройденное, вот к этому стремлюсь.
>>697738 В курсах все галопом по верхам. Я посмотрел только специалиста и то, потому что под капельницами лежал и больше занять себя было нечем. Информация подается ну ооочееешь медленно. Но такова суть массовых курсов, они должны покрывать наибольшую массу людей, иначе не будет восторженного фидбека и продаж. У меня знакомый преподает яву в Беларуси на подобных курсах. Так от статистики я немного прифигел. Почти треть бросает не доучившись и до половины. Это при том что оплачивается весь курс сразу. Финальный экзамен сдает где то половина от оставшихся и только единицы доделывают индивидуальный проект (что то вроде задачи про файлообменник от ОПа). Мое мнение: если времени навалом, то почему бы и нет. Главное понимать, что некоторые сложные моменты будут опускаться в угоду доступности для понимания более широким кругом лиц.
>>697871 Спасибо за ответ, братишка. Я думаю, что статистика подобная была бы и у нашего ОПа, если бы он как-то её отслеживал. Я как-то обратил внимание на то, что количество форков у задач ОПа чем дальше, тем меньше. Но братишки совершенно разумно объяснили это тем, что дальше люди стараются установить IDE, Apache, MySQL, вот это всё, уже нет нужды писать код на Ideone. Хотя я сам только сейчас всё устанавливаю, начиная осваивать ООП. >некоторые сложные моменты будут опускаться в угоду доступности для понимания более широким кругом лиц. Я чувствую себя достаточно неуверенно и после большинства решённый бонусных задач, мне чем проще, тем лучше. А как у Специалиста всё идёт: каждое занятие объясняет какой-то этап по созданию сайта? Пошаговости мне не хватает крайне.
>>698019 http://ideone.com/munQVK - тире может быть и в домене. Ещё: >Номер + 7 999 123 4567 - верный >79991234567 Исправление неправильное. Или 8, или +7.
>>697690 Чёрт, вижу, некоторые задачи не в окончательном варианте сохранены, а в промежуточных. Особенность jsfiddle - прибавляет цифру к УРЛу, сохраняет отдельно важные изменения. Я там и делал, а потом всё равно сохранил без цифр. 1 задача: https://jsfiddle.net/te5t987m/3/ - например. Ну да чёрт с ними совсем, целый месяц на разбор этого всего ушёл, хотя всё равно лёгкости и понимания нет.
> мне чем проще, тем лучше. Тяжело в учении - легко в бою. Слишком "простые" объяснения могут привести к тому, что ты какую-то тему не освоишь и потом не сможешь понять что не работает.
Вот там где-то в треде люди не понимали как куки или сессии работают например.
А так, конечно, может быть полезно посмотреть еще какие-то другие курсы. Может ты что-то подзабыл, а тут вспомнишь. Только код не забывай писать, слишком много теории тоже плохо.
Выполнял первый более менее серьезный проект. Интересно все заказчики такие ебанутые или мне просто не повезло первый раз. Сделал все, что изначально планировалось. Потом началось а можете добавить вот тут хуетушечку, а вот здесь небольшой блок по выводу кала, а вон там можете чекбоксики с мочей поставить, а справа 3 блока с просмотренными товарами добавите. Пиздец. И все это в пиздец какие короткие сроки, как будто это как посрать сходить - изменить структуру бд, изменить формат вывода, перелопатить валидатор. Естественно я там наговнокодил. Жаль человека, которому придется туда заглядывать и что-то допиливать.
Сап, анончики. Задали курсач - написать простенькое веб приложение с использованием паттерна MVC что-то вроде простенького блога. Реализовывал подобное на php, но как начал искать информацию и понял что толкового очень мало. Может кто посоветует литературу, а в идеале простенький пример.
Ребята, смотрите как мой php нарушает мою логику вещей
//Форма регистрации которая не содержит $id поля и которое будет получатся в классе User'а class RegisterForm { public $login; public $password; }
class User { //Присваиваем значение null чтобы удобней было передавать данные при передачи их в БД public $id = null;
public $login; public $password;
//Внедряем значения из Формы или получаем их из ДБ public function __construct($properties) { $this->setProperties($properties); }
//Создаем универсальную функция для получения всех значений public function setProperties($properties) { //Преобразовываем в объект на случай если данные берутся из архива возвращающегося из БД $properties = (object) $properties;
foreach ($properties as $property => $value) { //Проверяем на то что существует ли свойство с таким же названием как и свойства полученных данных if (isset($this->$property) { $this->$property = $value; } }
}
}
class DataMapper {
public function getUserById($id) { $query = ... $result = $query->fetch(\PDO::FETCH_ASSOC);
$user = new User($result);
return $user; }
public function addUser(User $user) { $insert = $pdo->prepare("INSERT INTO students (id, login, surname) VALUES (NULL, :name, :password)"); $insert->execute(array(':login' => $user->login, ':password' => $user->password)); }
}
____
isset не проверяет что существует переменная, она проверяет не изменена ли переменная на значение отличное от NULL. Собственно, вытекает такой вопрос, как проверять на то что существует ли переменная?
А что ты знаешь? С нуля тут много тем надо изучить: PHP, html , css, js, sql , базы данных, архитектуру, mvc, ооп, какой-нибудь фреймворк. Большинству из этого можно научиться, кое-какие ссылки есть в шапке, но это не быстро. Ты сам-то понимаешь, во что ввязался?
> $properties = (object) $properties; Ерунда какая-то. Как можно преобразовать что-то в объект когда не указан даже класс этого объекта?
И вообще ненормально когда ты не знаешь данные какого типа даются функции.
> isset не проверяет что существует переменная, она проверяет не изменена ли переменная на значение отличное от NULL. Это в мануале описано ведь.
> Собственно, вытекает такой вопрос, как проверять на то что существует ли переменная? Это не требуется. В объекте всегда известно какие поля есть, а каких нет. Если ты не уверен то есть property_exists или что-то такое.
Также, я бы убрал prperties из конструктора - setProperties можно и так вызвать.
>>698298 >А что ты знаешь? С нуля тут много тем надо изучить: PHP, html , css, js, sql , базы данных, архитектуру, mvc, ооп, какой-нибудь фреймворк. Большинству из этого можно научиться, кое-какие ссылки есть в шапке, но это не быстро. Ты сам-то понимаешь, во что ввязался? Я знаком с пхп и делал, что-то вроде задачи про студентов на нем. Но начав копать в стороун серевлетов, понял что инфы очень мало. Намного меньше, чем по пхп. При этом разработка на джаве сложнее(с ее синтаксисом тоже знаком был курс в пол семестра в шаражке). И пока что я в тупике.
http://pastebin.com/cDy6xGQD Очень хочется понять, что именно в коде не так. Я только-только начал учиться и уже на 2-й задачке у меня траблы. Объясните плз, ПХПшники!
Что плохого в использовании этого? Не вижу ничего плохого в том, чтобы пользоваться этой возможностью.
>И вообще ненормально когда ты не знаешь данные какого типа даются функции. Почему не знаю? Это как раз и сделано потому что я знаю, что будет передаваться либо массив, либо объект.
>>698298 >> isset не проверяет что существует переменная, она проверяет не изменена ли переменная на значение отличное от NULL. >Это в мануале описано ведь. По первой ссылке в гугле пишут что это именно метод проверки на то что переменная существует
>>698298 >> Собственно, вытекает такой вопрос, как проверять на то что существует ли переменная? >Это не требуется. В объекте всегда известно какие поля есть, а каких нет. Если ты не уверен то есть property_exists или что-то такое. Без этого программа может не работать, потому что на вход могут придти данные не соответствующие полям объекта. Например, из класса формы регистрации могут прийти свойства пароля и повторного пароля, и они не должны содержаться в объекте пользователя, за место них будут свойства хэша, токена и соли.
>>698333 Херась, ты навертел! Проще всё надо. Цикл for, прибавляем к $i = 16 единицу, а сумму вклада каждую итерацию умножаем на 1.1. Останавливается цикл, когда у анона образовалось больше или равно одному миллиону.
> Он будет преобразован в stdClass А что такое stdClass? Зачем вообще нужен такой класс когда есть массив который может все то же самое только к нему прилагается куча функций для работы с ним?
stdClass это ошибка проектирования PHP и незачем его вообще использовать.
> Что плохого в использовании этого В том что в языке есть массивы, ты берешь вместо них дурно спроектированный аналог с урезанными возможностями и непонятно какая в этом выгода.
> По первой ссылке в гугле пишут Мало ли что в гугле пишут, ты мануал читай всегда в первую очередь.
> Без этого программа может не работать, потому что на вход могут придти данные не соответствующие полям объекта. Например, из класса формы регистрации могут прийти свойства пароля и повторного пароля, и они не должны содержаться в объекте пользователя, за место них будут свойства хэша, токена и соли. Вообще, лучше всего это делать снаружи модели. В случеа с формой ты вообще не должен смотреть какие поля в модели, а должен иметь белый список полей которые разрешено обновлять через форму. В случае с Бд код создания объекта из данных БД должен быть в классе-маппере.
Проверь что модель не знает ничего ни про базы данных ни про формы. Она должна быть отвязана от этого, маппингом в базу данных или обновлением модели из формы должны заниматься другие классы.
У меня это по моему написано в комментариях к задаче: гитхаб однажды взломали как раз из-за того что они данные из формы записвали прямо в модель без ограничений - и взломщик себе выставил как-то повышенные привилегии, хотя поля для них в форме конечно не было.
>>698333 >($a = 10000)&&($age = 16); ($a = 1000000); ($a = $a * 0.10 + $a)&&($age++) Где ты такое взял? Я не разу не видел чтобы в наших уроках такое было написано. Тебе нужно писать как написано на пикрелейтед >for ($i = 0; $i <= 10; $i++), только заменить на for ($age = 16; ... ) {
Затем высчитать проценты и проверить есть ли уже миллион $money = ... ;
Он там напутал. Вот смотрите, в уроке про циклы написано:
> for (действие1; условие; действие2) { ... тело цикла ... }
и ниже:
> Условия и действие в шапке цикла не обязаны быть связаны друг с другом и работать с одной и той же переменной. Например, можно написать for ($a = 1; $b < 10; $c++) { ... }
Видно что анон перепутал места где пишутся условия и где действия перед циклом и после каждого шага.
Далее, условия можно объединять через && или ||, это написано в уроке про кубики. только вот объединять надо именно условия. То есть можно так писать:
....($a > 10000)&&($age > 16)....
То,что у анона - это конечно неправильно. Ну например в условии надо писать ==, а не =. Он написал
$a = 1000000
получается присваивание вместо сравнения, и это условие всегда будет верным, а цикл - бесконечным.
В качестве действия можно указать несколько выражений, перечилив их через запятую:
for ($a =1 , $b =2; .....
Но злоупотреблять этим не стоит так как снижается читабельность, когда шапка огромная, и становится непонятно что тут является счетчиком.
Он связал действия через &&. С таким же услпехом их можно связать любой другой операцией например
То есть это только запутывает понимание и смысла никакого не несет так как результат операции никуда не сохраняется. Надо было просто написать оба присваивания через запятую.
Также плохо что есть 2 переменныхз с похожими именами age и age1 - это путает
Плохо что число 16 и 10000 написано 2 раза и его неудобно менять.
Удобнее. Но если кто-то хочет поставить и настроить нгинкс + php-fpm, готов их изучить и разобраться, я не против, хотя не вижу выгоды настраивать среду для разработки как продакшен.
Также, поясню еще кое-что. В PHP (как и в Си) оператор = это именно оператор, который возвращает результат (присвоенное число). Потому можно писать всякие адские конструкции вроде
$a = $b = 1; // присваивания выполняются справа налево, так как = это правоассоциативный оператор
или так:
echo ($a = 1) + ($b = 2); // -> 3
разберем еще такой интересный случай:
if ($a = 10) ....
Это эквивалентно такой псоледовательности:
$a = 10; if ($a) ....
if срабатывает если в скобках получается не-пустое (не равное 0, '', false, null, '0') выражение. То есть в данном случае - срабатывает всегда. Потому если ты путаешь == и = то программа формально имеет верный синтаксис но работает неправильно.
Защититься от этого можно если поменять местами переменную и число:
if (10 == $a)
тогда при опечатке выпадет ошибка.
Мне кстати не нравится эта особенность Си и PHP, от нее вреда больше чем пользы.
Также операторы += , ++ и подобные тоже возвращают результат и могут использоваться как часть выражения:
echo $a ++; echo ++$a;
и так далее. Разумеется, читабельность программы катастрофически ухудшается при таком использовании.
>>698347 >А что такое stdClass? Зачем вообще нужен такой класс когда есть массив который может все то же самое только к нему прилагается куча функций для работы с ним? > >stdClass это ошибка проектирования PHP и незачем его вообще использовать. Аргумент понятен, противопоставить ему можно разве то, что мы программируем на ООП и работаем с объектами, но какой в этом смысл, если это просто уступает перед массивом? В любом случае это ничего не меняет, ведь можно так же преобразовывать тип но только уже в массив, и подстраивать код уже под это, но даже это будет лишним потому что весь этот подход никуда не годиться, в силу того что надежнее будет иметь белый список полей.
>>698349 М, я читал об этом. Выходит что лучше в ручную вбивать свойства. Это же будет белым списком полей. К этому вопросу меня привело то что я не захотел вбивать много свойств в ручную. Похоже мне все таки стоит научиться пользоваться Symphony Forms. То что я сейчас делаю никуда не годиться.
> противопоставить ему можно разве то, что мы программируем на ООП и работаем с объектами, В ООП объекты имеют классы и в классе описаны их поля и методы. stdClass это не часть ООП на классах, а какая-то пародия на него.
Есть впрочем языки, где нет классов (JS), а поля и методы добавляются динамически (как в stdClass). Такой подход имеет право на жизнь, но не надо называть его ООП. И насколько я знаю, особо смысла он не имеет.
> ведь можно так же преобразовывать тип но только уже в массив, Можно подавать на вход функции только массив и прописать это ограничение в тайп хинте. Это будет праильный способ. Как можно надежно поддерживать код, в котором могут приходить на вход переменные любых типов? Как с такими переменными работать если ты не знаешь какого она типа и что с ней можно, а что нельзя делать?
> Похоже мне все таки стоит научиться пользоваться Symphony Forms Это очень мощный и сложный компонент. Вниматеьное изучение его исходного кода несомненно даст тебе много новых знаний, может быть познакомит с какими-то паттернами и вообще будет полезно для начинающего. Всячески рекомендую. Но исходники придется изучать, документация там уровня для чайников.
Вот тут, смущаясь и подрагивающими руками, после месяца ковыряния HTML+CSS попробовал ООП: http://ideone.com/0jxhaj Сначала казалось тёмным лесом и непонятным усложнением, а потом вдруг как осенило - удобнота-то какая!
>>698369 >>698376 >>698383 Это даже для меня было бы высокой нагрузкой столько информации, учитывая что я уже даже что-то умею писать. Для меня это легко понять, но я не уверен что новички справиться с этим сразу. Скорее всего они даже не поймут как им применить эти знания.
> foreach ($question->answers as $letter => $givenAnswer) { > if ($answer == $letter) { Цикл использовать для поиска одного элемента странно, для поиска по ключу в массиве есть скобки, для поиска по значению array-search, для проверки наличия ключа или значения тоже есть функции - все это есть в уроке по массивам.
>>698395 >для поиска по ключу в массиве есть скобки Как так? Я не соображу что-то. Просто всегда foreach использовал для разложения массива. >для поиска по значению array-search Спасибо, интересная функция, тут тоже её можно применить.
>>698384 >Как можно надежно поддерживать код, в котором могут приходить на вход переменные любых типов? Как с такими переменными работать если ты не знаешь какого она типа и что с ней можно, а что нельзя делать? Если это не риторический вопрос, то я бы ответил, что на переменные можно смотреть как на что-то абстрактное. Я не очень долго изучаю этот язык, но я могу даже не задаваться вопросом какого она типа, ведь любую запись например '0123456789' я могу представить и как массив array([0] => '0', ...), и как число intval('0123456789'), и даже, как мы только что видели, как класс. Однако, для меня это особо не имеет значения потому что в большинстве случаев операторы и функции автоматически преобразовывают значения в нужный тип.
Анон, решил сделать задачку, накостылить, скрипт, который ищет значение в массиве и удаляет его (точнее, добавляет несовпавшие значения в новый массив) и он почему-то не пашет. Останавливается на первом "несовпадении". Что не так? https://ideone.com/txEeY6
Меня иногда спрашивают, зачем нужны трейты? Где их можно использовать.
Вот сложный вопрос, что не говори. В основном они нужны в фреймворках и библиотеках и вы вряд ли будете их писать сами. Но я придумал несколько вариантов, где они полезны:
- трейт для логгера: добавляет методы setLogger, getLogger, если логгер не задан возвращает NullLogger (желательно не создавать его каждый раз, а хранить где-то статически один экземпляр или использовать синглтон! о мы нашли редкий пример когда этот паттерн полезен), соответственно использующий его класс может делать просто
$this->getLogger()->info(...);
не проверяя, задан логгер или нет.
- трейт для объединения объектов в дерево. Многие объект можно объединить в дерево, например:
- категории товаров часто являются деревом - форма и ее поля могут представлять дерево
Соответственно, этот трейт добавляет стандартные методы вроде getParent, getChildren, isRoot, getDepth, appendChild, removeChild, insertBefore тд.
- трейт для реализации интерфейсов коллекций вроде get/has/count/all/remove/add
Многие объекты содержат в себе коллекцию чего-то, там этот трейт может быть полезен.
>>698442 >логгер возвращает NullLogger >$this->getLogger()->info(...); Это зачем нам такая сбивающая с толку конструкция? Функция логгера - лог писать. Т.е. в использующем классе через трейт только $this->log('данные') должен доступен быть, ну и $this->attachLogger($logger) для внешней фабрики. В случае отсутствия логгера $this->log() просто ничего не пишет или кидает Exception в зависимости от критичности наличия лога для наших целей.
Там в PSR-7 (а делать логгер не по нему глупо) есть несколько уровней логгирования, и методы вроде info(), warning(), error(). Дублировать их все в трейте - тоже не очень хорошая идея. Конечно, напрямую было бы проще. можно конечно ограничить число этих методов, например только info и warning.
> В случае отсутствия логгера $this->log() просто ничего не пишет или кидает Exception в зависимости от критичности наличия лога для наших целей. У нас предполагается что логгер - не обязателен. Ну например логгер тебе нужен когда ты в cli скрипте тестируешь класс, а так в общем для работы не требуется. Или требуется, но не всегда.
У меня по крайней мере такое было что логгер нужен только для отладки/тестирования, а так не нужен (да и генерировал бы огромное число сообщений).
>>698448 Несколько уровней логгирования делаются через константы интерфейса, который имплементирует использущий класс. interface LogLevels { const LOG_INFO = 'info'; const LOG_WARNING = 'warning'; const LOG_ERROR = 'error'; }
interface LoggerAware extends LogLevels { public function attachLogger(Logger $logger); public function log($data, $type); }
trait LoggerTrait { public function log($data, $type) { if ($this->logger !== null) { $this->logger->log($data, $type); } }
public function attachLogger(Logger $logger) { $this->logger = $logger; } }
class Logger implements LogLevels { public function log($data, $type) { switch ($type){ //решения о логгировании по типу сообщения case LOG_INFO: case LOG_WARNING: case LOG_ERROR: } } }
class Client implements LoggerAware { use LoggerTrait; public function someAction() { $this->log('message', LOG_INFO); } }
Тогда в использующем классе просто делаем $this->log('данные', LOG_WARNING); Логгер сам разбирается, как логгировать каждый тип, разные типы логгеров и NullLoggerы не нужны. Если логгер не подключен, ничего не логгируется.
>У нас предполагается что логгер - не обязателен. Тогда он просто ничего не возвращает, NullLogger не нужен.
То есть PSR-3, перепутал. Ну и у тебя какое-то странное наследвоание интерфейса только ради импорта констант - мне оно не нравится. Интерфейсы ведь не для этго.
И перед константой надо будет писать LogLeves::LOG_WARNING
> 4.1 https://ideone.com/qUpQUI > } elseif ($aiResult = $humanResult) { Ты забыл что при сравнении надо писать ==, а не =. Одиночное равно просто присваивает значение переменной и так как оно не нулевое, то условие получается всегда истинно.
Ну и к тому же в последнем блоке незачем писать условие, а нужно просто писать else без условия - то есть этот блок будет срабатывать если ни один из вышестоящих блоков не сработал.
В остальном верно.
> 5.1 http://ideone.com/sMgDgr > PHP Notice: Undefined variable: halfLength in /home/1kSN4e/prog.php on line 13 Ты обращаешься к не существующей переменной. Ты там опечатался в последних буквах halfLenght, посмотри внимательно.
Также, при несовпадении букв надо выходить из цикла, а не продолжать его. Для выхода есть команда break, а хаки с подменой значения счетчика усложняют понимание кода.
> Не то скопировал. 5.1 https://ideone.com/PGq5Ja (но там тоже что-то не так) Там ответ неправильынй - должно быть 61270. Ну и алгоритм, ты в последний месяц, когда осталось 4138, не начисляешь проценты и комиссию.
Когда исправишь, проверь свой код на сумме кредита 4000 и 1000.
> 5.2 http://ideone.com/OEDO0b > $money <= 1000000; Если мы набрали ровно миллион, надо все равно продолжать цикл?
> http://ideone.com/kG9U2m - полиндром > PHP Notice: Undefined variable: halfLength in /home/1WOGIM/prog.php on line 1 Посмотри внимательно, ты там length/lenght путаешь. Будь внимательнее.
Уменьшать долг ты забыл, также у тебя число 5000 несколько раз повторяется - неудобно будет менять его, надо использовать переменную, а не копипастить числа.
> Только перечитав дошло, что в отличие от JS функции в PHP не видят внешних переменных. Да, и это упрощает анализ кода функции, так как все входящие данные приходят только через аргументы и не надо искать по всему коду откуда тут эта переменная.
> if ($sum >= $payout) { > $sum -= $payout; Этот иф можно заменить на вызов функций min/max. Будет наверно короче код. А так, в общем, верно.
> function inclineWord($declension, $latterFigure, $end) { Давай посмотрим на эту функцию. Параметр $declension используется только с одной целью: взять подмассив из $end:
> $end[$declension][0]; > $end[$declension][1];
Раз так, может вместо этих 2 переменных сразу передавать подмассив с нужными 3 формами числа?
Также, ты не учел в этой функции что для чисел 11-19 используется другое окончание: 11 котов, а не 11 кот. Ты там где-то в другом месте это делаешь, но это вообще плохо. Алгоритм выбора формы слова должен быть целиком в одной функции, а не размазан по программе.
> return($text); return это не функция, а оператор (команда), и скобки тут не нужны.
> return($text); > break; Ошибка: break можно использовать только внутри цикла. Также, return выходит из функции и идущие за ним команды никогда не выполнятся.
> function writeThousand($declension, $discharge, $text, $spelling) { > $text = $text.' одна'; > return($text); Тут не очень понятно зачем ты передаешь в функцию $text. Вместо того чтобы приклеивать число к строке, проще возвращать только его, а text не передавать вообще.
> $thousand = $number % 1000000 * 0.001; тут вместо умножения наверно логчинее написать "поделить на 1000"
Собирать текст по словам удобнее, складывая слова в массив. Так будет проще чем возиться с правильной расстановкой пробелов.
Алгоритм в smallNumberToText сложноват. Я думаю, его проще переписать примерно так:
- если в числе есть сотни, добавить слово для них - если в числе есть 11-19, добавить слово - если в числе есть десятки, добавить слово - если в числе есть единицы, ....
То есть записать как последовательные ифы - будет более простая структура кода.
> if ($number == 0) { > $text = " ноль рублей"; Это логичнее в самое начало функции ставить, а не в конец.
> } elseif ($number % 1000 == 0) { > $text = $text.' '.'рублей'; Это какой-то хак? Лучше бы без него
там же учебник яваскрипт и описывается клиентская часть, а не серверная. Серверную можно делать на любых технологиях, лишь бы она запросы правильно обрабатывала.
> Куда сохраняются сообщения? Допустим я хочу сделать серверную часть на пхп, мне ведь нужно вставлять записи в бд или хотябы в файл, чтобы другой юзер мог получить его гет запросом. Не обязательно. Вообще, хранить сообщения в БД довольно неэффективно так как она сбросит их на диск, то есть создаст лишнюю нагрузку на сервер. Лучше хранилище в памяти.
Ну и такие штуки не очень эффективно писать на обычном PHP так как ты должен будешь держать в памяти большое число процессов, надо постоянно опрашивать хранилище на появление новых записей - это явно неправильно.
Тебе нужно написать асинхронный демон, который будет слушать TCP порт, принимать запросы, и пересылать сообщения аналогично тому как это сделано в примере на Node.JS. Для этого подойдет фреймворк ReactPHP, но учти что он сложный, и чтобы им пользоваться надо сначала изучить работу сетей (устройство интернета, протоколы IP, TCP), обычные сокеты Беркли и сетевое программирование, а только потом браться за асинхронщину.
> Тут это выглядит так, будто один пользователь отправляет сообщение напрямую другому, без сохранения куда-либо. Там сообщения нигде не хранятся (разве что в переменной). При получении сообщения от клиента он пересылает его всем остальным. Там нет истории сообщений.
>> Также функция подсветки должна правильно делать htmlspecialchars, чтобы символы вроде & или < в HTML коде выводились корректно. > Как сделать так чтобы htmlspecialchars не съел тег <mark>? Я пропускаю два значения через функцию paintFound заранее, а только потом его вставляю. Правильно? В общем, это годится так как htmlspecialchars одинаково преобразует одинаковын слова. Но мне тм не нравится одна вещь: ты проходишься с заменой по HTML строке несколько раз. тут есть риск: что если мы ищем фразу "mark mar ark"? В этом случае во второй и третий раз ты заменишь название тега <mark>. Это надо исправить. Замену надо делать только один раз.
Плюс, мы можем получить вложенные теги mark, или даже неправильно закрытые, что тоже плохо.
думаю, надо делать замену 1 раз по выражению вроде /иванович|иванов|иван/ui
Другой вариант - разбивать строку на части, совпадающие с искомым словом и раположенные между ними (например preg_split), каждую часть обрабатывать htmlspecialchars, и склеивать с подстановкой тега mark, но это может быть сложнее.
> $searchArray Лучше назвать searchWords
По поводу рабоыт с Бд, это в общем плохая идея:
> //Добавляем данные одним массивом > $stmt->execute((array)$abiturient); А что если кто-то добавит еще публичное или приватное поле? Тогда будет передан лишний элемент и все сломается. Не надо так, лучше сделать массив имен полей и извлечь данные из студента по нему.
Такой код который ломается от добавления поля - точно плохая идея.
> Обводится Иван Иван(конец обводки)ов. Чтобы этого не было, надо сортировать поисковые слова по убыванию длины и сначала заменять длиннейшие.
> .form-horizontal div { > margin-bottom: 15px; Очень плохо. Я захочу добавить в форму див и буду искать почему у него откуда-то взялся лишний маргин, а потом мне придется как-то переделвать код чтобы у твоих дивов он остался, а у моих нет. Так писать нельзя. Не применяй стили к дивам. Более того, тут скорее всего нужные возможности есть в бутстрапе, а ты их просто не нащел. Я думаю, там есть класс для того чтобы сделать строку в форме, а ты его просто не нашел.
Не применяй стили к дивам. Применяй их к классам.
Если плохо знаешь CSS, у нас есть задачки на него в ОП посте.
> Убираем расстояние между inline элементами как советуют > в статье из оп учебника лучше бы конечно другие методы использовать, а то ты сбросил шрифт для всех элементов, а восстановил только для инпутов, да еще и не тот который был. Посмотри лучше как эта проблема отступов решена в бутстрапе.
Более того, давай прочитаем что ты написал:
> .navbar-form { > font-size: 0; "в любых формах, добавленных на панель навигации, сбросить шрифт в 0". Я уверен что тебе надо не это. Тебе надо было убрать отступы только в одной конкретной форме, а не вообще в любых.
Файл htaccess надо переименовать (например перенести его в readme) так как Апач его прочитает и попытается выполнить и будет ошибка что virtualHost нельзя указать в htaccess
> https://github.com/greenTea242/Student-list/blob/master/src/ViewHelper.php#L7 > fixView название конечно неудачное так как не говорит что он делает. Более того, судя по тексту, он предназначен для обработки строки запроса- но почему ты тогда применяешь его к куке в index.php? И к выводимым ссылкам - какое он имеет к ним отношение? Это как-то ненормально.
> Регулярки которые также используются в HTML5 паттернах Тут есть риск из-за того что диалект регулярок в HTML5 и в PHP вроде как не совпадает. Соответственно легко при редактировании кода получить не работающую на клиенте регулрку. Возможно стоит сдеалать по 2 версии регулярки или еще что-то придумать.
Насчет авторизации - почему бы не вынести ее в отдельный класс-сервис с методами вроде получитьСтудента/залогинитьСтудента/разлогинить. И соответственно всю работу с кукой скрыть в этом классе.
> $stmt->setFetchMode(PDO::FETCH_NUM); > $counter = $stmt->fetchColumn(); В этом случае же setFetchMode не требуется вроде.
> if (!empty($searchQuery)) { Это плохо что переменная может не существовать. Лучше тогда сделать массив вроде $values[':search'] = .... и передавать его в execute.
Также, при поиске хорошо бы обрабатывать поисковую строку - заменять в ней пробелы на знак % чтобы можно было набрать "ив нов" и найти Ивана Иванова. Также можно удалять левые символы вроде знаков препинания из поискового запроса. Подумай.
> getAbiturientsInPage($page, Лучше передавать offset и не накладывать на функцию обязанность считать страницы.
> ORDER BY $sort DESC Надо сортирвоать в обе стороны. Например повторным кликом по заголовку.
> оздаем уникальный идентификатор. если абитуриент впервые на сайте Это не требуется - mysql умеет это делать, почему не исплоьзуешь auto_increment?
В комментариях к задаче написано - при регистрации генерируем длинный код, сохраняем в базу и в куки поьзователя. При редактивроании сверяем этот код с базой и находим по нему нужного студента.
>>698491 Ты полностью прочитал статью? В самой функции автозагрузки нужно прописать, откуда "тянуть файл".
spl_autoload_register(function ($class) { // Получаем путь к файлу из имени класса $path = __DIR__ . $class . '.php'; if (file_exists($path)) { require_once $path; } });
В примере выше все файлы классов лежат в той же папке что и основной скрипт. Если у тебя неймспейсы и классы разложены по папочкам по psr стандартам, то и неймспейс соответствует путям в файловой системе. Бекслеши надо только заменить на прямые (этот разделитель пути понимает и виндофс, и линуксы). Что-то типа $path = explode('\', 'MyApp\Model\User'); $path = implode('/', $path); require "$path.php";
Сделай это в качестве лабораторной работы, чтобы понимать как это работает, и забудь. Пользуйся композером, там этот автозагрузчик встроен. Можешь потом заглянуть в его код и посмотреть как там реализована автозагрузка.
>если неймспейс не подробный Что? Неймспейс обязан соответствовать psr, иначе накой он вообще нужен. >Как влияет на производительность? Сделай тесты, если интересно.
Сделал загрузку комментариев через AJAX, теперь вопрос в том, как обновить комментарии на странице? Ну вот есть у меня responseText от сервера, мне из него вытаскивать регуляркой узлы с комментариями, а потом добавлять на страницу джсом? Мне эта затея не очень нравится, но ничего другого в голову не приходит.
> если неймспейс не подробный? Что это значит? PHP всегда передает полное имя класса, со всеми неймспейсами. При этом как по имени класса найти файл - это уже твоя проблема. Если следовать при выборе названия файла PSR-4 то проблемы нет.
>>698847 Функция не должна знать что в неё передают элемент массива, ей должно быть все равно. Объявление функции будет выглядеть как >function func($arrayElement) А передача в неё элемента массива func($array[0]);
Не стоит смешивать в кучу код для вычисления результата и HTML код. Лучше разбить это на 2 файла, первый подготавливает данные, а второй выводит HTML-страницу, как описано тут: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Код лучше постить на ideone, чтобы там же был виден результат запуска. Если конечно с ideone нет проблем и он работает.
> iconv_substr($this->firstName, 0, 2) Есть же mb_substr, ей только в начале программы надо указать кодировку через mb_internal_encoding - в уроке про строки написано.
> public function getOverTimePay() { > $needOverPay = 0; > foreach($this->hours as $hoursPerWeek) { > if($hoursPerWeek>40) { > return $needOverPay; Тут явно ошибка. return выйдет из цикла и ты посчитаешь только первую переработку, а остальные - нет. return ведь выходит из функции и соответственно из цикла тоже.
Аналогично в getOverTimeHours у тебя return внутри цикла и она посчитает только первую переработку, а не все в сумме.
> public function getOverTimePay() { Эту функцию можно записать проще: взять число переработанных часов и умножить на ставку. А ты фактически копируешь здесь код из getOverTimeHours. Не надо так.
Также ты не учел что переработка там вроде как-то по повышенной ставке оплачена.
> class Control { > public $totalSalary = 0; Тут лучше не хранить это свойство, а сделать метод который вычисляет общую зарплату. Почему? Потому что если мы добавим нового работника или поменяем им какие-то свойства то метод посчитает новую, актуальную зарплату. А с твоим подходом в поле останутся старые, неактуальные данные.
> public function getInfo() { Эта функция не должна быть в классе. зачем нам возвращать массив с информацией, которую и так можно получить, вызвав метод? Но ты можешь создавать массив где-то снаружи, если он тебе нужен.
> return array('totalSalary'=>$this->totalSalary, > 'totalOverTime'=>$this->totalOverTime Тут то же самое, надо просто сделать метод возвращающие отдельные знаечния, а массив в классе не создавать.
Сайт тут уже показывал, дали годные советы — есть еще замечания какие? http://www.emoji.esy.es/ (для тех, кто не понял — выбираем смайлики и пишем ими слова, код можно ставить в ВК)
>>698978 Работает через раз. Первый раз вроде все правильно срабатывает, отображает код для вставки и картинку из смайлов. Если после этого еще раз ввести то же самое предложение (или другое, неважно) и нажать нарисовать, выдает пустую форму как на пике >>698981 На самом деле форма не пустая, нужно обратить внимание на огромные полосы прокруток. В поле "код для вставки" получается куча переводов строк. Там где должна быть сформирована картинка, тоже туча <br>. Открой исходный код страницы (ctrl+u) и посмотри.
Лечится только нажатием на "сбросить", а потом на каком-нибудь фильтре, например "показать все". Тогда можно по-новой заполнить форму. Сделай чтобы нажатие на кнопке "сбросить" возвращало страницу к исходному виду. Пока эта кнопка только очищает "задний фон" и "букву".
Sup, котаны. Есть форма, и в ней есть много селектов и инпутов относящихся к определенным селектам. То-есть если выбрана одна опция - показываются одни инпуты следом, если другая - другие и тд, а первые инпуты скрываются с disable. Так вот, если пользователь полезет через Отладчик браузера в html страницы и руками уберет disable или скрытым инпутам назначит другие значения - теоретически эти данные попадут скрипт который будет обрабатывать форму после отправки? Если да то как можно защититься? У меня после всех селектов и заполнения форм - формируется массив и далее XML который уходит на сторонний API и лишние включенные руками input'ы мне ни к чему. Поясните плз
Я наконец-то настроил обновление последних комментариев на странице аяксом, но возникла новая проблема: они добавляются на страницу снизу, а не к ветке, к которой они принадлежат. Сравнивать каждый новый комментарий с путем каждого уже существующего на странице перебором? Или удалять и заново вставлять вообще все существующие? Или тупо оставить всё как есть?
>>699094 Или еще четвертый вариант: добавлять на страницу лишь только что отправленный коммент, а от новых вообще отказаться. Хочешь посмотреть новые комментарии - обновляй страницу.
А все эти паттерны можно применять в других языках, например на python? Сложно ли вообще перекатиться на другой ООП язык имея знания php на среднем уровне?
Собака скрывает ошибки. Возможно из-за какой-то из них сессия не создалась и потому код работает не так как ты думал. Он вроде в лог в этом случае что-то пишет.
Или например если запись в папку недоступна, сессия не сохраняется. Почему бы тебе не посмотреть какая это папка и какие в ней файлы, дату модификации, содержимое?
Но если ты используешь Юи ты не должен напрямую обращаться к SESSION, так как он преддоставляет класс, а то что напрямую будет работать - никто не обещал.
Также в PHP есть session handlers, которые отвечают за загрузку и сохранение сессий - может у тебя там с ними что-то не то.
>>699200 Если это веб, то можно, достаточно будет освоить язык, на который будешь делать перекат (это может быть не так легко как кажется на первый взгляд). Если хочешь в другую область, то нужно будет учить больше вещей, например в десктопе MVC это не совсем то что в вебе, а в андроид разработке используют MVP (Model-View-Presenter).
>>699189 >При чем тут вебмин? Вебмин если не ошибаюсь это аналог pma? Как он заменит веб-сервер, интерпретатор php и субд? Webmin — это графический web интерфейс для управления сервером на базе Unix подобных операционных систем. То есть установив Webmin вы можете удалённо конфигурировать и управлять Linux сервер в удобном графическом интерфейсе на русском языке через браузер. >http://help.ubuntu.ru/wiki/webmin
Нужно вместе с новыми комментариями передавать их расположение относительно существующих. Как именно передавать - зависит от того какая у тебя структура дерева DOM. Определи минимальный и простейший способ указать расположение.
Ну например если комментарии в дереве идут плоским последовательным списком, то проще всего передать id предыдущего или следующего комментария. Можно также и пути как-то использовать наверно.
> Сравнивать каждый новый комментарий с путем каждого уже существующего Ненужное усложнение. Браузер очень быстро ищет элементы по их id - логично это использовать.
Тут желательно выбрать самый простой способ (чем сложнее тем проще ошибиться) и не создающий проблем производительности (чтобы не надо было бегать по всему дереву ДОМ, или чтобы не надо на сервере было делать кучу запросов).
Паттерны применимы к любым ООП-языкам, некоторые вообще независимы от языка.
> Сложно ли вообще перекатиться на другой ООП язык имея знания php на среднем уровне? Нет, но по моим ощущениям под средним знанием ООП люди часто подразумевают незнание.
А когда что-то пойдет не так, что будет делать пользователь вебмина? Нет, не нужно. Начинающий должен все это делать из командной строки. Что за клоунада - администрировать линукс через графический интерфейс? для таких людей придумали виндоуз.
>>699204 Да это не я оставлял начальный пост >>694117 У него там скорее всего дело в кешировании, у меня его код работает корректно.
Я мимопроходил, тоже сначала подумал про session_start, попробовал сам его прописать, юи выдает ошибку 'session had been already started'. Покопался в исходниках и выяснил причины такого поведения фреймворка. Теперь сижу и горжусь.
>>699212 >графический web интерфейс для управления сервером >Поскольку Webmin это графический WEB интерфейс, то для его работы необходим web-сервер. Что-то мне подсказывает, что сервера все-таки придется установить отдельно. Как веб-сервер, так и субд. Хотя я конечно могу ошибаться.
>>699228 >Что-то мне подсказывает, что сервера все-таки придется установить отдельно. Как веб-сервер, так и субд. Хотя я конечно могу ошибаться. Да нет, я установил из под командной строки вебмин, и обновы или нужные библиотеки ставлю из под командной строки ( в вебмине есть доступ к ней сразу из под рута )
Ребята, посмотрел это видео: https://vimeo.com/63022489 Страстно захотелось разобраться в консольке (там через неё устанавливается фреймворк, запускается Sublime и т.п.). Посоветуйте хороших гайдов для работы с нею, пожалуйста.
>>699277 http://rghost.ru/6MDG2wZds ну вот тут есть глава по командной строке на убунте. Я правда сам еще не читал, не знаю насколько полезно, но планирую.
>>699277 Я учился по видеокурсу (не агрись пожалуйста), который записал некто Кирилл Семаев. Курс по плану lpic, автор вроде бы профессиональный айтишник и репетитор, так что вещь очень неплохая. За неимением лучшего.
В задаче про айфон в кредит как сделать так, чтобы анон заплатил именно остаток? через if ($creditBalance <= $monthlyPayment) { $monthlyPayment = $creditBalance; break; } не получается.
>>699297 Код вбрось на ideone.com, так непонятно ничего. Мыслишь верно, но $creditBalance к моменту попадания в этот if должен уже быть с прибавленными процентами и комиссией. В этом всё дело.
>>699307 >$creditBalance >= 0 Неправильный подход. Когда долг будет равен нулю, всё равно надо продолжать цикл? >$creditBalance = ($creditBalance * $percent) + $servicePayment - $monthlyPayment; Неверный подход. Тут от $creditBalance уже отнимается $monthlyPayment, после чего попадает в if. От этого будет считать всё неправильно (там может быть отрицательное число - Анончик становится должен банку, нонсенс).
Есть один коммерческий проект, за который я взялся, до этого писал с нуля интернет магазин и cms к нему, шаблоны не использовал. Решил в этом проекте использовать шаблоны, не могу определится, laravel или yii? Ни тот не другой не знаю. Склоняюсь к laravel но в yii есть документация на русском.
>>699316 Сложно сказать. Я обычно советую сделать отдельную переменную для расчёта только ($creditBalance * $percent) + $servicePayment, без вычета $monthlyPayment. А дальше если эта переменная больше месячной выплаты - продолжаем цикл. А если она меньше - выплачиваем ровно столько и заканчиваем цикл (либо он сам закончится - зависит от условия для работы цикла).
>>699314 Ты фреймворки называешь шаблонами? Laravel и yii приблизительно одинаковые, оба имеют положительные и отрицательные стороны. Если для себя, то без разницы, но в России больше Yii востребован, судя по вакансиям. В штатах laravel. Поскольку фреймворк штука немаленькая, есть смысл определиться в каком направлении будешь работать в дальнейшем (на россию или иностранных заказчиков) перед тем как выбирать какой из фреймворков учить. Английский хотя бы на среднем уровне все равно понадобится. Для второго юи тоже по-моему нет еще русской документации, а первый сильно устарел.
>>699325 Да фреймворки, я гуглил этот вопрос, мнения расходятся. Вот и я не могу решиться, а проект делать уже надо. Английский имеется, может немного не дотягивает до среднего.
Фалькон компилируется из сишного кода. Это значит что если разработчики забьют на проект, поддерживать его дальше придется самостоятельно (для этого нужно знание си). И зачем нужна скорость? У тебя планируется супер-мега-хайлод?
Короче фалькон для скучающих гиков, желающих экзотики.
Помогите с регулярками на проверку телефонов, почему-то некоторые форматные номера не проходят проверку. В чём может быть проблема? http://ideone.com/AtdAXx Спасибо.
>>699396 Ты бы хоть писал номер задачи (хотя у опа они наверное и не пронумерованы) или цитировал условие. Даже сам оп наверное их наизусть не помнит.
for ($i = 0; $i <= count($numbers); Нужно $i < count, иначе получится на единицу больше, чем элементов в массиве. Смотри, допустим у нас 10 номеров. count($numbers) даст 10. А цикл будет выполняться для $i = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 11 раз. $numbers[10] не существует, даст ошибку PHP Notice: Undefined offset: 10
"/^[8][0-9]{10}$/" Восьмерку-то зачем в квадратные скобки? Квадратные скобки это группа символов, из которых должен быть выбран один. [abc] равносильно a|b|c (а или b или c). Какой смысл брать один символ в квадратные скобки?
if (preg_match($regexp,$hyphen,$match)) { ... } if (preg_match($regexp2,$hyphen,$match)) { Это равносильно if () {} // одно условие if () {} // второе условие, совершенно независимое от первого То есть проверится сначала первый if, потом вне зависимости от результата второй if. Номера у тебя сейчас по два раза проверяются. Сначала первый иф говорит, что номер 84951234567 соответствует формату, а потом второй иф с элсом говорит об обратном. Там наверное нужно if () {} elseif () {} else {}
К опу вопрос по поводу поддержки юникода функцией str_replace. В оф.мануале об этом не сказано. Хотя может быть вот это место >Замечание: Эта функция безопасна для обработки данных в двоичной форме. Что такое двоичная форма? Может это упоминание о мультибайтовых кодировках? Прокомментируй это http://stackoverflow.com/questions/3786003/str-replace-on-multibyte-strings-dangerous Я плохо понимаю басурманский, и там речь о каком-то 16-ричном коде, не понимаю о чем они там треплются короче.
> Что такое двоичная форма? Может это упоминание о мультибайтовых кодировках? Это значит что функция способна обработать любые сочетания байтов в строке и не сломаться, но никак не гарантирует что на выходе получится что-то корректное.
Для utf-8 str_replace будет работать корректно (если представить как там символы кодируются, будет понятно почему). Для однобайтных кодировок тоже. А вот для 2- и 4-байтных вроде UCS-16 или UCS-32 - не будет.
>>699560 Битрикс тем не менее с возложенными на него задачами справляется. Поэтому с точки зрения клиента глубоко фиолетово, будет он написан на битриксе, симфони или маринованном огурце, лишь бы приносил доход. Квалифицированный программист потребует за свою работу в десятки раз больше, чем быдлокодер, осиливший только синтаксис. С точки зрения клиента конечный продукт от грамотного разработчика ничем не отличается от высера толпы австралопитеков. Так зачем платить больше? Ну да, каждый месяц что-то протекает. Так посадим десяток-другой обезьян с з.п. 15.000 бананов, они подлатают до следующего месяца. А что делать? Нанимать йоба-гроссмейстеров, требующих 4000 евро в месяц?
Статья выглядит как пронзительная мольба со стороны заебавшихся разработчиков к клиентам не покупать битриксы, но заказчик знает что ему выгодно.
>>698395 Спасибо, ОП, какая значительная экономия вышла: >echo "Ваш ответ на вопрос №$i ({$question->text}): \"{$answer}\" ({$question->answers[$answer]}). "; >echo "Правильный ответ: \"{$question->correctAnswer}\" - {$question->answers[$question->correctAnswer]}.\n\n"; Ну и вот тот же код, исправленный в соответствии с твоими пожеланиями: http://ideone.com/u4LC5p
Почему вот здесь подсвечивается ошибка в синтаксисе: http://ideone.com/v0C99M ? Нельзя в echo выводить метод (функции)? Не сталкивался с таким прежде, но и функции тоже не пробовал выводить в echo.
мимо-сеошник осваивающий пхп привет оп, я вернулся. Ты вспомнишь меня по кириллическим переменным куче конкатенаций. Ну и я долго не мог решить задачу с кредитом, лол.
Тут я короче теперь с айпадом решаю. Подумал, что через объекты будет чуть-чуть проще да и мне так больше нравится.
Осталось доделать последний платеж, после айфона это легко, пока не до него, был свободный час.
Из того что мне в этом коде не нравится: $totalPayment переменные выдавали нотисы при инициализации, поэтому я сразу задал их вне циклов. Работает, но может как-то можно их сразу инициализировать и объявить?
А в целом вроде все как надо работает. Последний платеж и посчитать в каком банке выгоднее это пару строчек кода дописать. ну и очевидно проверки на маленькие кредиты вроде тысячи рупиев, помню-помню, не напоминай
Наперед вопрос: взять финальные значения и прикрутить к ним сравнение для вывода более выгодного кредита, ага?
>>699914 >260.89146680312<br>60000</br>-3731.2817891928<br>65000</br> Дальше можно не смотреть. Всё неправильно считает. Ты на Айфон-то доделал решение, я что-то не помню? ><br> ></br> Боже, что творится в этой голове... В SEO-то хоть у тебя нормальные результаты?
Ну он пока уходит чутка в минус, по % я посчитал, он верно считает. А по платежу я написал что последний платеж он пока не считает, ну че ты начинаешь.
Я не пишу \n потому что у меня в xampp не работает он да и чистый пхп у меня нигде не юзается, везде ответ вываливается в хтмл либо аякс выводит массив, которые жсом разбираются на нужные мне дела. Если ты к </br> <br> докопался - оба варианта работают, валидно со слешем, но и без работает. Хотя я хтмл 5 спецификацию не очень освоил.
>>699986 короче не нюфаг я. Когда у тебя 15-20 сайтов с правками то тупо нет времени вылизывать каждый код, особенно когда где-то жумла, на двух битрикс, на пяти модх и на еще 4 самописки от васянов. Работает и хуй с ним. Если бы мне платили за каждый сайт не 10-20тысяч а 200, то я бы нанял макак для вылизывания всех этих дел. Но увы. прекращаю флуд //
Аноны, боюсь начинать делать файлообменик, что еще желательно прочитать и использовать в задаче кроме slim'а, MVC и twig'а чтобы не встать на стандартные грабли?
>>700141 На какие стандартные грабли? Этих знаний вполне достаточно, если что-то непонятно ты всегда можешь спросить в треде. Тем более если ты сделал студентов и ОП их одобрил, то я не думаю что у тебя возникнут особые трудности с файлообменником.
Ты невнимательно читал урок про функции. Ты скопипастил один и тот же код 3 раза, а копипаста одна из самых плохих вещей которые может сделать программист. И ведь в уроке же написано, что надо использовать функции чтобы не копипастить код.
Значения по умолчанию для полей у тебя не указаны. Вот что если мы создадим Банк, но не зададим все параметры и сразу попробуем посчитать кредит? Надо либо ставить значения по умолчанию, либо (если ты изучил конструкторы) требовать передавать обязательные параметры кредита в конструктор.
Также, я думаю, сумма кредита это не свойство Банка. Ведь один и тот же банк может выдавать кредиты на разные суммы. Это могло бы быть свойство Кредита, но ты назвал свой класс Банк.
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
> Если ты к </br> <br> докопался - оба варианта работают, валидно со слешем, но и без работает.
HTML прощает ошибки потому "работает" не значит "правильно". Ну и чтобы отличить закрывающий тег от открывающего спецификации не надо читать - это одна из первых вещей которые изучают в HTML.
- при передаче по ссылке функция может изменять исходную переменную, так как она получает ссылку на нее - при передаче по значению в функцию передается не исходная переменная, а ее копия. Если функция ее поменяет то она изменит только свою копию, а не исходную переменную.
Объекты в PHP всегда передаются "как будто" по ссылке, без создания копии. Массивы, строки, числа по умолчанию передаются по значению, то есть делается копия (на производительность это не влияет, там оптимизированный способ копирования).
> Стоп, но если сессия стартует всегда, то зачем в мануале (не в мануале а в апи) дается пример с явным началом сессии?
На тот случай если компонент используется отдельно или если автостарт отключен. ЧТо значит всегда? Эту настройку можно переопределить например наследованием или убрать компонент из автозапуска. Вообще, это плохая идея по моему всегда включать сессию так как часто она не нужна, а файлы создаются.
И компонент теоретически можно использовать и без фреймворка.
>> $youGotDis = array_rand($answers,7); > Вот эта строка значит, что я создал еще 1 массив в котором я рандомно перемешал всё элементы из массива $answers, я правильно понял ? Нет, там не элементы, а там получились случайно выбранные 7 ключей.
Для перемешивания уже есть функция shuffle(). Чтобы выбрать один ответ, не надо перемешивать все, надо указывать единицу в аргументах, то есть выбрать один ключ.
> И еще, я не совсем понимаю, как работает следующая строчка >> echo $answers[$youGotDis[0]]. "\n"; Почитай мануал по array_rand.
-нехорошо 2 раза писать setookie когда мы можем вынести ее из ифа - для кук желательно ставить путь и время жизни. Почитай про параметр path у кук: http://citforum.ru/internet/html/cookie.shtml
Также, поломай голову и попробуй ответить на мои вопросы выше. Нужно хорошо закрепить знание кук прежде чем переходить дальше.
>Пикрилейтед (проверь, пожалуйста, верно?) Да, только разберись еще с параметрами path и expires у куки.
> Вопрос: правильно я понимаю, что там нужно генерировать каждому студенту куки-пароль и записывать его в БД. При каждом заходе проверяю куку - если совпадает с кукой-паролем от какого-либо студента, то позволяю править инфу, связанную с этим студентом? Да
> $endDebt = $endDebt + $anonPay; > $debtMain = $debtMain - $anonPay; Это повторено 2 раза. Используя функции min/max, можно обойтись без повторения и упростить код.
> PHP Notice: Undefined variable: totalPayment in /home/E4rxrX/prog.php on line 15 Обращаешься к несуществующей еще на тот момент переменной. Надо ее создать сначала, потом исопльзовать.
Также, можно было тут использовать min/max, упростив код. Считает верно.
Телефоны - varchar достаточной длины (погугли какой длины бывают номера) координаты - float либо decimal (погугли в чем разница) Булевых значений - в mysql есть bool, сининим tinyint. А так, inyint(1) NOT NULL
Отправлять можно с любого адреса, но можно и в спам попасть, плюс есть разные технологии вроде SPF. Настраивать сервер необходимо, на хабре полно статей.
>>700167 >Сейчас вроде все верно. Выводить результат вызова метода можно, видимо ты что-то напутал. Нет, там не ошибка и не notice, а только подсвечивание ошибки синтаксиса в Ideone. Нажми на fork - там заработает проверка синтаксиса незапущенного скрипта. Раньше такого не встречал просто.
>>695548 > Нет, не получает, только IP шлюза. Аналогично при ручной настройке указывается только IP. Подумай еще.
Отправляет широковещательный ARP-запрос в сеть с заголовком IP. Все узлы получают запрос, сверяют айпишник, и у кого совпадет - тот отправляет ответку со своим мак адресом. Теперь верно?
ОП, извини, что долго не отвечал. Я взял книжку Компьютерные сети. Учебник для вузов. Почти дочитал. И тогда дальше отвечу на твои вопросы. Подумал, что лучше уж прочитать одну книжку и все осмыслить, чем знать урывками информацию.
>>700405 Шутник мамин, все в камеди клаб. Я вот думал, что мне одному стыдно, когда ОП написал огромную стену текста с разбором мельчайших моих ошибок, а я даже не ответил на его ответ. Но при этом я, разумеется, читаю все его ответы, пытаюсь принимать во внимание все его советы. Просто часто переходим в новый тред, а ответы остаются в старом. Стыдно от такого.
Пришла идея сделать сервис для изучения иностранного языка. Суть такова: пользователь может либо загружать файлы с текстом (например электронную книгу xml/fb2 или plain text), либо указать ссылку на ресурс с текстом. Этот текст разбирается на слова (на самом деле это неправильно, в английском например нужно переводить словосочетания-идиомы, а не отдельные слова, но для робота это уже непосильная задача), пользователю выводится табличка в формате 'слово англ.' => 'перевод на русский'. (А потом эти слова можно учить в стиле тестов memrise, но это уже другая история).
Перевод берется из базы данных (если он там есть, если нет, то нужно дернуть сторонний сервис типа google или yandex translate и добавить в свою базу-словарик). Сразу встает вопрос, как будет выглядеть запрос? Вот я разбил текст на слова и удалил повторы array_unique, допустим получилось 1000 слов, а может и больше (особенно если юзер зафигачил целую книгу).
Таблица со словами общая для всех текстов и пользователей (язык-то общий). Структура таблицы id // только ради внешнего ключа, первичный ключ наверное лучше на самом слове, а может и нет eng // тут точно как минимум уникальный индекс, а может даже первичный? rus // варианты перевода, думаю в данном случае можно нарушить атомарность и хранить одной строкой, все равно выводиться это дело будет все вместе
Как извлечь из такой таблицы (или нужна другая структура?) перевод для тысячи слов? По колоночке eng идет поиск, что-то мне не нравится идея использовать where in (дофига значений).
Это первое затруднение. А главное собственно в другом. Как хранить связь между текстами (которых один пользователь может загрузить несколько сот) и словами? Ну да, многие ко многим. В одном тексте много слов, и одно слово встречается во многих текстах. Но как я уже говорил, в одном только тексте может встретиться сотни и тысячи слов, и текстов один пользователь может накидать весьма много. И пользователей может быть много тысяч. Тут уже на миллиарды счет пойдет, если создать одну таблицу 'id_текста' : 'id_слова'.
>>700407 Я думаю у опа больше бомбит от кол-ва постов и скорости постинга, так что лучше стараться тоже писать одним постом и не поддерживать флуд и срач. Вот например ты зачем-то как хомяк повелся на жирнющий вброс и кого-то покормил. Зачем? (это риторический вопрос) Подумаешь назвали аттеншнвхорой.
>>700457 Из класса ничего нельзя получить, класс это определение объекта какого-то типа, его описание. Экземпляр объекта наверное нужно создать, после чего вызвать нужный метод.
Какую переменную ты хочешь получить? $hours? Ну так его возвращает метод getTotalHoursWorked, нужно только экземпляр класса создать. $yourObject = new ClassName; $hours = $yourObject->getTotalHoursWorked();
Кстати свойство $this->hours в твоем случае обязано содержать актуальный массив на момент вызова метода getTotalHoursWorked. В конструкторе его можно заполнить например.
> и у кого совпадет - тот отправляет ответку со своим мак адресом. Верно, только тм еще используют ARP кеш. В линуксе его можно по моему командой arp -a или arp -p посмотреть. Также, бывает "упреждающий ARP" - когда узел без запроса посылает широковещательное сообщение со своим маком и IP чтобы другие узлы его записали в кеш.
> Я взял книжку Компьютерные сети. Учебник для вузов. Олифер? Знакомый учебник.
> Как извлечь из такой таблицы (или нужна другая структура?) перевод для тысячи слов? Можно через WHERE IN, но тут надо еще подумать: надо ли сразу все 1000 слов преводить? Может пользователю сразу столько и не нужно. Может можно как-то разбить текст на главы, страницы или абзацы.
> варианты перевода, думаю в данном случае можно нарушить атомарность и хранить одной строкой, все равно выводиться это дело будет все вместе может боком вылезти.
Насчет производительности - тут гадать бесполезно. Сделай микробенчмарк и меряй разные варианты. Другого пути нет. Если что-то тормозит - надо изучать почему (для начала смотреть что загружено: CPU, память, диск и тд), анализировать запросы.
> Как хранить связь между текстами (которых один пользователь может загрузить несколько сот) и словами? Ну да, многие ко многим. В одном тексте много слов, и одно слово встречается во многих текстах. Вообще для таких вещей могут пригодиться поисковые движки вроде sphinx - они хорош индексируют тексты и ищут в них по словам.
> Тут уже на миллиарды счет пойдет, если создать одну таблицу 'id_текста' : 'id_слова'. Значит придется партицировать базу данных. Или рассматривать какие-нибудь NoSQL решения (но их тоже надо будет партицировать, не думай что они за тебя проблему решат). Вообще, если ты всерьез хочешь хранить сотни тысяч текстов то может тебе стоит рассмотреть вариант какого-то написанного на компилируемом языке демона, который будет держать все переводы всех слов в оперативной памяти, получать на вход страницу текста и выдавать ее с переводами.
Еще кстати интересный вариант - переводить на клиенте.
Ну и всегда есть варианты как-то по другому хранить данные. Например зачем делать связь между текстом и словами если слова можно и так извлечь из текста?
Но не забывай что все эти гипотезы надо проверять тестами.
>>700174 >Оправдания-оправдания. Если ты хорошо знаешь предмет тебе и не требуется задумываться...
не спорю, но на тестовых заданиях я не ставлю себе цель писать красивый и читабельный код, работает? работает. Ну да, не правильно. Но клиент на код не смотрит.
> на самом деле это неправильно, в английском например нужно переводить словосочетания-идиомы, а не отдельные слова, но для робота это уже непосильная задача Посильная. Почитай про лексический и синтаксический анализ. Можно найти или написать библиотеки, которые определяют связи между словами. Ну например в фразе
put it on
синтаксический анализ выделит связь между put и on и это позволит искать в словаре сочетание put on, а не put.
Главная проблема - то что в языке нет строгого синтаксиса и много неоднозначностей. Ну например слово "белок" может быть формой слов "белок" или "белка". Каждое слово может иметь несколько интерпретаций, и выстраивая связи с другими словами, можно отсеять неверные.
Если речь о тестовых заданиях для приема на работу то как раз на код там смотрят. Если речь об учебных задачниях то конечно качество кода тоже важно. Оно показывает хорошо ли ты понимаешь материал или нет. Знаешь ли как сделать перевод строки например.
>>700481 А если мой компьютер отправляет широковещательный запрос, и другой компьютер в этой сети раньше роутера мне отправит свой mac-адрес? Теперь весь трафик будет проходить через его компьютер? Есть ли защиты от такого?
Увы, не сталкивался, потому могу посоветовать погуглить. Вообще, в протоколах интернета при желании можно найти много слабых мест.
КАк я понимаю, в случае общественной сети вроде провайдера, лучшее решение - засунуть каждого пользователя в отдельный VLAN. Правда, тогда они не смогут в игры играть по сети друг с другом. Может еще как-то можно фильтровать широковещательные запросы, не знаю. Можно мониторить ARP-ответы.
Если захочешь поэкспериментровать - сделай 2 вирт. машины с линуксом (+ хост-машина) и объедини виртуальной (host-only network) сетью.
>>700481 >надо ли сразу все 1000 слов преводить? Ну да, можно в цикле прокрутить по сотне. Обернуть в транзакцию само собой. >Может пользователю сразу столько и не нужно. Смотри, в чем идея. Есть ресурс memrise.com. Это тупая дрочильня, где тебе предлагают по 100 раз написать перевод слова, авось с сотого на автомате запомнится. А потом еще повторять каждый день, как зомби. Результат некоторый дает, но недостаточно эффективно. Конечно же запоминается гораздо лучше благодаря ассоциациям и контексту. Например когда я слышу какое-то слово, то мне часто вспоминаются кадры из фильмов, где я его впервые услышал, или картинка из комикса, или фраза из книги и т.д. Поэтому решил сам написать обертку над memrise, чтобы пользователь мог подгрузить текст (например книгу или статью), программа разбила бы его на слова, и уже эти слова повторять. Потом время от времени возвращаться к книге и пытаться читать ее. Снова наткнулся на непонятное слово? Повтори тесты, прикрепленные к этому тексту (тесты основаны на повторении слов, встречающихся именно в этом тексте).
>хранить одной строкой, все равно выводиться это дело будет все вместе >может боком вылезти. Охотно допускаю, но хочется конкретный пример. Мне нужно только получить перевод слова и показать его пользователю, а будет там один вариант перевода или десять, не очень важно, показаны они будут все паком. Хотя допускаю, что когда понадобится расширить функционал, можно упереться в неправильную архитектуру. Не представляю пока практической ситуации, но верю что она может возникнуть. Надо подумать тогда как хранить множественные варианты перевода.
>придется партицировать базу данных Страшное слово. Знать бы хоть как его гуглить. "Патрициация базы"? А, нашел, database partitioning.
>зачем делать связь между текстом и словами если слова можно и так извлечь из текста? Каждый раз когда пользователь захочет пройти тест, разбивать этот текст на слова? Хотя... а почему бы и нет? Это же не займет много времени. Текст только целиком хранить в базе в виде соотв.поля, точно не нужно извлекать его из файла или ресурса каждый раз.
Ну ок, спасибо, есть варианты и пища для размышления так сказать.
>>700486 Ой, опять какие-то алгоритмы, мат.анализ и прочая лабуда. Я не буду даже мараться об это. Можно же ручками вбить в базу все возможные устойчивые словосочетания. Получится может быть несколько сот тысяч, но это же не так страшно.
Допустим, у меня в тексте есть фраза 'hang in the balance' (висеть на волоске). Если переводить по одному слову, получится ахинея. А что если в базе уже есть не только слова 'hang', 'in' и прочие? Что если там есть все (или многие) идиомы? Тогда нужно всего лишь использовать LIKE 'hang%' вместо ='hang'. Да, вернет больше вариантов. После чего проходим циклом по всем вариантам и сравниваем с исходной строкой. Если есть полное совпадение, то именно этот вариант выбираем в качестве правильного для всего словосочетания.
Но это потом, сначала нужно написать хотя бы простой сервис для перевода одиночных слов.
А, и еще провайдеры обычно привязывают мак-адрес к порту коммутатора. Если ты поменяешь мак-адрес то никуда пакеты посылать не сможешь. Возможно это как-то исплоьзуется для защиты от спуфинга, не знаю. Возможно - нет.
Я бы не беспокоился о производительности пока. Тебе первое, что надо делать - это отрабатывать подачу информации, интерфейс и прочее. нагрузки в начале у тебя никакой не будет. А когда будет ясен механизм работы приложения, тогда и схему для хранения данных будет выбирать проще.
> Можно же ручками вбить в базу все возможные устойчивые словосочетания. Не факт так как слова могут идти не подряд. И даже если идут подряд, это может быть не то сочетание.
>>700460 Мне надо просто воспользоваться функцией, которая внутри класса, и я не знал, как это делается.
>>700470 >Какую переменную ты хочешь получить? $hours? Ну так его возвращает метод getTotalHoursWorked, нужно только экземпляр класса создать. Спасибо, вот это то, что нужно. А можно ли как-то кратко посчитать все hours для любых экземпляров класса? Для всех имеющихся? Или мне просто сложить $oneObject->hours + $twoObject->hours и так далее? Ведь должен же быть какой-то способ автоматизации этого?
Что-то крутил-вертел, какие-то костыли вставлял (прямое сложение $ivan->getSalary() + $peter->getSalary(), это явно не годится), но в итоге не могу сообразить, как именно надо подсчитать разницу в оплате переработанного времени. Помогите, братишки: http://ideone.com/aHTLbq Дайте волшебного пендаля. Наверное, надо как-то отдельно подсчитать нормальное время, отдельно переработанное и сложить? Как обычно, стоит спросить совета. Но ведь это как-то должно в цикле выдаваться, а у меня там $ivan->getSalary() + $peter->getSalary()... Без вас не разобраться.
>что оно делает в контроллере? Должен быть метод в модели, который реализует процесс регистрации нового студента, а ты почему-то написал стену текста прямо в контроллере. Подумай, как можно изолироать все, что не привязано к форме и вынести из конроллера. А контроллер разве не реализует процесс регистрации нового студента? Я не могу понять в какой модели иначе это должно реализоваться. На данный момент у меня есть RegisterForm, Student, RegistrationHelper, StudentGateway, и не к одному из них я не могу отнести эти методы. За исключением разве что модели студента, но там встает такая проблема - поле с хэшом может браться из ДБ а не генерироваться при регистрации, и соответственно становиться проще сгенерировать хэш где-то снаружи и потом его просто передать.
>>700481 >зачем делать связь между текстом и словами если слова можно и так извлечь из текста? Можно было бы действительно разбивать каждый раз текст на слова, но меня это не устраивает, потому что пользователь должен иметь возможность "почистить" словарик, относящийся к данному тексту. Убрать стоп-слова типа артиклей и местоимений, удалить уже известные ему слова, которые не хочется повторять. Программа должна разбить текст на слова и предоставить пользователю причесать полученный список (как минимум удалить все лишнее, оставив только новые полезные слова, а может быть даже предложить свой вариант перевода вместо гугловского), короче что-то типа круда.
Тогда я попытался рассмотреть вариант, а не хранить ли словарик вместе с текстом в базе? Таблица текстов будет содержать два больших текстовых поля, одно с исходным текстом, а второе сериализованный словарик. Проблемка все та же: как это потом редактировать? Я себе уже представил страницу, где есть таблица 'слово - перевод', рядом с каждой строкой галочка на удаление. Внизу кнопка "удалить выбранные". А как мне галочки связать-то с записями? Вот незадача. Можно аяксом конечно, но я исхожу из позиции, что нужно сделать чтобы сайт был полностью рабочим без единой строки js. А потом уже обмазывать джаваскриптами. Может сделать кучу скрытых инпутов, по два на слово? Или даже не скрытых. Пара инпутов name="updateVocab[eng]" и name="updateVocab[rus]", галочка дисейблит пару инпутов напротив которой стоит. На сервере уже разгрести полученную из формы кашу и слепить массив, сериализовать и сохарнить в поле для словаря. Допустим у текста словарь из ста слов. Двести инпутов в одной форме все-таки перебор. Надо поспать, крыша едет куда-то.
Без яваскрипта можно обойтись если у тебя там что-то статичное (например текст, где над каждым словом написан перевод) или несложная форма. Если пользователь может взаимодействовать с текстом и что-то там менять, например щелкать по словам и что-то выбирать, то наверно без яваскрипта это будет делать неоправданно сложно. Да и перезагружать страницу на каждый клик не лучшая идея.
Без яваскрипта делаются сайты на которых нет особой интерактивности - блог, например. они хорошо программируются чистым HTML, простые формы.
Если же сайт больше выглядит как приложение, с которым пользователь активно взаимодействует, то его и надо программировать как приложение - в том числе с явакриптом, может даже придется что-то вроде MVC там делать. А вывод первоначального состояния страницы можно сделать на сервере. А уже после добавляются скрипты для интерактивности.
Если конечно делать именно таблицу с формой, то тут можно и без JS обойтись.
> рядом с каждой строкой галочка на удаление. Внизу кнопка "удалить выбранные" Последние тренды - удалять сразу когда ты галочку ставишь, но предусмотреть возможность отменить удаление. Эти кнопки сохранения - это из предыдущей эпохи, сейчас их нигде нет, ни в веб-приложениях ни на мобильных платформах. Ну и защищает от случая когда ты что-то отредактировал и случайно вкладку закрыл.
Насчет базы - определись сначала с тем как будет выглядеть интерфейс, а исходя из него уже проектируй базу.
> а не хранить ли словарик вместе с текстом в базе? Есть ли смысл многократно дублировать данные? Вряд ли. Выбрать 1000 записей по id можно достаточно быстро.
>галочка дисейблит пару инпутов напротив которой стоит. Удалять слова надо явной передачей признака удаления - чтобы при ошибке ничего не удалилось, а не вообще все слова.
Без яваскрипта элементарно делается - редактирование слова через инпут, удаление галочкой (причем с помощью ксс можно даже например слово перечеркивать при включении галочки).
>>700755 >Регистрация это обычный сейв новой записи в базе. Так что класс отвечающий за взаимодействие с базой должен заниматься сохранением их в базе, data mapper или tdg. >https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md#table-data-gateway >addNews из примера замени на registerStudent Но какой тогда хэш передавать в модель студента? Пароль из поста? Где тогда получатся соль и токен, если такие поля заполнять требуется? Учитывая что при получение объекта из ДБ эти свойства должны быть.
Класс сохранения в базу должен наверно получать уже готового студента с заполненными полями. То есть проставляться токен или хеш пароля должен где-то снаружи.
Стоит наверно сделать метод вроде "задать пароль" который все это и прописвает в модель студента.
>>700697 Доселе проблема не была решена. Прошу помощи!
>>700833 Насколько мне известно, это неправильный синтаксис (либо я где-то тоже ошибался). Во всяком случае, всегда делал вот так: http://ideone.com/LrjpVk - и всё работало.
>>700814 >То есть проставляться токен или хеш пароля должен где-то снаружи. В этом и вопрос что где "снаружи". У меня он прописан в контроллере, и в чем я ошибка я не могу понять. Если всё оставить как есть, то никаких проблем не остается.
Нет, я все же вижу проблему. Генерация всех этих токенов - это явно отдельное действие, и его можно вынести в отдельный метод. Метод задания студенту пароля.
> new Student($name, $surname, $gender, $grupnumber, $email, $satscores, $yearofbirth, $location, нельзя делать больше 3 .. 5 аргументов. Тут ведь ошибку не увидеть. У тебя нет ощущения что тут что-то не в порядке?
Аналогично с функцией Signup.
И вот что еще. Ты хранишь пришедшие из формы данные в 10 переменых. В таких случаях надо использовать массив. Но тут у тебя есть объект Студент, в котором хранить эти данные даже еще удобнее. Исопльзуй-ка его.
Вопрос относительно задачи про генератор имён из гайда ОПа. После того, как я с помощью array_rand() в цикле выкинул четыре элемента, как их объединить в одну переменную? Там в самом начале $name прописано как переменная, а не массив, поэтому туда можно впихнуть только один из выпавших элементов. Или я не в том направлении мыслю?
Кто сталкивался: в Xdebug настроил на определенный сайт /var/www/site .Там же лежит pma мой и он при запуске автоматом подхватывается xdebug'ом и приходится в phpstorm'e прослушивание порта - и не проклацаешь F9. Нужно как то запретить стопать и дебажить phpstorm, с другими сайтами из этой директории всё ок и их не вылавливает только phpmyadmin >>700862 В PHP можно не только перезаписывать переменные но и дописывать: $var = 'My name'; $var .= ' is'; в результате в $var будет находиться текст "name is". .= это короткая запись такого типа: $var = $var . ' is'; (такое же есть и для арифметический операций).
>>700865 Сорян за набор слов в вопросе - температура и я на работе ещё: суть проблему - xdebug при прослушивании порта подхватывает и phpmyadmin если его запустить. Надо как-нибудь запретить ему это делать.
> ServiceLocator - это создаем класс и в нем складываем все хелперы, а в классе, имеющем зависимости, обращаемся к сл и берем у него что нужно. > Dependency Injection - это то же самое, только попадает в зависимый класс через конструктор. > Я правильно разницу понял?
Да. И смотри, какая интересная тут есть особенность. При использовании DI ты не обязан использовать контейнер - ты можешь создавать зависимости вручную или как-то еще. а вот при использовании подхода с передачей в конструктор SL твои классы все становятся зависимыми от конкретного класса SL и независимо их использовать нельзя. Это плохо, так как из-за этого трудно их вынести в отдельную библиотеку например.
> 1 задача: https://jsfiddle.net/te5t987m/ > div { Стоит сразу приучаться не вешать стили на див, так как на реальной странице вседа много дивов и все может сломаться. А так, верно.
> 4 задача: https://jsfiddle.net/5qotwgrr/ > margin-left: 7px; А почему не 10? Этот способ имеет тот недостаток что зависит от размера шрифта и особенностей регдеринга на разных платформах. Почитай еще про другие способы, это вроде в комментариях к задаче описано.
Копипасту в стилях надо победить с помощью записи селекторов через запятую или дополнительного класса.
> 6 задача: https://jsfiddle.net/as3yrj0y/ - заголовок должен быть не жирным шрифтом - san-serif - опечатался - в меню надо убрать точки и увеличить расстояние между пунктами - br используется только для разрыва строки в текстах программ, стихах, адресах. Тут надо использовать абзацы. > .sidebar { > min-width: 200px; что если мы удлиним пункт меню? https://jsfiddle.net/92p4avx7/3/ - твоя верстка явно не стабильна. Надо чтобы пункт меню просто переносился на новую строку.
для статьи можно использовать тег article. Также может тут можно исопльзовать nav, может нет.
> height: 30px; > height: 31px; Не совпадает же. Ты паддинги учел? Посмотри в developeer tools в чем дело.
> 8 задача: https://jsfiddle.net/74398gsy/ > width: auto; > height: auto; Это писать не надо так как по умолчанию там такие значения и стоят.
Вот я ее баг нашел - примечанию могут накладываться друг на друга: https://jsfiddle.net/zftm0x1y/1/ - подумай над решением проблемы
> p { > margin: 0; Плохо - абзацы склеиваются. Так делать не надо. Подумай над более точечным указанием селектора.
> 9 задача: https://jsfiddle.net/bmsof3d1/ Неудачно выбраны способы позиционирования. Во-первых, серый блок не растягивается на 100% родителя по ширине. Во-вторых, если сделать маленькие абзацы, они могут выстроиться горизонтально: https://jsfiddle.net/eb16Ljdh/1/ (попробуй поставить ширину окошка побольше).
Ну и это тоже плохо
> p { > margin: 0 10px 0px 180px;
А, еще, ты применил флоат к абзацам, а что если добавить другие теги в текст? Заголовки, картинки, списки? Не работает: https://jsfiddle.net/eb16Ljdh/2/
Боюсь твой подход не работает.
> 10 задача: https://jsfiddle.net/sfybve16/ > position: absolute; > right: 90%; Неудачный способ так как нет гарантий что при любой ширине поля слева будут больше 10%. Впрочем можно сделать right 100% + вытянуть с помощью margin-right, также возможно рассмотреть флоат для этой цели.
> img { Надо бы стили применять не ко всем картинкам а только к нужной тебе.
Для картинки нет ограничения по размеру, то есть она увеличивается на большой щирине, а увеличивать растровые картинки больше 100% нельзя.
Пока картинка не загрузилась, черная плашка наезжает на текст - нехорошо.
Надпись in the picture надо сделать бледнее.
> 11 задача: https://jsfiddle.net/3uhzjytk/ Что-то совсем не похоже на картинку. для верстальщика важно уметь верстать близко к макету, а не заменяя круглые блоки на квадратные.
Между кнопками сдвоенная граница, а на макете - одинарной ширины.
> .buttons label { > width: 70px; не годится. Что если надпись будет длинее? Всегда когда можно надо не указывать конкретные размеры, а сделать чтобы они считались автоматически.
Плохо вписывается в текст: https://jsfiddle.net/77vw5u4o/2/ (должен быть перевод строки после блока с кнопками так как он засунут в див)
> top: -100px; Ненадежно так как у родителя может быть position relative и тогда отсуп будет считаться от него.
> http://ideone.com/TujCVy - автозамена > [о|o] В квадратных скобках вертикальная черта не имеет особого значения и обозначает саму себя. Тут она не нужна.
> http://ideone.com/bEr5sE - проверка номеров и приведение их к одной форме > ([/\s()-/]*) Что за странное выражние? Почему скобки использованы как оганичители? Почему внутри квадратных скобко слеши? Ощущение что ты наугад символы ставил.
анон, имеется проект на Yii, где во время попытки логина проверяется число попыток залогиниться до этого. По идее, оно хранится в сессии и получаем мы его так: $attempts = Yii::app()->session['attempts'];
потом идёт валидация, etc и если валидация фейлится, то записываем в сессию обратно Yii::app()->session['attempts'] = $attempts;
и тут всплывает одно НО: строка $attempts = Yii::app()->session['attempts']; всегда возвращает null, независимо от того, что я туда раньше клал. Всё хранится только в пределах одного обращения.
я уже проверял параметры через Yii::app()->session['attempts']; что показало session lifetime равным 0 и когда я явно задавал lifetimve, то всё равно при следующем обращении было снова 0. В конфиге Yii ничего про сессию не написано. При попытке прописать session lifetime напрямую в php.ini всё равно снова получал 0.
Так, на связи снова долбоеб. Господа, я сделал задачу на рекурсивное вычисление факториала - получилось. Сделал на линейно-итеративное и не получилось. Что у меня здесь не так? Должно выдать 120, а не выдает ничего, помогите разобраться, пожалуйста. https://ideone.com/Ahneci
>>700908 Проверь, что нет ошибки при первоначальной инициализации этого значения (может ты забыл туда положить стартовое значение, естественно при попытке его получить каждый раз будет возвращаться null). Проверь настройки yii. В main.php это секция components => session. Проверь работают ли сессии без юи.
У меня подобный код корректно работает на голом свежеустановленном бандле public function actionTest() { if (!isset(Yii::app()->session['attempts'])) { Yii::app()->session['attempts'] = 0; } $attempts = Yii::app()->session['attempts']; echo $attempts; Yii::app()->session['attempts'] = ++$attempts; }
анон, есть запрос к рубрике $_post['id]; где id - id рубрики (категорий), из которой он (запрос) тянет документы. Каждый запрос на отдельной странице. Есть сайт, который на аналоге modx, в нем нет готового модуля магазина. Я собсна затем и стал на нем писать магазин, чтобы попрактиковаться. У одного товара может быть куча рубрик (7 && 8 && 9) Теперь два стула - один запрос на все рубрики, в котором эти id динамически меняются в зависимости от рубрики, либо на каждой странице свой запрос, а всего их будет где-то 40. Что приводит меня к тупому мартышкиному труду.
Вопрос: по каким параметрам определять рубрику и скармливать нужные значения в запрос? Урл у всех уникален, в родительских категориях будут выводиться дети, в детях родители не выводятся.
Как я это представляю - написать массив, который цепляется по id (либо URL) страницы и по значению онной подставлять данные в post.
Либо тоже самое, но аяксом.
Самый хуевый метод - 40 запросов на каждую страницу. Я так уже делал, метод работает, но пора расти ж бля.
Как я не хочу делать - меню формой, при клике на категорию будет уходить пост запрос с данными.
Я ничего не понял. Что значит "есть запрос к рубрике"? Что значит "каждый запрос на отдельной странице"? Там скопипащен один файл много раз? Тогда это непраивльно. Копипасты быть не должно.
И не понимаю при чем тут POST. Это массив, хранящий пришедшие из формы данные, зачем в него что-то подставлять?
>>700969 Есть рубрика "Смесители". В ней есть документы, Они привязаны к ней по айди.
Есть страница "Смесители". На ней запрос из бд вываливает документы, которые привязаны к смесителям.
Т.е. банальное "многие-ко-многим".
В значении id стоит число, его можно передавать через пост/гет и тем самым динамизировать запрос. Вот этот момент и я спросил - как это сделать лучше, чтобы избавиться от копипасты со сменой чисел для каждой категории.
>>700906 ОП, спасибо, когда ты только всё успеваешь?.. >А почему не 10? Я делал эти задачи прямо на JSfiddle, там не сразу разобрался с тем, как правильно сохранять, там непонятно, в какой-то момент, наверное, сохранил такой промежуточный вариант. Делал целый месяц по чуть-чуть. Ох щи, сколько у меня ошибок... Стыдоба-то какая... Всё сохраняю, все твои ответы, стараюсь следовать советам. Не всегда получается исправлять какие-то решения - хочется уже дойти до своего проекта, но буду заставлять себя. Спасибо!
>>700759 >Без яваскрипта делаются сайты на которых нет особой интерактивности Разумно, принимаю.
>Эти кнопки сохранения - это из предыдущей эпохи, сейчас их нигде нет Да ладно. Заверенный скриншот прилагаю.
>Удалять слова надо явной передачей признака удаления Я же об этом первоначально и спросил, как связать галку с той или иной парой слов. Можно по индексу в имени чекбокса, который будет совпадать с индексом в имени инпутов. Хотя меня смущает кол-во элементов формы (по три на каждую пару слов, который в свою очередь может быть около сотни).
>>700760 Галочку то как связать с парой слов? >Плохо что непонятно. Довольно обидны ваши слова.
Ладно, я вижу ты не в настроении, видимо из-за необходимости разгребать старый тред и пилить новый. Щас тогда сделаю хоть как-то, потом будем думать как поправить, все же лучше чем топтаться на пустом месте. Вообще я уже вижу что идея с этим сайтом не очень хорошая, но других нет. Очень хочется тренироваться, но нет идей что делать.
>>700972 Рубрике "Смесители" и странице "Смесители" соответсвует один Id. Делаешь SELECT запрос, который запрашивает по этому Id все привязанные к нему товары. Если в урл нет Id, то пишешь роутер, который делает маппинг url-id, таблица соответствий берется из бд, управление ей делаешь где-нибудь в админке. POST тебе тут вообще не нужен. В select функцию подставляется каждый раз значение id, полученное от роутера.
>>700833 >('Москва' OR 'Санкт-Петербург') Что в скобках всегда возвращает true. Ты сравниваешь $city c true, а в $city значение 'Москва'. true !== 'Москва', поэтому всегда будет false.
>>699589 Все так, но это работает только пока сайт небольшой и малопосещаемый. Как только организация расширится, сайт начнет обрастать фичами, багфиксами и допилами, и через год-другой эти поделки от десятка обезъян превратятся в чудовищную запутанность кода. Придется постоянно держать толпу программистов, любые новые мелкие фичи будут занимать тучу времени, и вообще IT начнет сжирать весь бюджет. Реальный случай, сейчас в одной конторе уже 3й год разрулить такие высеры предыдущих лет пытаемся, идет тяжело и туго.
Пиздец, сейчас полчаса пытался понять, почему работающий проект ни с того, ни с сего перестал работать как надо. Кажется перевод на мартовское время мне все сломал. Первый раз с таким сталкиваюсь. Системное время стоит правильно. Какие настройки менять и где?
>>695291 Еще как пишет. Причем от фреймворков в пользу чистого PHP еще отказываются, ибо быстрее работает и проще все контролировать, нет зависимости от внешних разрабов. Для хайлоад сайтов чистый PHP тем более маст хэв. При этом местами бывает через композер вставлены куски из других библиотек или фреймворков в некритичных местах, которые самим долго писать было бы. Ну и естественно все SOLID и с нормальной архитектурой, без SOLID писать на чистом PHP вообще смысла нет.
Вечер в хату посоны, берусь за проект по разработке автопортала на php (пример автопортала, откуда должен быть слит дизан и логика есть), Был небольшой опыт создания интернет магазина. С чего начинать этот проект даже ума не приложу c front-endа или back-enda. Буду делать один. За что браться в первую очередь ?
>>701093 Начинают любой проект с архитектуры. Составь список требований и ТЗ, попытайся выделить проблемные места, нарисуй схемы роутеров, взаимодействий модулей и взаимодействие с БД или файловой системой, внешними API, разметь примерную схему таблиц и форматы данных внутри системы. Потом рисуй схему классов, фабрики, локаторы, используемые паттерны, иерархию наследования, взаимодействие с фронтендом по аяксу и прочее. Тут у тебя уже схема сайта будет примерно ясна, под это дело можно выбирать фреймворк (или решаешь на чистом Php писать) и библиотеки для фронтенда/бэкенда. Дальше дополняешь схему на основе выбранного инструментария. Пишешь бэкенд без фронтенда (вместо фронтенда просто echo получаемых данных везде, можно примитивные формы), пишешь юнит тесты, потом интеграционные тесты, в последнюю очередь в view модулях пишешь фронтенд, к нему каспер тесты.
Как мне пушить изменения в основную ветку в NetBeans? У меня создается локальная ветка (no branch), и я не могу никак зашуить ее, ни объединить. Мне не нужно много веток, я считаю, что ограничусь основной веткой, так как я единственный разработчик (в рамках этого проекта), но если я пытаюсь создать локальную ветку, то все равно ничего не пушится и висит (no branch)! Почему? Может я что-то не то делаю? Посмотрел вот этот мануал: https://netbeans.org/kb/docs/ide/git_ru.html но там нет ничего о том, как в идеале должна происходить работа с гитом.
>>701207 А меня? Вот это повторяется в двух местах: >$creditBalance = $thatMouthPay - $monthlyPayment; >$paymentTotal = $paymentTotal + $monthlyPayment; Это копипаст, необходимо от него избавиться.
>>700697 Так, от прямого складывания часов одного работника и часов другого избавился вот так: $allHours[] = $ivan->hours; $allHours[] = $peter->hours;
Далее просто подставляем $hours в нужную ячейку таблицы. Теперь остаётся считать с помощью функций и с помощью всё того же массива $allHours нормальные рабочие часы и переработку (овертайм). На том ли я пути? Сейчас не вижу ничего более подходящего для решения этой задачи.
>>701248 Вот так решил: for ($i = 0; $i < count($allHours); $i++) { $hours += array_sum($allHours[$i]); $salary += $employees[$i]->getSalary(); $normalHours += $employees[$i]->getNormalHours(); $overtimeHours += $employees[$i]->getOvertimeHours(); } И чисто технический момент остался - по разным ставкам посчитать оплату. Но терзают некоторые сомнения благодаря привитому ОПом подходу: а на том ли я пути вообще? В принципе, удалось автоматизировать, но не является ли добавление часов в массив "костылём"?
>>701307 Нет, я не прав: так считает общие часы, а нужно у каждого экземпляра считать отдельно, потому что ставки у всех разные. Тупик, короче. Надо для каждого объекта отдельно считать, буду думать, как. Постараюсь держать вас в курсе, это очень важно!
Где можно подсмотреть реализацию автолоадинга классов? Если я делаю проект в концепции мвц, то у меня классы раскиданы по каталогам. Как мне всё это грамотно связать? Видел реализацию где подключение классов контроллеров происходит в маршрутизаторе рекваерами, но я не уверен, что это хорошо.
>>701638 Самый простой автолоадер есть в документации к функции spl_autoload_register. http://php.net/manual/en/function.spl-autoload-register.php Но этот способ as is может загружать файлы только из одной папки. Конечно, можно написать костыль для загрузки из нескольких папок, но гораздо лушче будет освоить неймспейсы и рекомендацию PSR-4, тогда ты сможешь взять любой автозагрузчик, который работает с PSR-4 неймспейсами. Что почитать по неймспейсам: https://github.com/codedokode/pasta/blob/master/php/autoload.md Урок ОПа http://www.php-fig.org/psr/psr-4/ Сама рекомендация PSR-4 Так же, ты можешь взять автозагрузчик из менеджера пакетов composer https://getcomposer.org/ Он довольно простой и отлично подойдет для твоего случая. В уроке ОПа описано как он работает и как его настроить.
http://pastecode.ru/41f34/ А на выходе array(2) { [0]=> object(PDORow)#4 (4) { ["queryString"]=> string(22) "SELECT FROM projects" ["id"]=> NULL ["name"]=> NULL ["chpu"]=> NULL } [1]=> object(PDORow)#4 (4) { ["queryString"]=> string(22) "SELECT FROM projects" ["id"]=> NULL ["name"]=> NULL ["chpu"]=> NULL } } Почему? База не пуста. Если в while выводить то там есть значения.
ОП и анончики, тут ошибка в учебнике? <----- Смотрите: Петров работал 140 часов, из которых 10 - овертайм. 130 часов рассчитываются по ставке 8:1, а 10 переработанных - по ставке 12:1. 130 х 8 = 1040 тугриков. 10 х 12 = 120 тугриков. Итого: 1160 тугриков у Петрова. А у Иванова 160 нормальных часов по ставке 10:1, то есть 1600. Всего: 1160 + 1600 = 2760. Вопрос: откуда у ОПа взялось 2800 тугриков в итоге? Ещё вопрос: какого чёрта я сразу не посчитал это всё и вожусь с задачей второй день?
есть ли функция или какие нибудь параметры в extract() только чтобы я мог повлиять на выходе было не : $array = ['var1' = 'text1'] extract($array); //$var1 = 'text1';
а, some_func($array); // $data['var1'] = 'text1'; ?закомментировано то, что должно получиться после выполнения функции
Композер после обновления стал выдавать ворнинги о том, что типа не может удалить/перезаписать кеш (в папке ~/.composer)
>file_put_contents(/home/user/.composer/cache/repo/https---packagist.org/provider-nikic$fast-route.json): failed to open stream: Permission denied http://packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of date
>Failed to download container-interop/container-interop from dist: Could not delete /home/user/.composer/cache/files/container-interop/container-interop/fc08354828f8fd3245f77a66b9e23a6bca48297e.zip
>Failed to download nikic/fast-route from dist: Could not delete /home/user/.composer/cache/files/nikic/fast-route/31fa86924556b80735f98b294a7ffdfb26789f22.zip
Я конечно догадываюсь, что дело в правах (я такой умный), но кому и какие права я должен вручить, чтобы все стало правильно? Исполняемый файл композера (/usr/local/bin/composer) принадлежит руту. Папка .composer принадлежит пользователю. В cache/files много директорий с пакетиками, все принадлежат пользователю. Однако некоторые руту. До этого все работало без ошибок, подгружало из кеша, теперь вот пытался поставить слим3, его зависимости почему-то поставились из-под рута ("nikic" и "container-interop").
> его зависимости почему-то поставились из-под рута ("nikic" и "container-interop"). Потому что ты от имени рута запустил композер. Никогда не логинься под рутом и не используй su - только sudo и только там где нужно.
Если серьезно, то наверное какую-то другую команду запускал от рута, может быть self-update. Удалил папку .composer из домашней директории, помогло. Дважды установил слим ради эксперимента. Первый раз естественно произошла установка из сорцев, а во второй раз "loading from cache". Однако папка .composer не реинкарнировалась в директории пользователя, она наверное теперь живет по другому адресу. Так что тут дело не в запуске от рута, там в самом композере шото поменяли.
А, кеш композера теперь переехал в общую папку ~/.cache/composer Конфиг ~/.config/composer Однако в нем теперь только .htaccess. А где глобальные настройки, composer.json? Вечно что-то меняют, все им неймется.
https://getcomposer.org/doc/03-cli.md#composer-home >On nix systems that follow the XDG Base Directory Specifications, it points to $XDG_CONFIG_HOME/composer. On other nix systems, it points to /home/<user>/.composer.
Это наверное моя ебунта обновилась так, что теперь следует этим xdg спецификациям. Ну ладно, проехали.
Для удобного хранения файлов я решил создавать новую папку на каждые 100 id файлов. Таким образом в папку с именем 100 пойдут все файлы с id от 1 до 100, в папку 200 пойдут все файлы с id от 101 до 200 и т.д. Проблема в том, что я не придумал как нормально посчитать в какую папку должен идти файл, поэтому сейчас там вот такой костыль https://github.com/foobar1643/filehosting/blob/master/app/Model/File.php#L88 Я понимаю что это вроде как легкая задача, но решения придумать не могу, прошу помощи.
Перед тем как выбрать id файлов в поиске, я считаю общее кол-во найденых результатов через >SELECT COUNT() FROM index_files, rt_files Проблема в том, что этим способом он считает удаленные файлы. Я частично исправил это, сделав удаление записей из rt-индекса при удалении файла, но если файл уже в основном индексе, то его оттуда никак не удалить, только ждать переиндексации. А это значит что из основных индексов он будет считать удаленные файлы как обычные. Из этого вытекает баг с постраничной навигацией, потому что я использую общее кол-во записей для расчета оффсета выборки. Ну и очевидным фиксом будет выбрать все результаты через SELECT FROM, потом проверить существуют ли все id, и только после этого посчитать их количество. Но не будет ли это одновременно копипастой (я по сути делаю ту же самую выборку еще раз, только с оффсетом для постраничной навигации) и усложнением?
Мне очень не хотелось наступать на те же грабли с разделением кода, но тут получилось так же. Сейчас код очень плохо разделен и у меня появилась идея вынести все действия над файлами в хелперы, а из контроллеров потом вызывать их. Примером приведу удаление файла: В хелпере создаю функцию deleteFile(), которая принимает на вход объект File, и проводит все необходимые действия для его удаления с диска, из базы и поисковых индексов. А контроллер будет проверять на правильность данные от пользователя (существует ли файл с таким id, имеет ли пользователь право его удалять), и если все проверки выполнились успешно - вызывать функцию deleteFile() из хелпера. Таким образом можно будет все манипуляции с файлами вынести в хелпер и использовать их повторно, если нужно будет добавить другую фору загрузки, а в контроллере оставить только проверку юзер-инпута. Что-то мне подсказывает что в нормальном MVC как-то так и должно быть, но в то же время это все мне кажется усложнением хелперов. Хотя хелпер это же сервис вроде как, поэтому он может работать с несколькими объектами, как писал ОП. >Сервис это объект который обычно есть в одном числе и выполняет какие-то действия над другими объектами или чем-то еще, а тут обычный объект не-сервис. Его надо просто создавать через new. >По идее концепция такая, что сервисы не хранят состояние, зависящее от текущего запроса. То есть один и тот же объект-сервис можно использовать для обработки нескольких запросов от разных пользователей. Тут не знаю как сделать, поэтому пока оставил все в контроллерах.
Про древовидные структуры. Читал этот урок https://github.com/codedokode/pasta/blob/master/db/trees.md и не понял зачем в Materialized Path нужна колонка number. Так же, во время поиска теории, я наткнулся на интересный пост на Stack Overflow, в котором объяснялось почему такой Materialized Path как в уроке - неправильный. Ссылка вот http://stackoverflow.com/a/2797732 У себя я сделал так же, в конец колонки path для каждого файла добавляю id файла. Конечно, в таком случае на добавление комментария я делаю два запроса, но и в способе ОПа я тоже не вижу как посчитать колонку number и добавить комментарий одним запросом.
Обработка ошибок формы через исключения. При загрузке файла у меня выбрасываются исключения, если что-то пошло не так (файл слишком большой, поля формы не заполнили и т.д.). Потом обработчик исключений ловит его, и выводит обычную страницу поиска, только с ошибкой. Правильно ли так делать? Или лучше поменять на обычный редирект с гет параметром вроде "?error=filesize"?
ОП часто агрица на то что начинающие не следуют строгим правилам, но что поделать, если даже в оф.мануалах о таких вещах либо ничего не говорится, либо дают плохой пример.
Вот в гайдах к третьему слиму пару моментов успел заметить. 1. Разный стиль именования переменных. В одном месте кемелкейс, в другом сишные подчеркивания. Допускаю, что у автора кода были какие-то скрытые мотивы, но я лично не знаю какие. https://github.com/slimphp/Slim-Website/blob/gh-pages/docs/tutorial/first-app.md#use-monolog-in-your-application $file_handler = new \Monolog\Handler\StreamHandler("../logs/app.log"); $logger->pushHandler($file_handler); Чего файл_хендлер написали? 2. В третьем слиме в отличие от второго в каждый роут(ер?), ну то есть в колбек-функцию обработчик теперь нужно передавать два параметра: $request и $response. В некоторых примерах указывают тайпхинт, в других нет. https://github.com/slimphp/Slim-Website/blob/gh-pages/docs/index.md#how-does-it-work Встает вопрос, обязательно ли? Знаю что с точки зрения интерпретатора необязательно, а с человеческой? Может это важно для каких-нибудь тестов? (никак не дойду до тестирования)
>>702252 Оп все правильно делает. Попробуй устройся на работу со своими смешанными стилями и отсутствием тайпхинтов, тебя там через день уже про это заебут, QA ни один тикет не пройдет.
>Встает вопрос, обязательно ли? Если это твой личный проект, который ты только своей кошке показывать собрался, то не важно. В любой нормальной фирме все эти стандарты - жизненно важное требование, иначе код через год-другой становится очень трудно поддерживать и расширять. Оп кстати еще мало с вас требует, в фирмах помимо тайпхинтинга еще докблоки для каждого теста и каждой функции, соблюдение всяческих PSR, определенные договоренности по именованию классов, размещению файлов, структуре тестов и еще много всяких условностей соблюдают. Code Guidelines только 3 страницы текста занимает, каждого нового программиста в него регулярно тыкают.
>Может это важно для каких-нибудь тестов? (никак не дойду до тестирования) Да, при написании тестов в том числе.
Я против стандартизации и строгости ничего не говорил, наоборот сетовал на то что этому никто не учит к сожалению. Вон даже в официальном гайде к известному фреймворку не соблюдают этих правил и не объясняют их необходимости.
Ок, то что в крупных конторах (которых не так много) важны стандарты, это понятно. Ты лучше смени менторский тон и расскажи о командной работе. Я где-то выше спрашивал. >>690750 Как проходит рабочий день и что подразумевается под "умением работать в команде". Как можно не уметь работать в команде?
>>702471 Функция ucfirst вроде бы не работает с кириллицей: http://ideone.com/s2uYIE Попробуй mb_substr. >>702513 В переменную, которой ты и присваиваешь работу этой функции. >>702520 Человек решил сэкономить на своих решениях и воспользовался чужими. Проходили такое сто раз.
>>702521 Переделал под substr. Нашёл такой способ: $explodedText[$i]=mb_strtoupper(mb_substr($explodedText[$i], 0, 1)). mb_substr($explodedText[$i], 1); Можешь пояснить как через точку ещё функцию сделали?
ООО ВЕКТОР + Анти-кризисные меры Переписал половину скрипта и запилил меры. Посчитал и потестил - вроде норм все, но у меня такое чувство, что этот код как земля. В первом задании не ясно: нужно считать с босса, если он инженер и увольнять вместо него рабочего или нет я слегка тупой, но я посчитал. http://ideone.com/7TpNMo
>>702504 >Как проходит рабочий день и что подразумевается под "умением работать в команде". День обычно с распределения тикетов начинается, потом рефайнмент будущих тикетов часа на 2 всем тимом, это заседание такое, где обсуждают толпой какие архитектурные решения будут в решении каждого тикета применять, какие вопросы надо решить, чтобы тикет стал однозначным (например позвонить провайдеру API и задать определенные вопросы), какие технологии использовать и прочее такое. В случае готового тикета проводится голосование и все решают, насколько высока его сложность и какие трудозатраты будут. В заседаниях активно участвуют представители бизнеса, которые оценивают business value каждого тикета, и нужно ли его вообще делать по результатам оценки.
>Как можно не уметь работать в команде? Очень просто, весь код пишется не одним тобой, а маленькими кусками, раскиданными между людьми в команде. Постоянно нужно согласовывать, как что будет написано, потому что если это не делать, можно написать дублированный код или код, который друг к другу не подходит, несовпадающие форматы, разные архитектуры. Потому здоровая часть времени уходит на выяснение отношений с членами команды. Естественно тут нужны социальные навыки, каждый стремится всунуть свое видение, люди забывают сообщить нужную информацию, делают что-то на свое усмотрение, у кого-то плосто фигово с коммуникацией, кто-то вообще придерживается идеологии - весь проект сам напишу, постоянно нужны компромиссы. Плюс кроме программеров есть другие отделы, всякие маркетинги, продукт менеджменты, SEO, спецы по безопасности, бухгалтеры и прочий цирк, с ними тоже надо регулярно коммуницировать. Эти часто вообще не могут внятно объяснить чего они хотят, и не понимают, почему что-то представляет сложности или занимает много времени. Все это вместе требует развитых коммуникативных навыков, нужно доносить свое видение и аргументировать свои решения. Бывает, что напишешь что-то правильно и хорошо, но поскольку другие не поняли, то твое решение потом выпилят и заменят на фиговое. Не сумел аргументировать значит и презентовать. Это фэйл командной работы. Алсо в конце любой крупной фичи нужно презентовать свой проект уже перед представителями бизнеса на большом экране и им аргументировать те или иные решения, при чем у них своя логика, и они в программерские аргументы часто не врубаются. Вот это все и есть командная работа.
>>690750 >Есть ли разделение труда, типа отдел верстальщиков-фронтендеров, бекенд-программисты, системные администраторы, или везде фулстаки (которые на словах умеют "все", но делают это все плохо)?
Есть, все разделено. Когда фронтенды не справляются из-за огромного объема тикетов, подключают фуллстаков клепать фронтенд. Админы админят, и до них достучаться только админскими тикетами можно. Бэкенды и фуллстаки большую часть времени заняты бэкендом, но фронтенда тоже хватает.
>Проводят ли старшие программисты код-ревью, то есть проверку кода джунов? Да, все есть. Любой твой написанный код проходит через 3 стадии - сначала идет в QA, где его по очереди проверяют 3 программиста, пишут заметки по коду, и отправляют назад в статус Reopened, если все плохо. Когда код тобой доведен до нужного качества и он прошел проверку на QA, его отправляют на деплоймент. Деплоишь либо ты, либо другие программисты. Деплоймент идет сначала на внутренний сервер, где на него набрасываются отделы контроля качества, это еще ХХ человек, оттуда бывает тоже тикеты возвращаются. Когда проверку на внутреннем сервере прошел, деплоится уже на live, там тоже его грызут отделы качества, ну и программисты разок смотрят для порядка. Если на live глюки, то делается глобальный откат, и все сдеплоенное улетает обратно. Закрывается тикет окончательно только после проверки всеми на live.
>Есть ли семинары или что-то подобное для повышения квалификации? Есть, раз в 2-3 месяца организуют всяческие воркшопы. Также можно ездить на конференции за счет фирмы.
>Как проходит именно рабочий процесс? Тимлид бегает и раздает всем мелкие задания, следит за выполнением и подсказывает (инбифо: размечтался), или все более бюрократично, типа вон список задач, бери шо хочешь, делай как хочешь, сдавай как хочешь. Это не задача тимлида, организацией распределения тикетов заниматься. Тимлид обсуждает решения с другими отделами и командами, участвует в заседаниях тимлидов и начальства, доносит важную информацию до тима.
>Только если будет жалоба, тебя выпизднут. Жалобы на тебя не может быть, поскольку качество кода - ответственность тима, а не отдельного человека, для этого многоступенчатая проверка. Жалоба может быть только на тебя от тима, если ты хреново в командную работу умеешь.
>>702641 >Проводят ли старшие программисты код-ревью Ах да, про это забыл. Код ревью проводят не старшие программисты, а архитекторы - это должность специальная такая, на каждый тим 1-2 архитектора приходится. На код ревью обычно приглашаются все программисты, запускается экран во всю стену и на него выводят код. Архитектор критикует каждое решение, тим отбивается, пытается отстоять свои решения. В итоге находят компромиссный вариант, делают список изменений в новом тикете, раскидывают по тиму и меняют код. Через пару недель повторный код ревью.
http://ideone.com/Np7lSE - вот, решил задачу на ООП перед основным сложным "Вектором". Можно ли было вот так добавить ещё одно поле в класс для сохранения переработанных часов? Можно вместо этого сохранить в новый массив, а потом достать значения в цикле, но вроде бы так удобнее. Вообще очень удобно в ООП доставать значения из определения класса, удобно применять функции. Но правильно ли я вообще сделал, что некоторые функции определил вне класса? По ООП ли это? Просто многое требовало подстановки изменённых значений, а не тех, которые были даны изначально.
>>702647 >Как проходит именно рабочий процесс? Тимлид бегает и раздает всем мелкие задания, следит за выполнением и подсказывает (инбифо: размечтался), или все более бюрократично, типа вон список задач, бери шо хочешь, делай как хочешь, сдавай как хочешь. Еще дополню по процессу - вся работа делится на спринты, это периоды в 2 недели. Перед началом каждого спринта специальная программа высчитывает среднее количество сложности, сделанной в предыдущие спринты. Потом вводятся данные по праздничным дням с спринте, отпускам сотрудников, больничным и прочие, число сложности корректируется. На основании этого числа в спринт забивают определенное количество тикетов, у каждого тикета своя подсчитанная сложность (для этого голосовали на рефайнменте), общая сложность всех тикетов должна совпадать с подсчитанным программой числом. Дальше все тикеты в спринте, и можно выбирать только из них. Каждый член команды сам выбирает себе подходящий тикет из свободных. К середине спринта начинается приближение к красной линии, и включается сигнал тревоги, если количество невыполненных тикетов велико. Тут тим собирается на кризисное собрание и решают, как распределить тикеты лучше, на какие тикеты кинуть больше народу, какие делать через парное программирование для ускорение процесса и прочее такое. Если после собрания спринт все еще находится под угрозой, срочно звонят в другие тимы и подтягивают свободных людей оттуда. Общими усилиями одолевают спринт, но не всегда. Если к концу спринта тикеты не выполнены и спринт завален, то это катастрофа похуже конца света, начинается беготня начальства, разносы и поиск виноватых. После разбора полетов тим лиды и менеджмент лишаются премий, делаются Action Improvements - это такие правила новые для тимов и вносятся в свод правил, до всех членов тима доносится информация, что нужно изменить в работе. Заваленных спринтов никто не любит, поэтому обычно такого не бывает.
>>702674 В Jira и Confluence. Slack не используется, вместо него внутренний Jabber сервер с кучей чатов для разных тимов. Код через Atlassian Stash и Bamboo.
Я не понял, на чем ты хочешь писать? Если на PHP то учебники и мануалы есть в сети, если на Яве - тоже книги есть, но конкретные я посоветовать не могу. Чтобы писать на Яве, надо изучить синтаксис, стандартную библиотеку, коллекции там всякие, потом ООП и тд. Довольно много, на PHP может и проще было бы.
Если ты не знаешь какого типа данные приходят в функцию, это усложняет работу с ними, надо писать ифы, преобразования. Легко где-то ошибиться. Стоит всегда четко определяться какой тип имеет каждый аргумент.
stdClass плох тем что это как массив, только функций для работы с ним нету.
Не. это всегда неудобно когда неизвестен тип, надо писать дополнительные условия, легко что-то перепутать. Лучше всегда знать тип каждой переменной и не передавать/хранить данные разных типов в одной и той же переменной.
На автоматическое преобразование полагаться нельзя.
Когда ты определяешь (создаешь) функцию, ты пишешь в скобках не то что передается, а переменные которые принимают аргументы. И им не важно, передается в них элеиент массива или еще что-то
> $deposit <=1000000; Вот условие прождолжения странно выглядит. Если мы набрали ровно миллион - все равно продолжать цикл? Я думаю, не надо.
> if($deposit>=1000000) { Это лучше поставить после цикла. Ведь в цикле мы обычно пишем повторяющиеся действия, а это действие выполняется уже после заверщения цикла (а он завершится когда сумма дойдет до млллиона и потому дополнительная проверка в виде ифа тут будет не нужна).
То есть считает программа верно, но код можно организовать чуть логичнее. И если нетрудно, пости лучше на ideone, там сразу и результат виден.
Вебмин - это может и неплохо, но он для тех кто уже умеет администрировать через командную строку. Он не годится как способ избежать изучение команднйо строки, так как если что-то пойдет не так, он тебе проблему не покажет.
Я сам с ним не работал, мне в общем нравятся компоненты из Симфони и микрофреймворки вроде Слима/silex. Хотя для простых вещей компоненты от Симфони может и перебор.
Код на Си - значит что ты не можешь так просто в нем найти ошибку, если не знаешь Си, не можешь отлаживать итд. Может для хайлоад-проектов и имеет смысл. Вообще, по моему опыту, хайлоад проекты на php обычно самописиные (хотя например тот же гитхаб написан на фреймворке на Руби).
- вместо for для обхода массива лучше использовать foreach - не надо для хранения номера создавать каждый раз новую переменную ($space $bracketStart $bracketClose $hyphen) - используй одну и ту же, а то от большого количества переменных путаешься - 2 регулярки тут можно объединить в одну - многочисленные замены можно сделать одной командой, например с помощью strtr с массивом или preg_replace
Ну и конечно это задача на регулярки, было бы хорошо написать регулярку, которая бы без замен проверяла номер.
> Квалифицированный программист потребует за свою работу в десятки раз больше, чем быдлокодер, осиливший только синтаксис. С точки зрения клиента конечный продукт от грамотного разработчика ничем не отличается от высера толпы австралопитеков. Не всегда. Если проект сложный, то низкоквалифицированные кодеры сделают хуже и потратят намного больше времени чем профессионал - экономии не будет, будет много потраченных нервов. Я такое видел не раз.
Самый экономный и выгодный вариант как я понимаю - сильный старший разработчик + несколько недорогих, но мотивированных падаванов.
> гроссмейстеров, требующих 4000 евро в месяц? Ну ты загибаешь. Насколко я знаю, в той же Европе программисты часто меньше этой суммы зарабатывают, а в нашей стране ее платить нет экномического смысла.
> как пронзительная мольба со стороны заебавшихся разработчиков к клиентам не покупать битриксы Ситуации бывают разные. Низкоквалифицированные разработчики на битриксе ограничивают уровень, на котором можно сделать проект.
> $i++; > echo "Ваш ответ на вопрос №$i ({$question->text}): \"{$answer}\" ({$question->answers[$answer]}). "; > $i--; Можно просто сделать $number = $i + 1; - ниже так и сделано. Не стоит лишний раз менять переменную-счетчик.
Методы вызываются так. Снаружи - с указанием объекта:
$x = $ivan->getTotalHours();
изнутри класса - через $this:
class A { public function x() { $y = $this->getTotalHours(); } }
> А можно ли как-то кратко посчитать все hours для любых экземпляров класса? Для всех имеющихся? Сложить их в массив и пройтись по нему foreach. Также есть array_sum.
> public function getSalary() Не учитывает повышенную оплату овертайма
> __construct Конструктор лучше ставить первым из методов, так как он отвечает за инициализацию объекта.
> public function getNormalHours() { Она не учитывает часы в неделях с овертаймом
getNormalHours, getOvertimeHours - кстати одно из этих значений можно получить вычтя другое из общего числа часов.
> $i = preg_split('//u', $x); Что за нахвания переменных? Непонятно же, используй нормальные слова.
> function padRight($x, $y){ Ты там что-то переусложнил. С помощью mb-strlen найди длину строки и с помощью str_repeat добавь не хватающее число пробелов.
> if ($employee->getOvertimeHours() > 0) { > $overtime += $employee->getOvertimeHours(); тут иф не нужен - от прибавления нуля ничего не меняется
> как именно надо подсчитать разницу в оплате переработанного времени. зарплата = обычное время x обычная ставка + овертайм x ставка овертайма
> А контроллер разве не реализует процесс регистрации нового студента? Я не могу понять в какой модели иначе это должно реализоваться. Погугли "тонкие контроллеры". Код в контроллере не повторно используемый, потому не стоит его там много писать. Мы должны выделять из этого кода отдельные, не зависмые от контроллер функции и выносить наружу. Ну например, регистрацию можно делать и без контроллера - что если нам надо программно сгенерировать 100 студентов и вбить в базу? Ты будешь копипастить код контроллера?
Давай-ка сделаем так. Чтобы ты лучше это понял, сделай скрипт для командной строки, который генерирует заданное число студентов и вставляет в базу. Вызывается он например так:
php generate-students.php 100
Паста про командную строку есть в ОП посте, для генерации имен и прочего можно использовать библиотеку faker или же написать свой код (библиотека конечно удобнее). Если тебе надо добавлять какие-то опции в командную строку, для их разбора есть функция getopt().
Файл для командной строки храни вне веб-папки, например в папке cli или command. Этот файл по сути будет альтернативным контроллером.
> На данный момент у меня есть RegisterForm, Student, RegistrationHelper, StudentGateway, и не к одному из них я не могу отнести эти методы RegistrationHelper по названию подходит для всего связанного с регистрацией.
Обычно отладка включается добавлением параметра в URL, вроде XDEBUG_ENABLE или как-то так. Если ты используешь куки для этого, то удали их и исползуй параметрв УРЛ - тогда отлаживаться будут только скрипты где ты дописал в УРЛ параметр.
>суть проблему - xdebug при прослушивании порта подхватывает и phpmyadmin Он по моему ничего не прослушивает. Это отладчик или иде слушает порт, а xdebug к нему коннектится.
> Сделал на линейно-итеративное и не получилось. Цикл забыл. Надо ведь чтобы после выполнения кода он выполнялся пока мы не дойдем до нужного числа. Потому нужна либо рекурсия либо цикл чтобы многократно выполнять код.
Такие штуки обычно делают с помощью роутера. Никто не создает кучу php-файлов для каждой рубрики. Просто с помощью роутера перенаправляют все однотипные УРЛ чтобы их обьрабатывал один и то же контроллер. Ты слышал про MVC и фреймворки вроде Slim, Silex, Yii 2? Погугли.
> Есть страница "Смесители". > На ней запрос из бд вываливает документы, которые привязаны к смесителям. Никто не делает страницу на каждую категорию разве что кроме поехавших любтелей битрикса. Нужен один код который работает с любой категорией.
Плохо успеваю. Спасибо всем анонам, кто помогает новичкам и облегчает мою работу.
> Не всегда получается исправлять какие-то решения - хочется уже дойти до своего проекта, но буду заставлять себя. Тут надо бы разрбраться, так как это пока все же основы и без крепкого понимания основ крепко на ногах стоять не сможешь.
>>Плохо что непонятно. > Довольно обидны ваши слова. ну я специально не хотел обижать, я же не знаю твой уровень и прошел ты это или нет. Если нет - то почитай про формы, элементы которые в них можно использовать. как делать массивы чекбоксов итд.
> Я же об этом первоначально и спросил, как связать галку с той или иной парой слов. > Можно по индексу в имени чекбокса, который будет совпадать с индексом в имени инпутов. Погугли "php POST формы массивы". Ты можешь сделать имена у чекбоксов вроде delete[100] или delete[hello] то есть указать в них первичный ключ записи для удаления. Принцип работы чекбокса такой: если в нем стоит галочка то при отправке формы на сервер передается строка name=value, если не стоит то ничего не передается.
Почитай про формы, про метод POST в протоколе HTTP, про кодирование данных формы (enctype, multipart/form-data, application/x-www-form-urlencoded) при отправке.
> Хотя меня смущает кол-во элементов формы (по три на каждую пару слов, который в свою очередь может быть около сотни). Ну с этим ничего не поделать.
> Вообще я уже вижу что идея с этим сайтом не очень хорошая, Почему не хорошая? Если тебе она нравится то это самое важное. Для обучения такой сайт вполне годится, хотя я бы советовал и наше задание на студентов посмотреть, хотя бы римечания почитать - там много полезного напсиано. Может что-то можно применить к твоей задаче.
У нас в последние несколько лет меняли правила зимнего времени - проще всего перевести время вручную. Или поставить зону вроде Дубаев. По идее под линуксом там надо как-то обновлять какую-то библиотеку (tzdata). гугли.
> Еще как пишет. Причем от фреймворков в пользу чистого PHP еще отказываются, ибо быстрее работает и проще все контролировать, нет зависимости от внешних разрабов. Ты пробовал форму с валидацией делать на числом PHP в сравнении с теми же симфони формс? Не проще и не быстрее, а больше рутины и копипасты. Как это ускоряет разработку, неоьходимость все писать руками каждый раз? Те кто так говорят наверно просто боятся что не осилят фреймворк.
Да и не все проекты такие уж высоконагруженные, и можно использовать микрофреймворки например, какие-то отдельные компоненты и тд. Я видел переходы в обе стороны - на самопис и с самописа на фреймворк.
Гит это не часть нетбинс, а независимая программа, то что там есть это обертка над гитом. Освой гит в командной строке и только потом переходи награфический интерфейс к нему. Гугли git book - она простая и есть на русском.
Помощь по командной строке - в ОП посте.
> но там нет ничего о том, как в идеале должна происходить работа с гитом. Он рассчитан на тех кто уже освоил сам гит, отдельно от нетбинс.
Проще сложить самих работников в массив, а не их часы. Обойти этот массив циклом и просуммировать.
> for ($i = 0; $i < count($allHours); $i++) { > $hours += array_sum($allHours[$i]); Это не очень правльно так как суммировать часы за неделю должен сам работник.
У работника должен быть метод который считает его зарплату. Суть ООП в том что мы в классе объединяем данные и методы для их обработки. И за расчет своей зарплаты отвечает сам работник.
А вот за сумму по всем работникам- уже внешний код.
> по разным ставкам посчитать оплату. Умножь и сложи, что тут думать.
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник) — какие у них есть свойства. Зарплата не является свойством так как она вычисляются из других свойств и хранить ее не надо. — что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал. — как сущности связаны? Тут всего один класс и работники никак не связаны.
----
Нужно сделать метод расчета зарплаты в сотруднике.
> Почему? База не пуста. Если в while выводить то там есть значения. Открой мануал и прочитай в нем про все использованные методы и константы, чтобы ты понимал что значит каждое слово. Если в мануале что-то непонятно, задавай вопросы.
Также, вставку надо завернуть в транзакцию. В базе не при каких условиях не должно быть записи, для которой еще или уже нет файла на диске. Сначала сохраняешь файл и в случае успеха коммитиш транзакцию.
Помещайте более короткую ветвь IF первой. Это позволит видеть сразу обе ветви, что повысит читаемость кода. Если ветка ELSE содержит одну-две строки, а ветка IF гораздо больше, то поменяйте их местами, не забыв инвертировать условие.
------
> Перед тем как выбрать id файлов в поиске, я считаю общее кол-во найденых результатов через >>SELECT COUNT() FROM index_files, rt_files Вообще, это по моему неправильно. Сфинкс при поиске умеет возвращать сразу и число результатов. Там в АПИ есть функция и в SQL наверно есть ее аналог. Погугли (SHOW META).
Также, не лучше ли превьюшку делать до коммита транзакции? Вообще, подумай, в каком порядке безопаснее всего выполнять действия.
> Проблема в том, что этим способом он считает удаленные файлы. Это следствие того что вместо одного хранилища данных они у нас хранятся в 2 местах и рассинхронизируются. Решения такие:
- игнорировать и надеяться что никто не заметит - при выводе писать "этот файл был удален" - тогда количество не нарушится (вполне нормальный вариант) - не писать точное число записей. Посомтри, гугл например не пишет точное число результатов и ограничивает число страниц.
Кстати, сфинкс по моему тоже имеет какое-то ограничение на максимально допустимый оффсет - изучи этот вопрос, опция max_matches по моему.
> Ну и очевидным фиксом будет выбрать все результаты через SELECT FROM, потом проверить существуют ли все id, и только после этого посчитать их количество. Нет, это будет неэффективно так как ты должен выбрать из сфинкса кучу данных. потом из базы и потому 99% их выбросить так как они не влезают на страницу. Это нехорошо.
> Из этого вытекает баг с постраничной навигацией, потому что я использую общее кол-во записей для расчета оффсета выборки Это как? Обычно считают по принципу ($page - 1) x $perPage
> Сейчас код очень плохо разделен и у меня появилась идея вынести все действия над файлами в хелперы, а из контроллеров потом вызывать их. ПРавильная мысль
В качестве доказательства что твой код разделен, сделай простой клиент для командной строки. Он должен позволять добавлять файл с диска в приложение, удалять файл по id и например показывать список файлов с указанием оффсета и лимита. Представь что это такой инструмент для администратора. Для парсинга аргументов командной строки можно использовать getopt или компонент Симфони для командной строки.
> Тут не знаю как сделать, поэтому пока оставил все в контроллерах. Контроллеры надо делать тонкими.
> и не понял зачем в Materialized Path нужна колонка number. Я тоже не помню.
> Так же, во время поиска теории, я наткнулся на интересный пост на Stack Overflow, в котором объяснялось почему такой Materialized Path как в уроке - неправильный. По моему там то же самое что и у меня - тоже написано про выравнивание нулями. Кстати, раз мы заговорили про Mpath, сделай такие штуки:
- проверку ограничений на максимальную глубину и число комментов в ветке чтобы не сломать дерево - подумай над такой ситуацией: 2 потока одлновременно хотят добавить коммент в одну и ту же ветку. Не получится ли у них одинаковый mpath? Как можно с этим бороться? Погугли про блокировки в БД. - посмотри, можно ли отделить код реализации Mpath чтобы например можно было легко добавить этот функционал к другим таблицам. Особо сложного делать не надо ничего, просто посмотри реально ли это.
> в конец колонки path для каждого файла добавляю id файла. Зачем? Не понимаю. path там содержит номера комментариев по порядку в каждой из веток в которые он вложен.
> Правильно ли так делать? Или лучше поменять на обычный редирект с гет параметром вроде "?error=filesize"? Неправльно. Надо обрабатывать ошибки загрузки в контроллере без редиректов. Как описано в уроке по работе с формами.
Насчет переиндексации - а правильно ли что ты сначала очищаешь rt индекс, а только потом пополняешь основной индекс? Не вызовет ли это перебоев в работе поиска? Изучи это вопрос.
>Установите права исполняемого файла для cron/reindex.sh используя команду chmod a+x reindex.sh Это можно сделать через гит - он сохраняет флаг исполняемости, изучи этот вопрос.
Кстати, а почему storage в публичной папке? Зачем?
В таблицу комментариев возможно стоит добавить parent_id. Это позволит связать комментарии внешним ключом и восстановить parent_path в случае повреждений. Подумай над этим.
Далее, я вижу ты взял файлы из video.js и перемешал их со своими. Это неправильно. Стороннюю библиотеку надо положить в отдельную папку.
Далее, почему этот video.js такой гигантский? 681 Кб? Выясни. что там такого напихано и можно ли получить версию только с тем что нам нужно.
Надо вынести файлы из публичной папки, перименовывать все кроме белого списка, запретить выполнение кода в папке с файлами через htaccess если используется апач.
> <img src="/storage/previews/thumb_{{fileHelper.getDiskName(file)}}" alt= нарушение принципов DRY и единой ответственности. пути должна генерировать предназначенная для этого функция.
Еще меня немного беспокоит отсутсвие системы именования классов. Где гарантия что твое имя не пересечется с используемым в бутстрапе? То же самое по поводу имен JS функций. Подумай, что можно сделать.
Давай пока с этим разберемся, а потмо еще код посмотрим - я там вижу другие сомнительные места.
Так, в общем, в коде там немало и хороших моментов, но на них мы останавливаться не будем.
> Разный стиль именования переменных. Это конечно нехорошо.
> Встает вопрос, обязательно ли? Знаю что с точки зрения интерпретатора необязательно, а с человеческой? Я думаю, они не ставят их так как эту функцию все равно только Слим может вызвать и ничего левого он в нее не передаст. Но от того что поставишь тайп хинт хуже точно не станет.
Ой-ой, это совсем не ООП. Массивы на массивах и массивами погоняют. Вот тебе паста:
--------
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент, может быть еще Компания?) — какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо. — что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег. — как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии. Правда в этом случае мы не можем поменять профессию сотрудника.
Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.
В общем, чем меньше публичных свойств и методов, тем лучше. Ведь когда другой разработчик или ты сам захочет использовать класс, он будет смотреть только на публичные элементы, и чем их меньше, тем проще разобраться как класс работает. Но не стоит закрывать вообще все: надо думать, является ли метод частью вунтренней логики класса или он предназначен для выдачи полезной информации.
Когда ты проектируешь класс, ты можешь представить себе что ты делаешь некую коробочку, из которой торчат переключатели и провода. Публичные свойства и методы - это то, что ты разрешаешь использовать другим программистам. Приватное - это то, что скрыто внутри коробки и что они трогать не должны.
--------
Теперь пройдемся по коду.
Во-первых, код надо пропускать через форматтер, читай второй пост в треде. Ну это же невозможно читать, я даже не понимаю где заканчивается и начинается цикл.
Вот у тебя класс Employees. Он видимо представляет группу однотипных работников. Первый недостаток виден сразу: а что если нам надо наградить или повысить зарплату части группы? Как ты это будешь делать? А если нам надо уволить пару человек и добавить пару новых?
Очевидно лучше сделать для каждого работника свой индивидуальный экземпляр объекта.
Далее, непонятно зачем ты в каждого работника передаешь название департамента. Достаточно того факта что работник находится внутри департамента. Более того, было бы удобнее создавать работника вне департамента и позже добавлять его туда:
$employee = new Employee(...); $marketing->addEmployee($employee);
А у тебя работник рождается уже приписанным к департаменту. Я думаю, это лишнее усложнение, не дающее никакой выгоды.
Далее, у тебя там функции-простыни по 50 строчек. Это слишком много, невозможно читать и поддерживать, разбивай их на более мелкие.
> 'Me'=>500, Для обозначения вещей вроде профессий надо использовать константы классов, а не текстовые строки. А то опечатаешься и никто не заметит.
> $this->boss['position'] = $position; > $this->boss['rank'] = $rank; Непонятно зачем тут массив. Что тебе мешает напрямую значения в полях объекта хранить, а не усложнять все?
Более того, у тебя там куча аргументов в конструкторе и даже непонятно какого они типа и что хранят. Например что такое rates? Это понять невозможно.
Далее, класс EmployeeOrder. Посмотрим на его конструктор:
construct($workers, $coffe)
Абсолютно непонятная логика. почему мы кофе передаем отдельно, а зарплату например нет?
Далее, ты зачем-то копируешь данные:
> $this->employees[] = $worker->employee; Это плохая идея. Когда у тебя 2 копии данных, непонятно как их обновлять и какая из них правильная.
Более того, мы тут имеем сложный 2-мерный массив непонятной структуры. Мы изучаем ООП и данные необходимо хранить в виде объектов. В отличие от массива, в объекте всегда понятно какие у него есть поля и что в каждом хранится.
Далее,
> $this->department = $worker->department; Эта строчка стоит в цикле и получается у нас сохранится толбко последнее значение. Зачем это?
> $this->rates = $worker->rates; А это строчка после цикла и опять же непонятно почему мы копируем rates только из последнего объекта.
> function crysis() Имена функций начинаются с глагола.
> if (!function_exists('multisort')) { > function multisort($array, $index) Что это за ерунда? Почему ты внутри класса создаешь динамически новые функции? Как такой код отлаживать когда функции в нем появляютяс когда хотят? И вообще, разве это задача класса EmployeeOrder создавать функции сортировки? Уверен он не для этого делался.
Далее, тут видна ошибка:
> new Department((new EmployeeOrder($workers1, $coffe)), $documentation), Почему мы в конструткто Департамента передаем АнтикризисныйКомитет? А в Комитет передаем работников и какое-то кофе? Это же странно.
АнтикризисныйКомитет это отдельная сторонняя сущность. Ты даешь ему Компанию (или Департамент) и он выполянет над ней антикризисные действия:
$comittee = new AntiCrisisComittee; $comittee->applyPlan1($company);
Вот и все. Не надо усложнять. Заметь что в моем варианте Комитет способен обработать аж несколько компаний по очереди.
Не надо 3 раза создавать все департемаенты. Изучи оператор clone и сделай чтобы компанию можно было клонировать со всеми департаментами и работниками:
$company2 = clone $company;
В общем, давай для начала сделаем нормальные классы для Сотрудника, Департамента и Компании, добьемся чтобы каждый из них умел бы делать что-то полезное, а потом уже будем делать антикризисный менеджемент. Сделай первую версию программы без антикризиса для начала.
Более того, если ты не очень уверен что правильно пишешь, ты можешь создавать по одному классу. То есть создай например Работника и проверь что он хранит всю нужную информацю, что он что-то умеет считать, свою зарплату например. Или даже ты можешь перед тем как писать код, попробовать просто написать какие поля и методы будут в классе.
Я может не очень внятно тут написал, так что задавай вопросы, я или анонимные эксперты тебе что-нибудь подскажут. ООП важная штука и надо в нем разбираться.
Я вижу ты там еще одну задачу на ООП запостил - сначала надо ее сделать идеально тогда.
Ответы 30 марта - ООПАноним31/03/16 Чтв 20:28:38#1004№704373
Число 40 там повторяется много раз, вынеси его в константу класса.
> function getNormalSalary($normalHours, $rate) Это должно быть методом класса. Идея ООП в том что мы в классе заключаем, инкапсулируем данные и методы для работы с ними. Объект это такая самостоятельная часть программы, которая умеет что-то делать сама по себе. Нет причин выносить этот метод из класса.
> function padRight($x, $y){ Слишком сложно, тут хватит mb_strlen и str_repeat.
> // Цикл для удаления части имени работника Это должно быть сделано методом в классе
> $employee->name = preg_replace('/( )([А-ЯЁ])([а-яё]+)/u', ' $2.', $employee->name); Ты безвозвратно перезаписываешь полное имя. Как его достать обратно? Менять поле name можно только в случае если работник поменял свое имя.
> for ($i = 0; $i < count($allHours); $i++) { тут нужен foreach
> Но правильно ли я вообще сделал, что некоторые функции определил вне класса? По ООП ли это? В данном случае нет так как функции явно должны быть внутри класса, они работают только с хранящимися в нем данными.
Это не чат! Пожалуйста не флудите, а старайтесь постить только вопросы, решения и ответы. Сколько лет вы не можете найти работу никому не интересно. Высказывайтесь одним большим постом а не цепочкой мелких
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: (1000 постов!)
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в 2-3 дня, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
- Для начала установи Апач + PHP (советы ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Yii2: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование
- Если ты все решил, переходи к Symfony 2/Doctrine 2
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863
Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.