Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.
Это не чат! Высказывайтесь одним большим постом, а не цепочкой мелких
Это тред для начинающих. Не написал за свою жизнь ни одной программы и имеешь тройку по математике? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост, прежде чем писать код).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.
Надо переходить к более серьезным задачкам, которые научат тебя всему этому.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Платиновые вопросы
- Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко. - Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета) - Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery - Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев - Посоветуйте редактор кода - Sublime Text 3, Notepad++, PhpStorm - Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию. - Что самое главное для программиста? Умение аккуратно оформлять код. - ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет. - Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Не забывай оформлять кодАноним30/09/16 Птн 14:47:22#2№848552
Так. Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на 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, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Братишки, анончики, нужен учебник или годнота по работе с PDO. Где такой достать, дайте линк. В мануале пхп ничего не понятно, сложно и ничего не работает
>>848990 ОП её забракует (не без оснований), но таки рекомендую её прочитать, так как на работе всё равно будешь поддерживать легаси и знать как делали диды тоже иногда полезно. Не то, чтобы книга ужасно устарела, но знать оттуда ты должен всё.
>>848830 Никаких книг по работе с PDO нет и не будет, так как писать там по сути нечего. Читай о PDO на phptherightway, потом опять попробуй мануал.
> ничего не работает Вот ты бы лучше описал что конкретно не работает. И тебе тяжело придётся на работе, если не можешь в документацию и нуждаешься в разжёвываниях даже для таких простых в использовании вещей как PDO.
>>849191 В твоём случае это значит, что метод должен возвращать тип данных User. Подробнее: https://wiki.php.net/rfc/return_types Доступно только в PHP 7+ Поищи ещё статьи на хабре по особенностям PHP 7.
Как выкидывать стандартную страницу 404 понял, спасибо.
Теперь вопрос. На стандартной странице всё по английски, а я хочу сделать свою, на русском. Нашел, где прописан body: https://github.com/slimphp/Slim/blob/3.x/Slim/Handlers/NotFound.php Но не знаю, как реализовать по уму. В голову пришли такие идеи: Сделать свой class NotFoundRus extends AbstractHandler Сделать клон NotFound и там переопределить renderHtmlNotFoundOutput()
А есть примеры удачного выполнения задачи о студентах? Я, конечно, вижу на Гитхабе, но так как плохо шарю, не могу точно понять, насколько все грамотно
Они питушатся со своим ебанутым языком с хуилионом ньюансови псевто технологий. А еще дохуя хепсторов "дай-ка я напишу свою книгу", которые просто копируют(хуево) профи или друг-друга.
>>848550 (OP) ребята, объсните пожалуйста почему, не смотря на то, что строка кода, которая создает файл тест.тхт, заключена в условие, файл создается даже если переменная $t1(textarea в форме) не заполнена и не нажата кнопка сабмит? Насколько я понимаю скрипт же должен работать при isset != null?
Сап, аноны, совсем новый нюфаг имеет проблему здесь. Как мне наблюдать результат своего кода сразу же? Вот есть файл .php с кодом <?php echo "Hello world!"; ?> Но если я его открываю хромом, то вижу сам код, а не результат работы скрипта, Что за херня? Установил xampp последний, который с поддержкой пхп7, сам файл лежит в папке C:\xampp\htdocs то есть всё по мануалу, что я бля не так делаю?
>>848990 О, анон, я тоже по ней заниматься начал как раз. Ты смог открыть тот сайт с примерами lpmj.net который? У меня почему-то не открывается.
>>849415 Не, анон, я не настолько тупой. Есть подозрение что я накосячил с установкой xampp, но вроде там всё отмечено было как надо. Короче хз. Хотел с опреаторами повозиться, всякие уравненьица порешать, а тут такая засада, аж руки опустились.
О бля, допёр!!! Надо просто не файл хромом открывать, а запускать его в хроме через строку командой localhost/file.php Бля, я молодец, что сам разобрался, правда, аноны?
>>849514 Ок, спасибо, гляну. >>849543 Ой бля, да просто иди нахуй, ты родился прям неебаться программистом, да? >>849548 Понял, тоже так собираюсь делать.
Раньше у меня перенаправление было прямо в этом js файле, но это не правильно, логику в роутере не видно и потом хер проссыш где это перенаправление находится.
Предполагаю, что надо как-то в onUploadSuccess() сделать выход из div'a и тогда перенаправление может заработать. Хотя ведь сначала выполняется весь код в роутере, а только потом в onUploadSuccess(). В общем, need help
>>849708 Я так понимаю, ты решаешь задачу про банк. Ты в 16 лет ложишь в банк 10000, но говоришь нам об этом в свой следующий день рождения, когда тебе уже 17.
Алсо, подумай, что станет с твоим скриптом, если $q при вычислении будет ровно 100000
>>849708 > как теперь сделать, чтобы он начинал с 1 года и 16 лет, а не со 2 и 17? Не могу додуматься. Тоесть ты делаешь сначала 16+1, а потом спрашиваешь вопрос почему получилось 17?
Такое дело, джва года назад с вами писал функцию перевода чисел в цифры. Сейчас по работе нужна такая для составления договоров, что бы подставлять прописью бабло в скобочки по типу: 3500$ (Три тысячи пятьсот долларов США)
В общем скиньте у кого остался хороший код полностью протестированный?
>>849807 PSR-IndiaStyle switch ($i) { case 3499: echo "Три тысячи четыреста девяносто девять долларов"; break; case 3500: echo "Три тысячи пятьсот долларов"; break; case 3501: echo "Три тысячи пятьсот один доллар"; break; case 3502: echo "Три тысячи пятьсот два доллара"; break; case 3503: echo "Три тысячи пятьсот три доллара"; break; case 3504: echo "Три тысячи пятьсот четыре доллара"; break; }
У меня тут вопрос. Решил углубиться в php и сайтонаписание. Для выполнения задач в ОП-посте Денвер пойдёт или же придётся устанавливать php, Апач и mysql вручную?
1) Такой вопрос: если я получаю (к примеру, парсингом) временную отметку вида "06 июнь 2016 ..." и хочу сохранить это в БД, то как сделать это правильнее всего? Я делаю так: - в строке с временной отметкой заменяю название месяца на английское - создаю $datetime = \DateTime::createFromFormat('d M Y ...', '06 June 2016 ...') - В базу сохраняю уже $datetime->format(\DateTime::ATOM) Может как-то попроще сделать? В гугле советуют трюки с изменением локали, это хорошая практика? Использую MySQL, PDO (пишу SQL-запросы руками).
2) ОП, можешь, пожалуйста, squash'ить коммиты? Или подсказать, как читать diff'ы разных коммитов как один diff? Сейчас приходится все 5 коммитов по отдельности открывать (пик). Спасибо за полезные обновления!
> он перенаправляет, но внутри div'а Скорее всего скрипт закачки создает ифрейм и постит форму с файлом в него, а ифрейм это считай как отдельная вкладка встроенная в страницу.
Ты должен снаружи ифрейма получать событие завершения закачки и яваскриптом делать переход на нужную страницу. посмотри документацию к библиотеке.
Алсо способ это древний, в новых браузерах файлы можно отправлять аякс-запросом и тогда можно ссылку получить в ответе на этот запрос.
Редирект на сервере работал бы только в случае обычной отпарвки формы, а не через ифрейм или аякс.
В случе с ифреймом делали так: выводили туда скрипт вроде
window.parent.callSoeFunction('data')
Но это конечно довльно костыльно. Главная проблема ифрейма в том, что там неудобно отслеживать ошибку при загрузке (а у тебя кстати это обнаруживается?)
я бы советовал в новых браузерах слать аяксом, а старых - обычной отправкой формы с редиректом.
В общем тебе надо изучить что такое ифреймы, с точки зрения как они работают, а также яваскриптовые АПИ к ним (parent, frames, contentWindow, contentDocument). И также same origin policy.
Но ифреймы это старый способ отправить форму без аякса и без перезагрузки страницы. У него есть свои недостатки.
Что скажите за курсы "Специалиста"? Пока посмотрел одну лекцию и идет очень просто, думаю что стоит параллельно решать задачки ОП'а. А, и ещё, я очень тупой.
Старые ответы в старом тредеАноним03/10/16 Пнд 17:45:11#70№850083
Напомню что в старом треде >>825576 (OP) потихоньку появляются ответы на старые вопросы. Если вы в сентябре постили задачку или вопрос - гляньте, может на него дали ответ. Вот например:
>>850101 Расскажи поподробнее, интересно послушать как устроен твой день в итоге. Сколько по факту часов приходится работать вместо 8?
>>849812 Я гуглил, нагуглил вроде бы две вменяемых функции со хабры и ру_стаковерфло. Но сразу же задетектил ошибку в одной, прогоняя в ней числа кратные 100, хотя там блядь гора лайков у неё. Жалею теперь что свою не схоронил.
>>850116 Встаю где то часов в 8-9, занимаюсь своими делами, график занятости у меня на текущей момент 7 дней рабочих, 2 выходных Начинаю с 10-11 работать, все зависит от задач, которые решаю, если легкие, то обычно 3-4 часа уходит в день на работу, если задача тяжелая, обьемная, могу делать целый день и чуть дорабатывать на следующий. Сейчас обычно несколько задач на день выходит. Рабочий график с 10 утра до 22 вечера. В среднем 5-6 часов, где то доходило и до 8-9 часов за день. Оплата каждые 7 дней, 2 выходных
>>850123 То есть у тебя неделя как бы 9 дней, и при этом тебе платят именно за часы? То есть если поработал 4 часа, то и платят 3 бакса за этот день? А если 10, то и 7 уже? Это по вашим меркам вообще норм?
>>850134 Неделя у меня 7 дней По оплате вообще так, но я же говорю, на начальном этапе, в дальнейшем буду повышать ставку. За неделю выходит где то баксов 30
Надо повышать свой уровень, чтобы переходить от простых, но времязатратных задач к сложным. Тогда и оплата будет выше.
Если ты делаешь работу с которой каждый второй школьник справится, то да, условия будут не очень выгодные.
Для этого надо выделять время на самообразование.
То есть учить MVC, ООП, фреймворки (Symfony например), HTML/CSS/JS до нормального уровня, SQL в детялях и оптимизацию запросов. Автоматизированное тестирование. Алгоритмы.
Читай также хабр для развития кругозора.
С такими знаниями я думаю будут и варианты удаленки, и оффлайновой работы.
Вот у нас есть задача про тестхаб (в ОП посте) - ты можешь ее сделать? Предыдущие, про файлообменник или студентов - можешь?
>>850140 820 в месяц стоит, жить если то только недолго, если дольше, то поедешь от постоянного количества людей вокруг, я то уже привык. Все есть, душ общий, жильцы разные есть, кто то бухает постоянно, кто то спокойно себе живет. Но лучше жить тогда уж в комнате, хотя я хз
>>850143 Нуу, я занимался месяца 4 CRM-системой волонтерской, со всеми задачами справлялся, простыми и сложными и ей сейчас успешно пользуется не одна сотня людей Файлообменник и студентов могу, а тестхаб не смотрел еще, что за задача
>>849856 > Скорее всего скрипт закачки создает ифрейм Если в моём проекте не встречается в поиске слово iframe, значит ли, что я могу с увереностью утверждать, что он не используется?
Можно открыть отладчик в браузере (Ctrl + SHift + I) и им посмотреть, и есть ли там ифрейм, и что куда отправляется, и даже яваскрипт по шагам отладить.
>>848550 (OP) Друзья, такой вопрос: пишу в пхпшторме простой скрипт. Запускаю на опенсервере - кириллицу отображает без проблем. Но стоит мне прочитать строку русского текста из txt файла - выводятся черные ромбики со знаками вопроса внутри. Уже пробовал менять кодировку файла в notepad++ на utf(без BOM) и в .htaccess сетил дефолтную кодировку utf-8 короче перепробовал весь гугл. Подскажите что это и как с этим справиться
>>850289 Проверь через отладчик браузера с какой кодировкой тебе отдает сервер, .htaccess не всегда подхватывает кодировку, наверное лучше её устанавливать через мета-тег или заголовок.
Господа, я пару месяцев как пытаюсь вкатиться, ковыряю потихоньку html+css (прошел курсы на htmlacademy) и php с mysql. Нашел у себя в мухосрани вакансию php-стажера, написал им чтобы просто узнать какие требования, а мне предложили сразу сделать тестовое задание. И вот я потею и гуглю как чумачечий, хотя задания, как я понимаю, на полчаса более-менее разбирающемуся человеку. Понимаю что тяну еле-еле, если вообще тяну, но мб в коллективе и с заданиями прогресс пойдет быстрее. В общем суть вопроса: мне заливать свои поделия на github или куда, чтоб показать свои корчи и не опозориться отправкой txt файликов? Как они там отнесутся если я попрошу еще времени, а то с дуру ляпнул что сделаю завтра (уже сегодня) к вечеру, а там вопросики по всему:html,css,php,sql,js. И посмотрите тестовое задание, пожалуйста: https://github.com/Daikon5/test-php/blob/master/1/test.php
>>850378 И еще: хотя к комментариям у разных людей отношение разное, но коммент к каждой строчке - это явное излишество. Особенно что то вроде этого: $max = 999; // максимальное число
Комментарии нужны, но это не должны быть комментарии капитана очевидность, то есть не надо пересказывать учебник по php и объяснять что делает строчка.
> $random = rand($min, $max); // генерим случайное число Это не нужно так как зачем нужна функция можно прочесть в мануале.
> $max = 10000; // максимальное число Это допустимо, но лучше называть переменные так чтобы комментарий даже не требовался.
Надо объяснять, почему ты сделал так или иначе, зачем нужна эта функция, какой используется алгоритм итд.
Также, советую оформить код в соответствие с PSR. Например имена переменных не пишут с большой буквы.
Также, написать пару строчек в ридми так как человек который откроет твой гитхаб, первым делом его увидит.
Сам код не комментирую так как задача проверяет твои знания, а не наши.
Если ты захочешь лучше изучить php/html/js/sql, у нас есть задачи по ним в ОП посте.
Анончики, ходил на собеседование стажировка, дали мне тест, там были вопрос про php html css js sql
Про пхп htmk css ответил где-то половину, sql написал базовый селект, по js вообще ничего, кароч пиздец.
Мне чувак сказал, что хоть я и хуево ответил но тип норм, что я же на стажировку претендую.
Потом спрашивали про то сколько я программирую, сказал, что год. Мне сказали, что я поздно начал и все такое, но тип ничего страшного опять же.
Спросили про зарплату какую ожидаю, сказал средне-маленькую сумму. Спрашивали не сьебу ли я от них после того как они меня обучат, я сказал что нет, что планирую оставаться в этом мухосранске, они сказали, что все так говорят и спросили "Что тебя здесь держит?" и тут я обосрался опять и начал мямлить.
Спрашивали когда я свободен и когда могу приходить и все такое.
Сказали, что позвонят на этой неделе точно.
Как думаете, аноны? Меня возьмут? Почему мне дали какие-то ебучие тесты с вопросами аля
Чему равно $a? $a = false ?? 10 ?? 20
Понятно, что стажер не шарит в таких конструкциях да и нахуй они не нужны, про ООП вообще 0 вопросов
>>850463 >я поздно начал и все такое, но тип ничего страшного опять же. Не волнуйся насчёт этог бро. Сам боялся адово когда такие истории ходили. Сейчас понимаю что вкатываться после 27 - это норма. Просто много кому нужен именно молодой, именно из-зи низких зарплат. Мол студента наймём, он будет нам за 200$ сайтики пилить и норм.
мне 22 вообще-то, они сказали "обычно студенты учатся с первого курса и к концу учебы уже умные, а ты начал год назад и учебу уже заканчиваешь и немного поздно но ничего страшного"
>>850479 Мне вообще 32, образование и работа никак не связаны с программированием, а я мечтаю о собственном проекте в Интернете и иду к нему уже второй год.
>>850373 Некоторые сайты проводят розыгрыши призов среди своих подпсичиков. Предположим у нас есть id 1000 пользователей (вам нужно сгенерировать их самостоятельно). Призов разыгрывается только 50. Выберите этих 50 счастливчиков случайным образом (естественно, один подарок - в одни руки)
Это задание на стажёра, серьёзно? Или ещё что-то есть?
>>850341 Чот толи я туплю, толи PHPstorm. Поигрался немного, отредактировал 4 строки кода и прекрасно закомитил. Затем изменил код ещё в 20 файлах, решил несколько задачек, и коммитить не получается, говорит пикчу. Что я делаю не так?
>>850506 Возможно что файлы, в которые ты вносил изменения, не добавлены в VCS. У тебя гит? В идее можно сделать alt+9 -> Local Changes -> Unversioned files и посмотреть, что не добавлено в гит. Там же и изменения лежат.
Я бы не очень расчитывал на "обучение". Цель компании зарабатывать деньги, так что думаю что если они тебя и обучат, то только каким-то простым вещам, которые им нужны. Если ты сам будешь учиться по 8 часов в день дома, то ты гораздо больше выучишь.
Я думаю что простое. Я не уверен, но думаю, что его легко решат аноны которые прошли первые 4-5 уроков в моем учебнике. То есть которые 2 недели назад учиться начали.
В гите по моему прежде чем коммитить, надо "добавить" файлы (точнее изменения в них) в "индекс" (то есть в будущий коммит).
В командной строке проверить можно командой git status, в IDE - не знаю, как.
Клиент гита в IDE - не для начинающих, а для опытных пользователей. Если ты начинающий, то ты должен открыть git book, зайти в командную строку и писать все команды вручную. И только когда ты все это изучишь, переходить к клиенту в IDE. Тогда бы ты такие вопросы и не задавал.
Мое мнение - я бы тех, кто не умеет пользоваться git в командной строке считал не умеющими пользоваться гитом вообще. Кнопки нажимать по видеоурокам много ума ведь не надо, но это тебе не поможет когда что-то пойдет не так. А поможет знание того, как устроен и работает гит.
>>850561 >Клиент гита в IDE - не для начинающих, а для опытных пользователей. Если ты начинающий, то ты должен открыть git book, зайти в командную строку и писать все команды вручную. И только когда ты все это изучишь, переходить к клиенту в IDE. Тогда бы ты такие вопросы и не задавал. Не согласен. Проще сначала научиться с ним работать в IDE(или любой гуй), а потом лезть в кишки. Добавлять файлы в консоли - боль.
>А поможет знание того, как устроен и работает гит. А поможет гугл и тот же самый git book. Знания надо получать по мере необходимости, имо.
>>849318 >>849860 Да вообще, вроде задания норм выполнял, ну в процедурном стиле, конечно, да и не в ООП легко могу такое написать (студентом), но это все бесполезно, конечно. Именно в ОО анализе и проектирование трудности испытываю: какие классы должны быть, как взаимодействовать им, нужен ли отдельный класс для сессий/куки или это будет заложено в методах класса авторизации. Про паттерны читал, вроде понятно, но как самому делать, так сразу куча вопросов, сомнений и неясность
В чем боль? Одна команда. У тебя по моему просто боязнь консоли, и это плохо (и кстати у нас в ОП посте есть небольшой гайд по консоли).
Просто ты по факту не хочешь изучить даже основы гита, а хочеь их проскочить, и это приведет к тому что ты например потом не сможешь разобраться с конфликтами или мерджами или еще чем-то.
> Знания надо получать по мере необходимости, имо. Если тебе нужно решить какую-то сложную систему уравнений то конечно лучше нагуглить решение. Но основы вроде сложения, умножения или правил преобразования выражений надо выучить заранее.
1) это мало когда нужно 2) если все же нужно, добавить несколько файлов не так и трудно.
Ну и ты привел пример ситуации явно не для начинащего. Я сколько лет пользуюсь системами контроля версий и не припомню чтобы мне это было нужно (скорее всего в твоей ситуации могли бы помочь ветки).
Паттерны сами по себе не понять. Надо смотреть код который их исопльзует (например поковырять исходники Симфони), а также понимать почему они тут исопльзованы.
Люди, которые не поняли паттерны, а просто заучили их определения, используют их не к месту и только усложняют код.
Насчет ООП такая вещь: надо решать задачки на ООП (задачки вроде смоделируйте что-нибудь в виде классов), а также смотреть готовый код. В случае с вебом, все давно уже придумано и надо просто смотреть как то или иное сделано например в симфони.
> какие классы должны быть, как взаимодействовать им, Ну главный принцип что у каждого класса своя зона ответвенности, своя задача. В веб-приложениях это обычно: контроллеры, модели, формы, классы работы с БД, сервисы.
Разбивать код на классы надо для того, чтобы класс можно было рассматривать отдельно от остального кода. Так как кода обычно много и без разделения на классы в нем легко запутаться. Это в задаче про студентов у нас обычно 5-15 классов, а в реальных приложениях их будут сотни и тысячи, а строк будут десятки и стони тысяч. И без четкого разделения на модули разобраться там будет нереально. Именно потому ООП с 80-х годов активно используется в коммерческой разработке - как только компьютеры стали мощнее, программы стали больше и понадобился способ разбивать их на отдельные части.
Надо найти золотую середину между "весь код в одном большом классе" и "куча маленьких классов из 1 функции".
Если ты делаешь какую-то из наших задач и затрудняешься с проектированием классов, ты можешь придумать схему, вбросить в тред и попросить советов. Сам код не нужен, для начала можно просто описать какие есть классы, за что каждый отвечает и какие у них публичные методы, вроде такого:
class IndexController { function showPageAction(); }
class Student { public $name; public $surname; ... } class StudentTableGateway { public function getStudentById($id): Student public function addStudent(Student) ... }
То есть чтобы из схемы было видно что куда передается и за что отвечает. Если ты напишешь такую схему, я или кто-то еще сможет посмотреть и дать советы.
Хорошая идея в ООП начинать именно с такой схемы. Не спеши писать код. Для начала:
- реши, за что отвечает класс и выбери название класса - реши, что он должен делать, и напиши методы, опиши что они получают и возвращают - реши что классу нужно для работы и напиши конструктор (к примеру: классу StudentTableGateway нужен объект PDO потому мы передадим его в конструктор) - затем реши как классы взаимодействуют друг с другом (например: контроллер вызывает валидатор чтобы проверить правильно ли введена информация для регистрации студента)
По такой схеме уже можно судить о том, правильно ли спроектированы классы или нет. Видеть код для этого не требуется.
Там еще есть специальные языки (вроде UML), чтобы рисовать диаграммы классов, но я думаю, написать текстом может быть проще. Хотя если тебе хочется изучить UML, почему бы и нет.
>>850627 >У тебя по моему просто боязнь консоли, и это плохо Нет, у меня все хорошо с консолью и я осознаю, что консольный гит - потеря времени. Хотя иногда приходится залазить и в это, да.
>потом не сможешь разобраться с конфликтами или мерджами или еще чем-то. Вот именно потому и не хочу. Конфликты при мерже в консоли - беда, а в иде/гуе для гита - все приятно и понятно. Зачем тратить больше усилий, если можно достичь того же результата, но с удобством?
>Если тебе нужно решить какую-то сложную систему уравнений то конечно лучше нагуглить решение. Но основы вроде сложения, умножения или правил преобразования выражений надо выучить заранее. Гит - это не основа. Гит - это вспомогательные технологии. Он вообще прямо к программированию не относится. Да и осваивается на раз-два, если его не бояться.
>Ну и ты привел пример ситуации явно не для начинащего. Я сколько лет пользуюсь системами контроля версий и не припомню чтобы мне это было нужно (скорее всего в твоей ситуации могли бы помочь ветки). Ну как. Делаешь свой сервис, по пути какой-то мелкий баг фиксанул в чужом и сразу закоммитил-отправил. Вполне себе обыкновенная ситуация. >2) если все же нужно, добавить несколько файлов не так и трудно. Опять же: зачем пердолиться в консоли, если можно не пердолиться в консоли? Особенно если работаешь на винде.
>Насчет ООП такая вещь Мне кажется, что у всех проблема с объяснением применения ооп. Лучше пояснить за архитектуру приложения: слой доступа к данным, слой сервисов, туда-сюда, чем играться с кошками-мышками. Потому все и боятся ооп, что не понимают профитов от него. Оно и ясно: как понять профиты, когда все примеры про бургеры, а в реальном приложении у тебя ехал абстракт дао через сервис контроллером погоняя.
>>850708 Не ОП. Мне кажется, что ты объясняешь ООП для будущих слесарей, которым нужно просто стоять возле станка всю жизнь, а если возникнет необходимость в другом станке, то переучиваться такие слесари будут со скрипом, ввиду непонимания базовых концепций работы станков. Что по моему мнению "базовые концепции" в ООП? - Разделение ответственности, самая главная концепция, придерживаясь которой можно писать хороший код и без шаблонов из GoF; - Инкапсуляция - возможность выставить наружу лишь интерфейс, а детали реализации скрыть; - Слабая связанность; Как результат этих трёх пунктов - легко тестируемый код. И таки после бургеров и кошек-мышек понимать ООП гораздо проще. Вот у меня есть знакомый Yii/CodeIgniter-разраб с 3-х летним опытом, хорошо оплачиваемый, не знает про DI и держит логику в контроллерах, от Symfony плюётся (для него слишком сложно). Очевидно, что человек сел за фреймворки раньше, чем за основательное изучение ООП. Хотя здесь можно поднять вопрос, кто важнее работодателю, человек-практик, который умеет быстро совладать разными с API, не вникая в механизмы их функционирования, или человек с фундаментом, но который привык основательно во всём разбираться, соответственно затрачивая больше времени на выполнение работы.
Поизучав код, решил что всё-таки делать перенаправдение в settings.js - это нормально. По сути, его задача и есть сконфигурировать, как будет работать скрипт автозагрузчика при той или иной ситуации.
Почему перенаправление происходило в div - тоже разобрался. Там строчка в settings.js в onUploadSuccess: add_log('Server Response for file #' + id + ': ' + JSON.stringify(data));
Так вот эта data хранит содержимое return'a, а у меня там рендер страницы был.
В итоге return'ится у меня теперь строка (Success/Failed), а перенаправление в конфиге скрипта
Вопрос: актуально ли сейчас делать два загрузчика, один на js, другой стандартный? На случай, если в каком-то браузере будет отключён JS (и прописывать его в <noscript>)
>>850742 Ну я собственно о том же. Расслоение приложения, пояснение почему это хорошо и все такое - это как раз таки все те вещи, что ты указал, только на живых примерах. И да, я бы пояснял как слесарям. Но в случае программирования станок=стек, вот и всё. А твой знакомый - просто лентяй и пхп макака, без обид.
>Хотя здесь можно поднять вопрос, кто важнее работодателю, человек-практик, который умеет быстро совладать разными с API, не вникая в механизмы их функционирования, или человек с фундаментом, но который привык основательно во всём разбираться, соответственно затрачивая больше времени на выполнение работы. Важнее тот, кто делает свою работу. Быстро, качественно. Если ты основательно будешь разбираться в типовом приложении пару месяцев - то нафиг ты такой нужен?
Ну у меня сложилось ощущение что ты не понимаешь гит. Консоль хороша тем что это самый прямой интерфейс к гиту без лишних посредников. ты например можешь сделать git status и увидеть текущее состояние рабочей области. Соответственно если ты понимаешь как гит работает, консоль не представляет никакой сложности так как там ты отдаешь нужные команды напрямую.
А чтобы работать с гитом в IDE тебе надо знать и сам гит, и особенности реализации интерфейса к нему, что за каким пунктом спрятано. Я не понимаю, как это "проще". Изучать же больше приходится.
Я бы не сказал что он такой простой и понятный. Без понимания гита понять то, что там написано, нельзя.
У меня есть ощущение что некоторые люди вместо изучения принципов работы гита смотрят видеоурок и запоминают, какой пункт в меню надо нажать. И потому им кажется что это "проще" чем непонятная консоль без кнопок и менюшек. И что в графическом интерфейсе можно разобраться интуитивно без чтения мануалов. Но факт в том что они лишь научились повторять действия в видео, а сам гит так и не изучили. И статью выше про ветки они вряд ли осилят.
От таких людей в команде проблемы. Они избегают веток, мерджей, тем более конфликтов (и например предпочитают вместо этого вручную копировать файлы) и это влияет и на их производительность, и способность разбираться в сложных ситуациях. Или они могут закоммитить что-то лишнее, так как не очень понимают, что происходит. Не умеют сравнить разные ветки и увидеть кто, что и где поменял.
Чтобы участвовать в командной разработке, надо полноценно владеть гитом. И чтобы пользоваться гитом в IDE, надо все равно его изучить сначала на примере командной строки.
Конфликты руками я не предлагаю разрешать, удобнее конечно использовать GUI программу для просмотра и выбора изменений. Но опять же, человек, не знающий гит, в ней не разберется.
> Ну как. Делаешь свой сервис, по пути какой-то мелкий баг фиксанул в чужом и сразу закоммитил-отправил. Вполне себе обыкновенная ситуация. Если это разные репозитории то проблем никаких нет и нет нужды коммитить только часть файлов. Гит-репозитории можно вкладывать друг в друга и все должно корректно работать.
> Опять же: зачем пердолиться в консоли, Это надо делать на этапе изучения гита чтобы работать с гитом напрямую, не изучая как представляет информацию из гита GUI. Если ты уже изучил гит то это не требуется. Но проблема в том, что люди просто не хотят изучать гит и думают что раз там GUI, то можно разобраться "интуитивно". Будь моя воля, я бы таких отправлял учиться прежде чем приступать к работе (но тут встает другая проблема, с нынешним качеством разработчиков придется кучу кандидатов отсеять. Мы все-таки должны решать задачи бизнеса, и не знающий гита разработчик решает их лучше, чем отсутствующий разработчик).
> Лучше пояснить за архитектуру приложения: слой доступа к данным, слой сервисов, туда-сюда, чем играться с кошками-мышками. Сначала надо научиться создавать и работать с объектами, а потом к слоям переходить. И кошки-мышки тут хорошо подходят, так как сразу не очевидно как там правильно код разбить на классы.
А перейти от класса-кошки к модели или сервису не так и сложно. По идее этим люди занимаются в задаче про студентов.
В программировании подход "смотри как делают другие и делай так же" не работает. И "объяснения для слесарей" тоже.
В твоем списке концепций, к сожалению, много непонятных для начинающего слов. И я не думаю что цель ООП в первую очередь в тестировании кода, а в разделении на слабосвязанные части, которые можно читать/править независимо от других, что позволяет бороться со сложностью в большиз программах.
Знакомый твой (судя по описанию) ООП не знает, а только умеет писать классы "по аналогии".
Я думаю с сервера надо возвращать id или ссылку на файл, а то как ты сделаешь перенаправление на нужную страницу?
> Вопрос: актуально ли сейчас делать два загрузчика, один на js, другой стандартный? На случай, если в каком-то браузере будет отключён JS (и прописывать его в <noscript>) Как начинающему, да, надо бы сделать. Во-первых, во время обучения надо ставить себе задачи сложнее, а не проще, во-вторых, безяваскриптовый код поможет тебе если например в JS будет ошибка.
noscript там не нужен, надо просто при отсутствии JS/отсутствии в браузере нужных фич отправлять обычную форму с файлом. Ну например, можно показывать обычный файловый инпут в таком случае. А при наличии поддержки - превращать этот инпут в поверхность для приема перетаскиваемых файлов и кнопку выбора файла.
2 загрузчика не нужны, я думаю, что можно серверный скрипт написать так, чтобы он принимал и обычные, и аякс загрузки. Тут вообще много усилий для фоллбека на обычную загрузку, на мой взгляд, не требуется.
Не используй билиотеку как черный ящик. Ты должен понимать как она устроена внутри и какие принципы использует. И соответственно, какие особенности и ограничения из этого вытекают. Какие браузеры и в каких условиях поддерживаются. И ты должен уметь при необходимости уметь разобарться в ее коде, чтобы найти причину бага, или способ как-то нестандартно ее подключить.
Соответственно, если например что-то не работает и файл не загружается - ты должен знать все нужные инструменты и способы для поиска причин проблемы. Не менять опции наугад.
Чтобы скрипт скопировать с гитхаба - ума много не надо, этим пусть верстальщики занимаются, а программист должен знать больше.
Я думаю что работодателю больше всего бы понравится человек, который основательно во всем разбирается, но в нерабочее время. У многих анонов все равно пока работы нет - пользуйтесь возможностью.
>>850791 > noscript там не нужен, надо просто при отсутствии JS/отсутствии в браузере нужных фич отправлять обычную форму с файлом. Ну например, можно показывать обычный файловый инпут в таком случае. А при наличии поддержки - превращать этот инпут в поверхность для приема перетаскиваемых файлов и кнопку выбора файла.
А как проверить отсутствие JS, кроме как не noscript'ом?
Мне нужно, чтобы с другого домена по нажатию на кнопку выдавалось окно с данными с моего сайта на моем домене, на моем сайте стоит авторизация и никуда без неё не сунуться. База данных лежит на моем домене и доступ к ней есть только у моего сайта, но логины пользователей и их пароли одинаковы в обоих дб, то есть можно использовать любой работающий логин от сайта на другом домене для авторизации на моем. Какая штука может такое организовать?
>>851335 >$random = array_rand($word1); >$randomText = $word1[$random]; >$a[] = $randomText; И эта копипаста повторяется раз шесть, Карл! И тут лишнее телодвижение: >$random = array_rand($word1); >$a[] = $word1[$random]; Используй цикл, тут иначе и нельзя, ведь задача на закрепление циклов. Всё то, что отличается лишь цифрами на концах переменных, может быть помещено в цикл, в котором при итерации будет изменяться $i, подставляясь в нужные места.
Можно ли запомнить весь код одного из современных фреймворков? Или понять и запомнить принципы построения всей системы? Насколько это возможно для средне-статистического программиста? Что если тимлиды и сеньоры обладают не тривиальными способностями, вроде феноменальной памяти или интеллекта в целом (лучше чем в среднем по профессии)? Т.е. человеку со средними способностями никогда (оче сложно) не стать хорошим (высоко-оплачиваемым и востребованным) программистом? Т.е. помимо навыков программирования нужно выкачивать память, например просто зазубривая синтаксис или справочники. Развивать интеллект, решая олимпиадные задачи. А также тренировать устную и письменную речь. В течение всего срока работы в профессии, т.к. уровня коллег, которые делали это с детства, никогда не достичь, но можно только приблизиться.
>>851463 >Можно ли запомнить весь код одного из современных фреймворков? Да. >Или понять и запомнить принципы построения всей системы? Да. >Насколько это возможно для средне-статистического программиста? Дело в том, что никто этого не делает. Есть задача, есть фрэймворк. Берёшь и ищешь как решить задачу. Ты не учишь весь фрэймворк. Ты даже для задачи ничего не учишь. Сделал, забыл, надо снова - вспоминай. Сейчас фрэймворков очень много, трабования к программисту - вагон. Запоминать всё не нудно и физзически невозможно. Но этого и не требуется!
Аноны, мне 23 и я никогда не работал по спецухе, уже год учу веб стек, хуево, лениво и как-то еще дохуя чего не умею и кажется, что все что я знаю можно было выучить за 3-4 месяца интенсивного обучения.
В общем, я начал проситься в кому-то на стажировку и мне предложили бесплатный стаж 3 месяца, меня будут обучать, а потом возьмут на работу.
В принципе угнетает, то, что придется работать бесплатно и юзают не популярные фреймворки, так еще и в жопе находятся, но есть один плюс, что у них, вроде как, интересные проекты есть и фирма довольно таки популярная, на практику буду устроен официально.
Зазубривать не надо. Надо разобраться, по каким принципам он построен, почему сделано так, какая архитектура. Чтобы понимать, что с ним можно сделать, а что нет.
Если ты понимаешь ООП и архитектуру то и сам при желании сможешь написать что то похожее. Если нет - сиди, ковыряй, изучай, рисуй схемы и связи классов. Со временем, я думаю, разберешься. Если что-то будет непонятно - задавай вопросы.
>>851878 >Там в принципе убирать особо нечего, только запутаннее будет. Ну вот так можно: http://ideone.com/zzIp8I Я немного увяз в фреймворке, кажется, стал забывать.
>>851882 да не буду я, блять, учиться по 8 часов, даже если себя заставлю, мой мозг расплавится просто от такой нагрузки, имеется ввиду именно продуктивное обучение, а не когда ты через силу и лень сидишь все время
>>851882 Никто никогда 8 часов не высидит. 3-4 часа, да и то если есть знания и просто реализуешь что нужно, а не бьешься башкой об стену, стараясь вникнуть в какую-нибудь хуйню.
Няши, а можно через PHPstorm сразу код размещать на своём хостинге? А то, чот ftp соединение каждый раз создавать не очень. Было-бы круто по нажатию сочетания клавишь обновить функционал например.
>>852005 есть такое , но оно всё равно синхит по фтп или сфтп , проще написать скрипт который будет тянуть каждые 15 мин git pull на сервере , а с пеки будешь делать пуши
>>852007 Погоди, погоди. Синхить по фтп или сфтп - не проблема. Проблема именно в том, что надо эти фтп вручную подключать. Было бы прекрасно делать это прямо из PHPstorm... >написать скрипт который будет тянуть каждые 15 мин git pull на сервере git pull можно настроить на ftp? Елси да, бугу в этом направлении идти.
>>852053 А что, сложного? Написал простенькую страничку с кнопочками (Начал кодить, закончил кодить). Ну и статистику прикрутил. Всё это на MySQL крутится. Просто, зато функционально. Очень хорошо показывает сколько времени я груши околачиваю.
>>852054 >А что, сложного? Зарыдал в голос с тебя... (То есть там у тебя что-то вроде блокнота, куда сам записываешь, сколько времени на что потратил?)
>>852056 >Задачка про доллары Хорошо. >//(если одинаковая — победила дружба) >elseif ($sumManThrow = $sumAIThrow) Что означает один символ равенства, и сколько символов равенства должно быть, когда нужно сравнить одну переменную с другой? >Миллион в банке >строки с конкатенацией Ну, вроде не новичок, хорошо. >Школьник и кредит на айфон >$worthMoney= $worthMoney+$mounthlyPayment; Вот это повторяется, можно избежать. А так задача решена верно. >функция округления Не новичок не палится! Хорошо, молодая кровь.
>>852057 >Что означает один символ равенства, и сколько символов равенства должно быть, когда нужно сравнить одну переменную с другой? Два. Но там видно выше что всё правильно, тут просто опечатка. >строки с конкатенацией >Ну, вроде не новичок, хорошо. Я на делфи немного умею ещё. >Вот это повторяется, можно избежать. А так задача решена верно. А как? Неужели можно просто >$worthMoney= +$mounthlyPayment;
>функция округления Я погуглил как округлять числа.
>>852059 Мне больший функционал пока никчему. К тому-же ньюфаг больше и не умеет писать. Но с задачей справляюсь. Раньше писал от силы 20-40 строк кода в день вообще.
>>852074 >А как? Неужели можно просто >>$worthMoney= +$mounthlyPayment; Можно так - просто вынести эту строку за пределы условий, оставив в цикле, и в этом случае в одном из условий $mounthlyPayment при последнем платеже просто должна становиться равной $oversum.
>>852076 >$mounthlyPayment при последнем платеже просто должна становиться равной $oversum. Не совсем понимаю тебя. Она и так при последнем платеже равна $oversum.
>>852077 Можно строку $worthMoney= +$mounthlyPayment; вынести за пределы условий в цикле, а при последней итерации в условии с ($oversum < 5000) внутри условия делать $mounthlyPayment равной $oversum. Так сократится код и мои параноидальные стремления будут удовлетворены.
>>852079 >Можно строку $worthMoney= +$mounthlyPayment; вынести за пределы условий в цикле, 13 месяцев же получится просто 5000 * 13 если выводить из условия... > при последней итерации в условии с ($oversum < 5000) внутри условия делать $mounthlyPayment равной $oversum. Это уже было сделано до того как ты предложил. Прочитай же внимательнее.
>>852088 Ну, там и в верхней строке с подчёркнутой $oversum можно сократить многое. Ну ладно, задача правильно решена, хотя и неудовлетворёнными остаются параноидальные стремления: я бы сократил вдвое там всё.
>>852132 >Есть ли статья, в которой собраны случаи когда можно применять регулярки, и когда лучше обойтись без них? Всегда лучше обходиться без них. До HTML5 например 99.9% сайтов неправильно валидоровали почту (по стандарту можно в мэйле иметь кучу всего что те отсеивали). И вообще Сперва у нас была проблема. Мы решили её решить при помощи регулярных выражений. Теперь у нас 2 проблемы.
>>852282 да , но в большинстве фреймворков оно ешё обмазывается патерном роутер и считай это входная точка когда например ты вводишь в браузере site.io/controller/action
>>852286 Спасибо. А я этот момент упустил, и хуй знает сколько мучаюсь. Еще вопрос - а можно ли делать шаблонизацию по простому просто передавая в шаблон переменные, или это дурной тон? А то много всяких дополнений, какие-то твиги и прочее, не хочется еще и с ними возиться.
>>852290 >А то много всяких дополнений, какие-то твиги и прочее, не хочется еще и с ними возиться. Так это же удобнее на порядок.
>>852297 >Где можно толково про роутер почитать? Конкретные реализации зависят от используемого фреймворка. Но суть приблизительно такое: ты задаешь маппинг путей на методы и всё.
Сегодня открыл для себя чудное свойство ООП - можно передать в качестве свойств класса по факту сколько хочешь свойств внутри массива. Такое вообще делают?
ОП, как правильней хранить в конфиге путь к папке public? "projectFolder":"/students/public" или "projectFolder":"/students/public/"
Просто в консолях пишется "D:/path/to/folder", а в браузере "http://site.ru/path/to/public/" и я не знаю, что взять за стандарт, а от этого зависит, как будет написан Router
>>852373 Удваиваю вопрос, но знаю что это нужно настраивать в своей ide, чтобы на tab был отступ пробелами.
Хочу сказать, что я начал замечать отступы пробелами когда начал учить js. Поэтому у меня появляться вопрос: А стоит ли нам идти на поводу у js-господ\блядей?
>>852374 >можно передать в качестве свойств класса по факту сколько хочешь свойств внутри массива Напиши пример кода плз, ничего не понял что ты написал
>>852444 Связать свой заработок с популярностью одной единственной цмс и решениями левых пяток её разработчиков? Нет, спасибо, это как в 1С пойти.
Как я понимаю, период написания модулей для цмсок проходят многие программисты, либо в начале, либо в кризисе своей карьеры. Ну как музыканты, которые в кабаках играют. Собственно, о каком профессиональном росте может идти речь?
Как хранить дату рождения в базе mysql, чтобы потом наиболее быстро фильтровать по возрасту пользователей? Например выставить фильтр от 20 лет до 30 лет.
Например дата рождения 1990-02-06 хранится в поле Date. И таких юзеров в таблице много. Тогда чтобы получить всех юзеров с нужным возрастом нужно произвести некие манипуляции над каждой строчкой, а потом выбрать подходящих юзеров. А если таких строк в таблице очень много. Долго же будет.
Может надо хранить дату рождения как то по другому, чтобы выполнять выборку быстрее? Было бы хорошо наверное хранить возраст юзеров, но это не вариант, их возраст каждый год увеличивается.
>>852563 Хранить количество лет в поле, сортировать по этому полю, в цикле обходить сортировкой всех юзеров, прибавляя/отнимая один год. Оптимизация скорости работы.
Вообще нет. Надо сделать несколько отдельных свойств, так как ты только усложняешь код не получая выгоды. Хранить массивом можно олько если они всегда вмесие передаются и обрабатываются. Но в этом случае стоит подумать, не замегить ли их на объект.
Там проблема была не в регулярках, а в неправильном алгортитме. Регулярки это спецтальный язык (DSL) для поиска и замены строк, и он эффективнее обычного кода.
Скорее всего надо делать либо скрипт либо поискать в пхпсторм опцию ввгрузки по требованию. Также, не используйте фтп так как он передает все, включая пароли, в открытом виде. NSA радо.
Привет, аноны. Начал писать тестовый проект на yii2, для разработки выбрал расширенный шаблон и столкнулся с многими проблемами. Хочу понять как собственно работает весь шаблон, а нем есть две среды разработки и два приложения backend, frontend и папка common с общими моделями, mail-ом и виджетами. также большое количество конфигов, которые унаследуются друг от друга. Знаете ли какие-то туториалы, пусть и на англ, но что бы я смог почитать и разобраться во всем этом? буду рад любым ссылкам и советам по этой теме.
Как мне подставить переменную $rand на место 1 или 2? У меня в коде есть много значений, мне нужно подставлять заготовленные блоки из переменных выбирая их рандомно.
Есть сайт с сильно засраной и плохо спроектированной бд. У начальства появилась идея создать клон сайта, но с немного отличающимся контентом. То есть одинаковая (или одна и та же?) база, одинаковая структура кода и верстка. Но в отдельных таблицах в отдельных полях разные данные. (Да, правильно было бы переделать структуру базы и тонны завязанного на ней кода, но на это не дадут времени)
Какие есть варианты? Продублировать поля в таблицах не очень хорошо, потому что если взлетит, клонов наклепается больше одного, соответственно будут сотни полей в таблицах.
Если использовать разные бд с одной схемой, то нужно следить за их согласованностью (большая часть данных одинаковая). Как здесь лучше поступить?
Заметил что как только разработчик ознакамливается с массивами - он тутже и начинает делать всё через массив. Вывести инфу из БД - массив, Парсить XML - массивом, получаем ряд инфы - тут тоже массив. Что за привычка такая тупая?
Произошло что-то прикольное, но я не понимаю почему.
Раньше <a href=''></a> не содержал в себе ничего, а <a href='main'></a> перенаправлял на 'edit' Я делал <a href='<?=$router->makeUrl('main')?>'>Редактировать</a> который брал из конфига путь к public и добавлял к нему экшн И ссылка становилась 'localhost/students/public/main'
Теперь <a href=''></a> направляет на текущую страницу если мы на localhost/students/public/main?page=1&sortBy=name&orderBy=desc? то на неё и направляет
А <a href='main'></a> направляет на 'localhost/students/public/main'
И получается makeUrl больше не нужен. И вообще всё лаконично и классно. Я не понимаю с чего такая перемена, т.к. какой код в Router'е не пиши, это ни как не может повлиять на <a href=''></a>
Поясните, как делать модель для задачи про студентов? Тупо создавать новый объект ПДО, или же делать наследование от ПДО? Второй вариант меня как-то больше вдохновляет.
>>852724 "Ознакомился с массивами" это уровень человека, который только-только научился в циклы и функции, ты ему предлагаешь сразу объекты юзать?
>>852729 Ты, видимо, хочешь применить Active Record. Почитай у ОПа что такое модель, у тебя это будет не один класс. В пасте по студентов всё же написано.
>>852725 В БД у него хранится дата рождения, а не возраст.
Кто-нибудь ставил xdebug на sublime text 3? Вообще, как я понял, на php один дебагер - xdebug? И какой бы я редактор или иде я не использовал, мне придётся ставить его? В пхпшторм его тоже нет из коробки? Как вы дебажете?
Надо различать бекенд и фронтенд (интерфейс) дебаггера. xdebug - это бекенд. Это модуль, который встраивается внутрь php на сервере, и при поступлении запроса при включенной отладке он открывает порт и ждет подсоединения от клиента. После чего предоставляет клиенту возможность управлять выполнением скрипта.
Для подсоединения к xdebug используют программу-клиент. Можно конечно и без него, в консоли вручную подсоединится и писать команды, но это будет очень неудобно.
К sublime3 вроде бы есть плагин который может быть клиентом, но, когда я его тестировал, он был крайне глючный.
Поискать клиенты можно по словам xdebug client, xdebug GUI client.
Например в phpstorm встроен клиент.
> И какой бы я редактор или иде я не использовал, мне придётся ставить его?
Да, на сервере надо установить xdebug. В дебиане это делается например 1 строчкой с apt-get install php5-xdebug если я не путаю + может что-то в конфиге подправить.
Это если он пропускает ООП и берется сразу за XML (чему увы учат некоторые учебники). Я тоже на эту тему думал, разделить урок про ООП, выделить из него ту часть где объекты используются как структуры, и переставить сразу после массивов. Чтобы люди успели познакомиться с объектами раньше чем услышат что ООП - это сложно.
Массивы правда имеют преимущество, что код быстрее пшется, не надо класс писать. Но зато код менее понятный и хуже поддерживаемый.
А читал ли ты урок про ООП? Наследовать можно только однотипные классы. Класс с методами работы с БД нельзя наследовать от PDO. От PDO можно унаследовать разве что "улучшенный PDO", с какими-то дополнительными методами.
И модель (как часть MVC) состоит не только из работы с БД. Там еще скорее всего будет класс, представляющий 1 студента (который тоже называют моделью студента, что добавляет путаницы), и класс-валидатор для проверки данных студента.
Лучше избегать дублирования, как огня. Ты потом озвереешь от необходимости вносить изменения в 2 копии кода, особенно когда они слегка различаются.
Так что лучше придумать как-нибудь, как избежать дублирования и в базе и в коде, добавить функцию или переменную например для выбора таблицы или колонки или названия БД или еще чего-нибудь.
В Слиме - это код, который вызывается до и после обработки запроса. Он может что-то делать с запросом и ответом, например:
- логгирование (какой запрос пришел, код ответа, число байтов в ответе) - авторизация (например HTTP-авторизация с HTTP кодом 401) - шифрование/подпись кук прозрачно для самого приложения (оно видит уже расшифрованные куки) - какую-то обработку URL, напримепр редиректы или замены или выбор языка в зависимости от URL - какая-то обработка ответа. Ну например, можно сделать ссылку, при нажатии которой весь текст страницы становится транслитом, с помощью middleware.
Если хочешь, можешь сделать например middleware, делающее прозрачное шифрование-расшифровывание кук или транслит (при добавлении в ссылку ?translit страница выводится транслитом. При этом выбор запоминается в куках)
Есть же официальная документация, в тч на русском. Перед ее чтением желательно разобраться с ООП, MVC, и разными подходами, применяемыми в фреймворках (например для YII это ActiveRecord).
>>852569 По иронии я как раз работаю в компании, которая использует самописный движок. Но для моего уровня джуниора разбраться в этой системе (довольно недурно написанной) будет как раз профессиональным ростом. А вообще нельзя узкоспециализироваться.
>>852563 Ты о чём вообще, Date разве не в виде unix timestamp хранится? Если нет, то храни unix timestamp, базарю, это лучше всего. Целое число, легко провести арифметические операции. Вон даже вконтактик таймстэмп хранит, а у них оптимизация ого-го.
Так, еще раз. Модель - хранит данные(например студента, книгу, прочий товар), записывает/удаляет/изменяет информацию о них в БД, возвращает объекты оных. Представление - сохраняет шаблон, вписывает в него информацию для вывода(т.е. объекты от модели), выводит шаблон. Не создает данные как таковые, только получает их. Контроллер - скрипт, который оперирует моделью и представлением. Т.е. в нем создаются объекты, вызываются их методы и по факту запускается приложения. Я правильно понял суть MVC?
В базе данных есть спенцмальный тип для хранения дат/времени и операции для работы с ним. Не занимайся велосипедостроением.
unix timestamp имеет немало своих недостатков, например, не хранит часовой пояс и плохо годится для исторических дат, когда были разные календари и смещения.
>>852782 >Контроллер - принимает запрос пользователя и вызывает нужные ему для обработки модели и вью для вывода. Имеется ввиду ссылка, пост-запрос? Типа в контроллере ссылка/запрос разбирается и вызывается нужный метод модели, потом эти данные передаются в представление и выводится нужный шаблон?
>>852841 >D:\Folder >В качестве сервера установлен Open Server кидай в папку openserver. У него это папка domains там создай папку со своим проектом, ребутай опенсервер, выбирай в его меню проект, и браузер запустит твой 1.php
>>852861 Для начала дай определение слова дебаг, а то я понять не могу чего ты хочешь получить в результате. Я понимаю когда C++ дебажишь. Но тут то он вообще зачем?
Единственное, ОП, прошу посмотри лично, почему у меня проблема с вызовом ConfigExeption для этого нужно, например, переименовать router.json. А то я уже отупел, что то на уровне "я думаю что x+y=4, а выдаёт 5". Хоть скажешь, в какую сторону смотреть
>>852865 >Для начала дай определение слова дебаг Возможность просмотра состояния переменных в определённом участке кода на этапе выполнения. Я писал на C++, С#, делать даже что-то совсем простое без дебага немыслимо, если что-то работает не так, приходится искать где это, на каком этапе. А если проект большой, и ты с ним плохо знаком, и вообще не знаешь, что там в каком классе содержится, и что с ними происходит, то только отладкой это можно проследить.
В php в этом нет необходимости что ли?
>не могу чего ты хочешь получить в результате Я привык, что в visual studio, когда я писал на C++, С#, у меня была проверка синтаксиса и отладка. С проверкой синтаксиса - у тебя не будет глупых ошибок, компилятор при сборке проекта тоже может показать ошибки, уже не просто синтаксические, ну и в конце концов есть отладка, свои и чужие ошибки всегда можно найти и избежать. Я привык к этому, тоже самое хотел сделать и в саблайме, я накатил сюда проверку синтаксиса и вот этот дебагер. Но я не совсем понимаю, почему для волнения отладки нужно обязательно запускать браузер, по-другому скрипты не запускаются что ли?
>>852872 >Возможность просмотра состояния переменных в определённом участке кода на этапе выполнения. Ну я использую var_dump ($peremennaya); >В php в этом нет необходимости что ли? Просто в большинстве случаев без дебага справляюсь. >Но я не совсем понимаю, почему для волнения отладки нужно обязательно запускать браузер, по-другому скрипты не запускаются что ли? На этот вопрос пусть лучше ОП ответит. Я об этом даже не задумывался.
>>852909 >private $errors = array(); Хочешь получить код который ты потом никогда не захочешь редактировать и вообще трогать? Потому-что именно так он и получается.
>>852909 Не вижу ошибок. Ты скорее всего где-то при использовании объекта Errors забыл поставить круглые скобки при вызове метода get, вызывая метод как свойство, потому и Undefined property. Как-то так: $errors->get, то есть без скобок. Предлагаю выложить класс Errors на ideone и там уже изолированно протестировать методы get и add.
Внутри класса определена константа const DESC = 'DESC';
Снаружи я обращаюсь к ней $order = ClassName::DESC
затем передаю в класс переменную $order, и пытаюсь выяснить ее значение if ($order == DESC) PHP выдает ошибку Notice: Use of undefined constant DESC - assumed 'DESC'
Но условие работает, т.е. $order таки равен DESC.
Вопрос, ЧЯДНТ?
Внутри класса сравнивать нужно так $order == 'DESC' или так $order == ClassName::DESC ?
>>852983 Нельзя использовать интерполяцию для функций. При выводе строки через echo скобки {} работают только для переменных (для функций только конкатенация)
Чем вы парсите страницы? Первое что нагуглил - симпл хтмл дом, но метод парсинга с ней мне показался несколько странным. Она создаёт объект всего дом, он же пиздец какой здоровый и это пиздец сколько памяти
Там есть несколько режимов работы. Есть режим, когда xdebug при запуске php скрипт соединяется с указанным в конфиге IP и портом (где его соединение должен ждать GUI клиент). В этом случае IP с клиентом жестко прописвается в конфиге.
Есть другой режим, когда xdebug смотрит, с какого IP пришел запрос, и соединяетя с этим IP, но с указанным в конфиге портом.
Разумеется в настройках IDE должно быть выставлено, чтобы она ждала соединения на том же порту.
Но тут надо понимать, что не всегда один узел может соединиться с другим. Если у тебя "серый IP" и ты выходишь в сеть через NAT провайдера, то соединиться с твоим компьютером снаружи невозможно. В этом случае надо "пробрасывать" порт с сервера на твой компьютер, например, с помощью ssh. В этом случае xdebug коннектится сам к своему же серверу, а ssh перенаправляет данные к тебе и соединяетя с IDE у тебя (для IDE это выглядит, как будто запрос пришел со своего компьютера).
Если у тебя php запущен на том же компьютере что и IDE, то проблем конечно нет.
Тебе надо понимать основы TCP/IP (например что такое порт) и прочитать мануал https://xdebug.org/docs/remote . Увы, на англ.
> А теперь проясни мне, как сделать так, чтобы хdebug заработал? Почитай мануал по всем директивам в конфиге и выбери нужные значения
Лучше бы ты не использовал сборку, а ставил все руками так как мануалы рассчитаны именно на стандартную установку. Но можно конечно и в опенсервере разобраться.
Это допустимо для кода, который не использует параметры запроса, POST/GET, куки (так как в команной строке нет HTTP запроса - потому и всего этого нет) итд.
> arg.join === undefined правильнее было бы join in arg. Хотя мне не нравится такой способ определения массива - метод join может быть у псевдомассива тоже.
Псевдомассив - это не массив, а объект у которого есть свойства length >= 0 и 0 .. N. Например: { 0: true, 1: true, length: 2 }
> for (var [expected, test] of testcases) { Мой хромиум отказывается интерпретировать. Видимо нужен очень уж новый JS с декомпозицией значений.
В общем, выглдяит верно, только проверку на array-like надо допилить без проверки на join. Отсеять настоящий массив можно по [object Array]
>>853123 Но ведь буквы T нет в слове horse. Или он срабатывает потому-что там feet? >>853158 > Некоторые операции вполняются справа налево, наерно. Почитай мануал. И за такой код конечно руки отрывать стоит. Если ты про форматирование - это PHPstorm отказался по другому. Если про исходник - писал не я, у меня такое-же мнение. Просто сложность кода которая возникла изниоткуда, в результате и читать тяжело и понять что он должен делать трудно. Автор сам на свои же грабли наступил.
На собеседовании тебя будут хуесосить, чтоб твои зарплатные ожидания сбить, потому хуесось их в ответ. Поспрашивай как их наебизнес поживает, может они концы с концами еле сводят. Как с текучкой кадров в конторе - почему вакансия висит, что с прежним разработчиком и если он уволился, то почему. Бывают ли задержки зп, как сверхурочки оплачиваются, че там с индексацией зарплат. Если оформление не по тк, то спроси когда на тк перейдут - мол солидной фирмой тебе показались, а тут на тебе.
У меня некропека, поэтому пользоваться IDE типа нетбсинса или пхпшторма слишком геморно. Возможно ли обазмазать тот же саблас или нотепад++ плагинами что бы они не уступали IDE, или же лучше терпеть тормоза?
>>853334 Цени себя. Если зовут, то нужен. У тебя таких собеседований будут ещё сотни. Во всём так, Люк, поступай, чтобы не было мучительно больно за упущенные возможности потроллить. Ну а вообще смотри просто на людей, тебе же с ними работать, у них учиться.
>>853324 >Возможно ли обазмазать тот же саблас или нотепад++ плагинами что бы они не уступали IDE, или же лучше терпеть тормоза? Саблайм ставь. И будет тебе счастье. По большому счёту всякие плагины на него - это тоже не очень обязательное дело.
>>853365 Я саблаймом и ползуюсь. Но хотелось бы и побольше возможностей. Например, автодополнение работает непонятно как. Не подсказывает какие аргументы ожидает функция, например. Оче хотелось бы что бы он мог видеть функции и классы с методами из моих подключенных скриптов, как делают IDE. Еще мне не хватает автоформатирования кода.
>>853387 Ну он кстати еще и платный, лол. А я не люблю возиться с кряками. Кстати что характерно - ради сравнения запустил консольный проект C# на визуал студии 2015 - работает вполне шустро. А пека у меня ну оче некро - одноядерный проц на 2800ггц, 2гб рам и встроенная видуха, лол.
>>853495 > Нельзя её как-то подключить без всяких композеров? Обычным require'ом класса. Не забудь свой автолоадер классов навелосипедить, раз композер нинужен.
Сап, аноны. Помогите пожалуйста доделать 2ю задачку на регулярные выражения. Условие для последних 2х номеров не могу добавить, много разных вариантов пытался сделать, в итоге либо выдавало синтаксическую ошибику, либо забраковывало правильные номера.
1) установи Wireshark (программа перехвата пакетов на сетевой карте), закрой все лишние программы, кроме браузера. запусти wireshark, открой в браузере любую страницу, посмотри какие пакеты будут пойманы. Учти что там обычно еще идет куча мусора от соседних узлов сети и от других запущенных программ
Если ты под линуксом, то еще можно использовать tcpdump
2) с помощью команды nslookup запроси IP сервера yandex.ru у DNS-сервера 8.8.8.8
3) с помощью tracert/traceroute и whois узнай, через какие узлы и города идут пакеты, отправляемые на адреса google.com, twitter.com, vk.com, yandex.ru (или другие сайты)
4) С помощью telnet или putty соединись с сервером yandex.ru и отправь HTTP-запрос GET / HTTP/1.0
5) Напиши на php простой echo-сервер, который слушает порт, принимает соединение и отсылает каждую принятую строчку обратно.
6) Напиши простой HTTP-клиент на php, скачивающий файл по указанной ссылке
7) Напиши простой HTTP-сервер на php, отдающий какую-то простую страницу, и протестируй его с помощью браузера. В случае затруднений можно использовать wireshark (только ловить пакеты на 127.0.0.1 скорее всего не получится, используй IP на сетевой карте, узнать его можно через ifconfig)
8) Простые программы выше были однопоточными. Напиши многопоточный сервер. Его суть такая: он принимает соединения от клиентов, и все, что напишет клиент, пересылает всем остальным (что-то вроде чата). Тебе понадобится socket_select или strea_select для этого. Тупо сделать синхронный алгоритм вроде "отправить сообщение клиенту 1, затем клиенту 2" не получится, так как при зависании одного из клентов (если он перестанет принимать пакеты) зависнет и сервер до истечения таймаута.
9) перепиши свой сервер на reactphp
10) Напиши простой многопоточный HTTP сервер на reactPHP
Как избежать дублирования перечисления свойств класса, для безопасного получения значения этих свойств из $_POST при создании объекта? Для класса работы с базой данных также требуется список всех свойств, в методе генерации запроса для создания сохранения объекта или обновления записи.
Вот пример кода, в котором есть перечисление свойств, которое хотелось бы избежать:
if (!empty($_POST)) { // Необходимые значения формы для создания объекта Abiturient $abiturientValues = array( "name", "lastName", "gender", "groupNum", "email", "egePoints", "dateOfBirth", "registry" ); // Выбираем из $_POST нужные параметры $values = array_intersect_key($_POST, array_flip($abiturientValues));
Как пример решения, думаю создать метод getValuesName(), получающий массив с названиями всех св-в объекта c помощью get_object_vars(). Что практикуете, что посоветуете?
Ребят, я, конечно, не знаю, что да как будет, но если я стану изучать PHP, HTML, JavaScript с нуля где-то по 5 часов в день, я смогу летом 2017 уже получить работу или зарабатывать хотя бы копейку в интернете?
>>853792 Это не так просто, как кажется, - заниматься по 5 часов в день. Если бы ты так смог, то ты бы на работу мидлом мог бы претендовать к лету. А так за джуна вполне сойдёшь к этому времени, если по паре часов стабильно будешь заниматься в день.
>>853817 Двачую. Одно дело учиться в универе, когда тебя гонят палками. грозят отчислением и армией. Другое дело сидеть дома и заставлять себя самому. Это тяжело в общем.
>>853810 >>853817 >>853820 Спасибо за ответы Я очень сильно постараюсь. Думаю, спокойно смогу час или два с помощью смартфона в своей шараге что-то выполнять, ну и вечер у меня весь свободен, три часа постараюсь посвятить обучению. Удачи вам всем
>>853820 Что-то читал недавно про Курсеру - даже у них всего лишь 15% заканчивают курсы из всех тех, кто подписывается и начинает учиться. Нужна мотивация и выработка привычки что-то делать каждый день.
>>853832 И тебе удачи. Начинай прямо сегодня. На смартфоне можешь через ideone.com бОльшую часть учебника ОПа пройти, я на планшете кое-что делал так.
То, что исключение выбрасывается при отсутсвии конфига - это правильно. Только вот плохо, что оно не сохраняет причину ошибки. Это из-за того, что у тебя там написано:
>>853844 Спасибо, действительно, объекту можно передать массив с любым набором. А внутри уже реализовать метод отбора только тех значений, которые есть в самом объекте.
Также, если не хочется смотреть рекламу и зависеть от интернета, можно установить php на смартфон, но придется заморочиться. Нужны будут (их надо либо ставить по отдельности либо покупать программы, где все уже собрано):
- редактор кода - клавиатура со спецсимволами - php, он по моему ставится через scripting layer 4 android и его по моему нет в google play - сервер apache (в начале не требуется, достаточно только php, тем более что в нем есть встроенный сервер)
Вообще, аноны, я наверно когда будет время попробую на своем телефоне все это поставить и написать гайд, если это кому-то нужно.
Сап, кто у нас в молодой и активной компании есть? Что используете для трекинга заданий? Сейчас смотрю на ActiveCollab, она простая как две палки, при этом стоит 500 баксов. Неужели никто не догадался аналог написать?
> Напиши программу, рассчитывющую, сколько электричества необходимо закупить (или можно продать) днем и ночью для обеспечения баланса и сколько это будет стоить (или принесет прибыли). в условии задачи не указано сколько стоит мегаватт своей электростанции и батареи, а так же сколько стоит импортный мегаватт из других городов. И вообще условия какие-то расплывчатые, мало конкретики (не понятно сколько домов, например). Какой-то матанализ вообщем.
Сап, пхпач. По какой книге начать вкатываться в кодинг связанный с вебом? Желательно чтобы там затрагивалось все, что надо новичку в вебе. Дальше хочу развиваться в пых и вообще фуллстек.
Ебучее говно json_decode смеет называть себя ФУНКЦИЕЙ? Оно блядь крашится и возвращает NULL, когда пытается запарсить 2,4 мегабайта данных из .json-файла. Ебучих 2 с половиной мегабайта. Есть адекватный аналог этого говна собаки?
>>854039 В конфиге PHP какой memory_limit стоит? Покажи ещё вывод функции json_last_error: https://secure.php.net/manual/ru/function.json-last-error.php Из адекватных аналогов только обёртки над этими же json_* функциями. Зачём они такие нужны? Потому что умеют бросать исключения.
>>854119 "Более опытным товарищем" вполне может быть и книга с гуглом.
Кстати, поддержу тезис про важность комьюнити для успешного освоения программирования. Хотя можно вполне обойтись гуглом и книгами, но с поддержкой реальных людей было бы гораздо проще, как мне кажется. Так вот, к чему я: добавляйтесь в ко мне в телеграмм @oo1o1 если у кого есть желание осваивать PHP вместе. Типа как тупые телки из вк, которые совместно начинают голодание или жёсткую диету.
Генерируемое и потребляемое локально электричнство как бы бесплатно (то есть потребитель платит электростанции и мы это не учитываем). Оплачивается только внешнее электричество, приходящее через ЛЭП. При этом у каждой линии своя цена и пропускная способность.
Насчет цены и количества домов - они могут быть любыми, код должен быть универсальным.
Только трекер для программистов. В компании в которой программистов человек например 5, и каждый из них должен выполнять 20-30 заданий в день. Каким образом гитхаб то?
Сап, есть одно поле textarea. Соответственно оно сохраняется в БД, и потом отображается на сайте. но чтобы 100500 раз не редактировать, нужно как-то предварительно это поле показать, как оно будет после сохранения выглядеть. Есть ли возможность это сделать?
Дя, может быть вопрос ньюфажный, заранее извиняюсь если что.
>> Requirements: >> SLQ 5.6.17 or above >Что-то ты опечатался. И еще, у тебя разметка кривая получилась в README, почитай про маркдаун-разметку.
Переименовал в MySQL. Добавил заголовки и изменил булеты списков.
>> `egePoints` varchar(3) >Число баллов на ЕГЭ - это все-таки число, а не строка. Вот телефон или номер паспорта - это строка, >а число баллов - это число. Потому что их можно считать, складывать, и тд.
>> require_once '/../app/init.php'; >Вот тут путь странный, это путь от корня диска или относительно текущего файла? Лучше использовать >абсолютные пути, например на основе __DIR__, так как они гарантированно укажут на нужный файл. >А относительный путь может например зависеть от того, какой текущий каталог, чему равен include_path и тд.
Использовал такое решение: require_once (__DIR__ . '/../app/init.php'); Это абсолютный путь или относительный? Ведь __DIR__ отдает путь относительно выполняемого скрипта? Можно ли использовать такое решение require_once ($_SERVER['DOCUMENT_ROOT'] . '/app/init.php')? https://github.com/enotocode/Studentslist/blob/master/app/init.php
>а как же зайти на страницу с таблицей студентов? >Мне кажется, это неудобно, если она не открывается напрямую.
Ты имеешь ввиду добавить адрес вроде /list, который бы вел на список? Как я понял условия задачи, доступ к списку студентов пользователь получает по ссылке в уведомлении, после регистрации или редактирования профиля студента. Изменил: сейчас при заходе по адресу / или /index.php открывается страница с ссылкой на редактирование и список. Также в список можно попасть по ссылке /index.php?page=1. https://github.com/enotocode/Studentslist/blob/master/public/index.php
>> // Подгружаем страницу сообщения >> require("../templates/message.html"); >Вот это неправильно. Ты тут фактически делаешь вывод части страницы, >а это не задача контроллера - выводить страницу по частям. >Это должно делать представление, то есть основной шаблон страницы подключает что ему нужно.
>> echo 'Class "'. $fullFileName .'" does not exist.'; >Автозагрузчик не должен выводить ошибок. Если класса нет, он его просто не загружает. >перечитай урок про автозагрузку. >Имя файла в автозагрузчике лучше формировать абсолютное, а не начинающееся с '..'
>Магические методы надо всегда использовать с осторожностью. >Так как они затрудняют понимание кода, требуют в нем разбираться. >Для свойств студента наверно удобнее было использовать магические метод __get, __isset и __set >(хотя тогда возникает вопрос, не проще ли сделать публичные свойства).
>> foreach ($values as $valueName => $value) { >> $sql = "UPDATE abiturients SET " . $valueName . " = '" . $value . "' WHERE id = " . $id; >Неэффективно обновлять по 1 полю. Надо сформировать большой запрос и обновить все разом. >Можно например собирать SQL код в один массив, а значения плейсхолдеров - в другой. >Такой метод даже можно вынести отдельно, так как часто есть задача обновить сущность по id. >Примерно так: >$sqlParts[] = ' name = :name '; >$placeholders[':name'] = $name; >Только с подстановкой имен полей из переменной.
>> $email = filter_var ($value, FILTER_VALIDATE_EMAIL); >Имей в виду, что емайлы вроде ivan@иванов.рф не проходят через эту функцию, по крайней мере в PHP5. >Там по моему даже в мануале это упомянуто для проверки URL.
>> $this->errors["name"][0] = $this->findForbiddenSymbols('/[^a-zа-яё]/ui', $name); >Тут наверно логичнее в качестве ключей использовать строки, то есть $errors['name']['forbidden'], >так как используются они потом в другом месте кода и надо помнить какой номер чему соответствует. >Более того, возможно тут стоит упростить код, сделав удобный класс для представления ошибки или >списка ошибок. Чтобы было вроде
>$error = new ValidationError(...); >или >$errors->add(['x' => .., 'y' => ...]); >Сама идея хранить отдельно параметры ошибки от шаблона сообщения хорошая >(это позволяет например делать перевод сообщения на другой язык), но вот реализация немного запутанная.
>> date_default_timezone_set('UTC'); >Вот это нехорошо, твоя функция как побочный эффект меняет глобально часовой пояс >Это может вызвать ошибки в другом месте кода. Посмотри, нельзя ли указать часовой пояс локально >для одной функции, может передать в date, может использовать класс DateTime который вроде их поддерживает.
Вообще убрал установку часовой зоны, т.к. date возвращает по-умолчанию время для часовой зоны 'UTC'. В данном случае не будет проблем, т.к. год рождения всегда меньше текущего года. В другой ситуации, думаю можно устанавливать часовой пояс клиента в объекте DateTime::setTimezone(), гадая по IP и на JS? https://github.com/enotocode/Studentslist/blob/master/app/AbiturientValidator.php#L78
>> <input type="radio" name="registry" >> <label for="REGISTRY_LOCAL">Местная</label> >Можно засунуть input внутрь label и тогда id/for не нужны.
В Bootstrap отступы другие получаются, не так красиво выглядит.
>И еще, ты подключаешь шаблон через include. Но это имеет недостаток: >не видно, какие переменные передаются в него. Возможно лучше передавать их явно как-то так: >$view->render('index.phtml', [ >'x' => $x, >'y' => $y >]);
Сделал класс View. Переменные из массива превращаю в переменные с помощью ф-ии extract. Чтобы обращаться к ним $abiturient->name вместо $values['$abiturient']->name. Нужен ли префикс в именах переменных при экстракции, например form_abiturient? https://github.com/enotocode/Studentslist/blob/master/app/View.php
>У тебя класс авторизации по сути просто ищет юзера по куке. >А рассмотри еще такой вариант, чтобы класс авторизации отвечал >и за простановку/ проверку/очистку авторизационных кук. Может так будет лучше?
>Обновление студента лучше делать так: загрузить студента из БД, затем обновить в нем данные из POST. >Иначе если у тебя в модели есть поле, которого нет в форме, оно потеряется. >Ты по сути пересоздаешь студента заново.
То есть нужно каждый раз пересоздавать студента заново или я сейчас так и делаю? Ты имеешь ввиду алгоритм в методе updateAbiturient в Gateway или в контроллере ? Но ведь я и так загружаю студента из бд, затем заполняю его свойствами поля формы. Пользователь изменяет или не изменяет эти свойства. Затем обновляю только те свойства студента, которые есть в форме. Сейчас в форме нет id и пароля. Как и какое поле может потеряться? И поле в форме не может быть пустым, т.к. в форме все поля обязательные. https://github.com/enotocode/Studentslist/blob/master/public/register.php#L30 https://github.com/enotocode/Studentslist/blob/master/app/AbiturientDataGateway.php#L54
Аноны, я начал учиться совсем недавно, посмотрел вакансии - почти везде требуется знание линукс систем. Я пользовался ubuntu на старой пеке, но в режиме интернет машины, поэтому не познал даже терминала. Какой дистрибутив установить, чтобы на нем и php учить и линукс этот самый осваивать?
Я вот как-то так последний раз делал. Соответственно, элементу который выводит превью, задаёшь все стили как у элемента, который на сайте текст выводит.
>>854399 Убунту и ставь. Она простая для новичка, но даёт и попердолиться. Поставь и делай всё через консоль, короч.
Часто используется на серверах centos и debian ещё, можешь поставить что-то такое, потом попробуй apache+mysql+php поставить вручную, настроить. Короче, попердолиться тебе надо.
Смотри, например, как фреймворки популярные устроены и всё такое. Если тебе нужны отрывки кода с пояснениями, то лучше подписаться на блоги всяких известных программистов. Но там много философии на тему ВАШ ООП НЕ ООП, ВЫ НИЧЕГО НЕ ПОНИМАЕТЕ, ИНДУСТРИЯ ГИБНЕТ, ГОВНОКОДЕРЫ РЯЯЯЯЯЯ
Спрошу о таблице. Есть две таблицы. Одна строк на 200 и столбцов на 50, другая на 200 строк и 2 столбца. Требуется возможность их онлайн редактирования удобным для конечного пользователя образом. Я пока что придумал только следующее: - Делаем чекбоксы и прочие элементы выбора столбцов/строк и кнопку. - При нажатии на кнопку срабатывает жабаскрипт и через аякс данные из чекбоксов улетают в пхп-скрипт. - В пхп скрипте происходит коннект к базам и вытаскивание нужных данных. Затем они оборачиваются в echo json_encode и возвращаются жабаскрипту. - В жабаскипте данные разворачиваются и происходит отрисовка результирующей таблицы, в которую тут же вставляются данные. Каждая ячейка таблицы - отдельный инпут. - Пользователь может редактировать данные в инпутах, затем нажимает ещё одну кнопку и ещё один жабаскрипт собирает данные из инпутов в один массив (кстати, я пока ещё не придумал, как вообще это сделать) и передаёт его в другой пхп скрипт, который и прописывает свежие данные в базу.
Это так и должно выглядеть, или я совсем ебанулся? Может есть плагины для удобной работы с таблицами?
>>854611 >Одна строк на 200 и столбцов на 50, другая на 200 строк и 2 столбца. Выкидываешь всё, оставляешь 5 столбцов. Даёшь юзеру выбрать что добавить. На деле инфа больше чем по 7 столбцам постоянно и чтобы прямо ваще щас - нинужна.
>>854611 >- В пхп скрипте происходит коннект к базам и вытаскивание нужных данных. Затем они оборачиваются в echo json_encode и возвращаются жабаскрипту. Ох, тебе-бы писать 50 оттенков серого для программистов.
>>854622 Не разом. Юзер выпадающим списком/чекбоксами определяет, из каких ячеек будет сформирована таблица, отображаемая на экране. >зачем тут json Я не знаю, как по другому вернуть массив данных из пхп в вызвавший его аякс.
>>854625 Я просто пытаюсь понять. Вот ты выбрал например 5 столбцов, вывел их. Теперь что? Я так понимаю что юзер выбирает строку, и получает возможность её редактировать. Правильно?
>>854323 Гугли milestones со sprint на Гитхабе или вот: https://guides.github.com/features/issues/. Создаёшь в спринтах нужные задачи. Один спринт обычно рассчитан на неделю, у кого как. Несколько спринтов на месяц. Можно отмечать, когда завершён спринт, там есть прогресс-бар завершения, всякие ярлычки и прочее.
>>854570 >Наконец докатился до Регулярок, какие-же они сложные впринципе, ужос. А мне даже доставили регулярки, строки показались сложнее всего остального, слишком уж много ебли из-за отсутствия нормальной поддержки кириллицы.
Здравствуйте, дорогие антуаны. Собственно, в поисках работы наткнулся на вакансию php-разработчика. И вот что просят сделать на миддла С зарплатой ~350 долларов
Задание: Верстка, дизайн рассматриваться не будет, только качество кода. Необходимо реализовать веб приложение – чат. Чат должен работать без перезагрузки страниц при отправке/получении сообщений/смене комнаты. Вход в чат осуществляется свободно, но также должна быть возможность регистрации и авторизации. Авторизованный пользователь может создавать комнаты. Комнаты могут быть: открытые и закрытые. Войти в закрытые комнаты можно только по приглашению создателя этой комнаты. Приложение должно иметь панель управления. Права должны быть реализованы с использованием RBAC. Должно быть две роли: администратор и модератор.
Панель управление должна иметь следующий функционал: 1. Управление пользователями: a. Добавление (администратор); b. Изменение данных пользователя (администратор, модератор); c. Изменение прав (администратор); d. Удаление (администратор); e. Блокировка/ разблокировка (администратор, модератор); 2. Управление комнатами: a. Добавление (администратор, модератор); b. Изменение (администратор, модератор); c. Удаление (администратор, модератор); d. Просмотр переписки (администратор, модератор);
Техническая часть: ∙ Backend – PHP, реализация обязательно с использованием Yii 2; ∙ frontend – JavaScript; ∙ база данных – MySQL / PostgreSQL (При разработке использовать миграции). Исходные комнаты необходимо предоставить ссылкой на GitHub или аналог.
Скажите - я соснул? Я подписываюсь на рабство уровня фриланс и за такие деньги миддлы не работают? Живу в перди с 300к населения. Хотелось бы узнать мнение ОП, стоит ли браться, потому что, честно говоря, выглядит не самым простым. Заранее благодарю.
>>854695 Я даже не до конца понимаю, есть ли смысл пробовать. Боюсь подписать себя на рабство за маленькие деньги. Вот и решил спросить - стоит ли браться за подобное? Не слишком ли много они хотят?
>>854692 >>854708 Если на задание дают неделю - модно часов за 5 запилить и за 5 ещё отполировать. Ну или часов за 20. >Права должны быть реализованы с использованием RBAC. это ведь Yii?
>>854708 Эта задача решается максимум за неделю. Если ты идешь на мидла то тебе придётся решать более сложные задачи за те же сроки, если не раньше. Никаких пробовать быть не должно, эта задача - это самое элементарное, ты уже должен знать как она решается.
Аноны, имею 24 лвл и желание перекатиться в макаки из экономистов. Дрочил ваш пхп уже почти полгода и теперь наконец решился поискать работу. Скажите, какая зп в ДС на первую самую работу норм? Вижу в основном вакансии от 25-35 тысяч, это же пздец как мало, или пока не вкатился соглашаться на любое?
И как qsoft, лайтрумы и прочие конторы котируются? Что делать на собеседовании, ведь у меня никакого опыта нет, даже все мои наработки, что я оповский задачник делал, даже всё это слетело на прошлой неделе к хуям вместе с виндовсом? Короче, реквестирую ваших советов, так как боязно и вообще
Значит есть у меня такой вот говнокод. Метод execute возвращает массив объектов класса student. В самом классе student переменные id, name и прочее. Загвоздка вот в чем - а как так вообще выходит, что переменные из БД подставляются в качестве свойств объекта? А самое странное(по моему мнению) то, что эти переменные будут подставляться даже если класс будет вообще пустым. Это баг или фича? http://ideone.com/XDziGo
Задачка на проверку телефонов расплавила мозг. https://regex101.com/r/qF7vT8/14 Подскажите, пожалуйста, верно ли я составил регулярку и можно ли ее как-то улучшить?
Платиновый вопрос: что почитать/посмотреть про MVC? И почему в аббревиатуре такая последовательность, а не MCV, например, вроде же такая логика? От модели идёт к контроллеру, а потом к виду?
>>854880 Для начала Git, потом Github. Потом делаешь поделку "для себя", чтобы показать, что ты могешь в ООП, заливаешь на Github. Профит. Его можнолол, нужно показать на собеседовании. А на гите оно у тебя ближайшие 25 лет точно будет хранится.
>>855015 Не всё смотрел, но вот: >{$word1[mt_rand(1, count($word1))]} {$word2[mt_rand(1, count($word2))]} {$word3[mt_rand(1, count($word3))]} \n Повторяется два раза. Попробуй цикл с for для вывода этой строки два раза.
Привет, аноны. как в yii adv расшарить доступ к папке common из двух приложений (хочу выгрузить изображение). уже гуглил, но не разобрался. Может кто-то помочь?
>>848550 (OP) Обожаю PHP за то, что он интерпретируемый, а не компилируемый. По своей ошибке запустил бесконечный цикл, который нагенерил мне за 5 минут гигабайт логов. Пыха ван лав :3
>>855074 >По своей ошибке запустил бесконечный цикл, который нагенерил мне за 5 минут гигабайт логов. >Щас бы на продакшн машине запускать скрипты >Щас бы не иметь ограницений на бесконечные циклы в php.ini в 2016 >Щас бы свою собственную глупость выставить как недостаток языка. Эх, вас бы лет на 20 назад и C++ компилстор без IDE которая за вас 90% работы делает, посмотрел бы я на ваши бесконечные циклы и нытьё.
>>855074 >запустил бесконечный цикл, который нагенерил мне за 5 минут гигабайт логов. В трэд джавистов зайди. У них вообще бесконечный цикл - это стандарт для написания демонов.
>>855074 >запустил бесконечный цикл >нагенерил мне за 5 минут Ну так а зачем же ты отключил отграничения на время выполнения скрипта? Сам себе свинью подложил, а PHP ему виноват.
Дело обстоит следующим образом: запрашиваю json-строку, декодирую её в многомерный массив при помощи json_decode и перебираю заглавные ключи(они в каждом массиве разные). Если верить документации, у меня должно быть 10 массивов данных. Перебирающие циклы выводят 10 массивов данных(как и должно быть), но почему-то 9 раз один и тот же. В итоге, у меня 9 дублирующихся одинаковых блоков. Итого, 90 блоков.
>>855081 Я не запаривался особо с настройкой пыхи. Просто сделал apt-get install php и начал учиться кодить на пыхе.
>>855037 Спасибо. А что скажешь про палиндром? Там в подсказке описано какое-то жутко, на мой взгляд, непонятное решение. Сам сперва представил себе алгоритм решения через strrev, точнее я не знал, как эта команда называется, но понял, что она мне нужна. Потом нагуглил, вспомнил картинку, что через нее решать нельзя, воспользовался тем же самым для массива. Это законно?
PHP господины, есть у меня такой вопрос. Есть куча jpeg файлов, которые засунуты в другую кучу по меньше из doc файлов и рассортированы по папкам. Хочу избавится от doc и перенести это в веб. т.е. должна быть страничка где будут отображаться папки, в них вложены еще папки, а в них джепеги. Типа интерфейсов для FTP. Но должен быть быстрый поиск по всему этому, чуть больше 14000 позиций. Ну и конечно же, должна быть возможность создавать директории и загружать джипеги.
Как это сделать я таки примерно понимаю, но мне это делать лень. По этому может кто видел уже готовое? Посоветуйте какую-нибудь годноту.
>>854633 >>854628 Есть таблица. Примерно 60 столбцов на 300 строк. Допустим, в каждой строке стоит отдельный товар, а во втором столбце указан его тип. Пользователь выбирает тип "Утюги" и ему показывается от 1 до 10 (вряд ли больше) строк 20-30 столбцов (допустим, все столбцы, за исключением пустых). И все ячейки должно быть можно редактировать. Так как это сделать с наименьшими потерями крови из глаз?
>>855123 Думаю, всё правильно и законно. Вообще одно из самых лаконичных решений на моей памяти. Насчёт шифровальщика: >'Ш' => 'III', >'Щ' => 'III,', Не вполне верно, потому что если Ш в предложении окажется перед запятой, то потом расшифруется как Щ.
Проблема: есть около 10000 названий городов, и к каждому из них нужна его картинка. Загружать ручками на сервер 10000 картинок как-то ниоч. Пытался искать базы городов, нашёл одну, но её слишком сложно парсить. Есть ещё вариант искать картинки в гугле и парсить ссылку на картинку, но тогда картинки будут загружаться долго со сторонних серверов. + есть возможность, что картинка будет недоступна по прямой ссылке, или ссылка будет испорчена, например, .jpg-large или ещё что + иногда фильмы называют названием городов и запарсить эротическую сцену на сайт... В общем, можно получить пизды от роскомпозора и дизреспект от пользователей. Так вот вопрос - есть ли база картинок городов с нормальными названиями? Например, не RU_Moscow_01.png, а просто Moscow.png. Возможно, кто сталкивался с такой задачей.
>>855276 Поищи клипарты на торрентах. А вообще я бы спарсил с гугло-картинок, а потом просмотрел тумбы. И, либо вручную заменил картинки на которых не города, либо внес в список названия городов, и изменил параметры парсинга. И повторил все сначала для нового списка городов.
Ну пиздец. В начале года делал студентов ОПа, сейчас забы всё к чертям, а мне тестовое задание прислали почти 1 в 1. Охуеть обидно как, самый охуенчик в том, что неделю назад накрылся пиздой хард на старом ноуте, на котором я хранил всё поделие своё, так что даже не посмотреть на свою работу, дабы освежить в памяти. Сука, как же обидно. Аноны, если у кого есть, скиньте посмотреть ваших студентов.
>>855305 Я изначально думал парсить картинки с Tumblr, но мясные дырки додумались постить туда свои ёбла, так что на запрос "New York" мне выпадала 1 пикча с городом и 9 и лицами пёзд. Потом додумался перейти на Flickr и там действительно годные фоточки и есть даже фильтр фоток на "города" и "людей". Так что, осталось только придумать, как мне вытащить ссылку на картинку из этого блока: http://pastebin.com/Y9yHntPd
>>855338 Я понимаю как оно работает. Я не понимаю только почему оно приписывает свойства классу, даже если эти свойства в классе не прописаны. Мне это кажется несколько абсурдом, что ли.
В MySQL таблице есть столбец типа varchar. В ячейках хранятся числа от 0 до 9 999 999,00. Нужно привести тип к числовому. FLOAT же? Только я не понимаю, как. на стековерфло пишут джва варианта: select 0 + column_name from table; и select cast(amount as float) as 'float-value' from amounts но шото я не понимаю, к чему это вообще и как их прикрутить к mysql_query.
>>855351 В PHP обращение к несуществующим свойствам не вызывает ошибок, PHP сгенерирует свойство на ходу. На практике это нигде не используется, так как магия (явное лучше неявного). Как вариант, в твоём случае можно сделать так: 1) Выставить fetch-метод для PDO как FETCH_ASSOC, чтобы результат фетчился в виде массива массивов. 2) Вручную маппить объект на массив. Пример: https://ideone.com/MqQrUx У ОПа написано про DataMapper в пасте про паттерны для работы с БД.
>>855365 Советую почитать про XPATH и DOM. Парсить HTML гораздо быстрее и удобнее чем каждый раз придумывать и тестировать регулярки. Путь до элемента можно посмотреть в девтулах в браузере. Вставляешь в запрос и вуаля. В PHP есть поддержка из коробки. http://php.net/manual/ru/domxpath.query.php
Добрый вечер. Вопрос по mssql server.с sql я знаком неплохо. Сейчас пришел таск по mssql server. Дали три таблицы, одна является связующей. Но в структуре одной из таблиця не вижу колонки которая бы находилась в связующей таблице. Так вот, сам вопрос: в mssql есть ли какой нибудь скрытый автоинкремент признак у записей? Или это проеб в структуре таблицы?
Если мне нужно транзакцией вставить данные в 2 таблицы за раз (связь 1:M), то какую объектную обёртку использовать? Сейчас есть PDO и 2 TDG со связью, сама транзакция в контроллере, что плохо. Её нужно перенести в один из методов TDG?
> а как так вообще выходит, что переменные из БД подставляются в качестве свойств объекта?
Так и задумано. Ты ведь сам указываешь соответствующую опцию. Для каждой записи из БД php делает следующее:
- создает объект указанного тобой класса не вызывая конструктор - проставляет значения полей из БД в поля объекта - вызывает конструктор объекта
Вообще, это неправильно, сначала проставлять поля, а потом вызывать конструктор и противоречит определению конструктора (метод, который инициализирует объект и подготавливает его к работе), потому там сделали специальную опцию PDO::FETCH_PROPS_LATE, которая вызывает конструктор в правильный момент, но почему-то не сделали это опцией по умолчанию. Видимо разработчики PDO не очень любят ООП.
> А самое странное(по моему мнению) то, что эти переменные будут подставляться даже если класс будет вообще пустым. Это баг или фича?
В PHP есть такая неудачная на мой взгляд особенность, что можно динамически добавлять в объект свойства, которых не было в классе. При присваивании значения несуществующему свойству оно автоматически создается.
Это на мой взгляд, ошибка, так как ООП подразумевает что мы определяем список свойств на этапе определения класса. Ну и в случае, если ты опечатался:
$student->namee = 'Ivan'; // namee вместо name
PHP не выдаст ошибку, а молча создаст свойство. В общем, глупое решение. В других языках вроде Java или C# тут будет ошибка и сразу будет видно, в чем дело.
- можно сделать высокоуровневый класс-сервис, который начинает транзакцию, вызывает по очереди оба TDG, коммитит. Это даже у Фаулера описано (хотя и не очень понятно):
Из твоего описания не ясно, что именно надо сделать. Тебе надо поменять тип данных в таблице или преобразовать данные, выбираемые из таблицы и полученные в приложении?
Регулярка хорошая. Хотя можно еще чуть-чуть ее улучшить, если вынести повторяющиеся ^ за скобки и убрать лишние скобки (справа и слева от вертикальной черты).
Вообще, регулярки так не работают. В них нельзя запрещать, можно только разрешать определенные комбинации символов. В том числе "любой символ, кроме пробела".
Найти код, отвечающий за валидацию, и заменить на свой с нуждным функционалом.
В Yii 2 уровня валидации: в процессе ввода на клиенте данные аяксом шлются на сервер для проверки, и при отправке формы данные снова проверяются уже на стороне сервера.
Тебе наверно надо подправить клиентскую валидацию. Изучи встроенный в Юи JS код и напиши свой либо аналогичный либо вызвающий нужные функции из кода Юи. Не правь скрипты самого Юи.
Есть 2,3мб json-файл, который я декодирую в многомерный массив. Данных, сами понимаете, дохуя. Массив устроен так, что мне нужно искать его ключ рекурсивно. Для этого использую функцию рекурсивного поиска(вежливо спизженную с php.net). Функция не успевает просто обрабатывать такие объёмы данных, из-за чего страница загружается по 8-9 секунд. Есть ли какой-то способ искать ключ массива рекурсивно не за 9 секунд?
И праивльно, что нельзя, от всех этих динамических вызовов только бардак. Вот когда ты видишь код вроде:
new $class(1)
Может ли в этом месте использоваться класс SomeClass или нет? Это нельзя определить без анализа кода.
В случае JS после new должна идти функция. Логичнее всего в функцию generator передавать не имя, а саму функцию-конструктор. Имя тут - ненужный костыль.
Также, для обозначения типов панелей надо использовать не строки, а константы вроде PowerPanel.TYPE_SOMETHING
Советую тебе потом показать код на проверку, так как выглядит он пока сомнительно.
Ищи не во время выполнения скрипта, а заранее. Либо храни данные в БД а не в виде JSON. зачем ты вообще используешь джейсон? есть какая-то веская причина? Это не формат для быстрого поиска данных.
Спасибо, как-то странно, что я забыл про использование функций таким способом после 13 твоих задачек по js-то и учебника Кантора. Не до конца еще понимаю js. Пожалуй кину задачки в очередь проверок, которые решил на данный момент.
>>855703 Проверил свою теорию. В общем, нихуя это не из-за поиска в массиве. Запросы к API обрабатываются за 0.1 секунду, а поиск в массиве за 0.03. Всё дело в том, что PHP не хочет, чтобы я изобретал велосипеды, а хочет, чтобы я учил классы и public-функции наверное. Поскольку данные из функций и получаю следующим образом:
А должен был бы наверное делать это классами. Тогда бы не пришлось вызывать функции и записывать их в переменные. Переменные были бы доступны из класса и паблик-функций в индексном файле наверное. Am i right?
>>854570 Понял что я полный нуб в регулярках. Автомобильный номер мсмог за 2 минуты найти, а вот номер мобильника занял у меня 2 дня. Даже не поиск правильного номера стал проблемой, а отметание неправильных. Внезапно так. Сиже теперь листаю Mastering Regular Expressions Jeffrey E.F. Friedl Third Edition...
Задача на автономера. (Кто подскажет как добавить поддержку номеров типа z123df?) http://ideone.com/xLI6IK
>>855675 >Хотя можно еще чуть-чуть ее улучшить, если вынести повторяющиеся ^ за скобки и убрать лишние скобки (справа и слева от вертикальной черты). Вот это скилл, я бы в жизни не смог понять этого!
Для среднего японца слово несет ничуть не больше смысла, однако мой ответ на японском вызывает нечто большее, чем просто удивление. Оказывается в японском языке слово регулярный» звучит очень похоже на другое, более распространенное слово, которое в медицинской терминологии можно обозначить как «репродуктивные органы». Только представьте себе, о чем думает мой собеседник, пока я не объясню в чем дело!
Сап, допустим есть бложик со статейками. Туда пишут статейки несколько человек. Соответственно в эти статейки надо помещать фоточки. Проблема 1. Посреди статьи этого сделать нельзя, потому-что текст с фото грузить довольно сложно с точки зрения логики. Нельзя сразу дать ссылку на фотографию. Нельзя сразу отформатировать фотографию и посмотреть как это будет в итоге выглядеть. Поэтому я создал отдельную формочку для фоток для статей. И уже во время написания статьи открываю фрэйм и позволяю выбрать фото и воткнуть в статью. Через неделю выяснилось что уже при 500 фотографиях искать что-то своё нереально. Вопрос. Как поступить? Есть вариант кидать фотки в папки с датами и таким образом уменьшать выборку фотографий. Так можно, или есть альтернативные варианты?
>>855673 >Из твоего описания не ясно, что именно надо сделать. Тебе надо поменять тип данных в таблице или преобразовать данные, выбираемые из таблицы и полученные в приложении? Лучше поменять тип данных прямо в таблице, чтобы дальше работать с ними, как с числами.
>>855673 >По идее между таблицами должны быть связи на основе внешних ключей. Хотя, возможно, что их по какой-то причине не сделали. Я сперва тоже так подумал, посмотрел наличие Foreign keys но их нет, там нет ни ничего ни уникальных, ни индексов, ни праймери ключей. Ещё и опечатки в названии колонок, да и вообще я посмотрел на данные - там нет даже похожей колонки на ту которая использовалась бы для связи. Буду разбираться значит с заказчиком.
http://ideone.com/SuS3yI - палиндром http://ideone.com/eTXny3 - Лев Толстой. Здравствуйте. По ходу выполнения палиндрома возник вопрос. Почему не работает доступ к символу через $char = $text[1]. ни echo $char, ни var_dump($char) - ничего не выводят.
Всем привет =)) Я параллельно с php прохожу задания на freecodecamp, там есть бэк энд, вроде состоит в изучении js. Я так понимаю, раз я учу php, то мне не нужно изучать js?
>>855401 Ещё раз уточню. У меня есть таблица, в таблице столбец, в столбце данные. Тип - varchar, причём данные в виде цифр "5 876,00", то есть, миллионы от тысяч отделены пробелами. И Тысячи от единиц тоже. Мне нужно скопировать эти данные в другую таблицу, в столбец с типом double(10,2). Как? Я пробовал отдельной командой конвертировать тип данных, но получается какая-то шляпа: от данных остаются только первые цифры, всё, что после первого пробела, исчезает. Но в структуре таблицы этот столбец продолжает быть varchar-ом! Да как так-то? Запрос для конвертирования делаю такой: $sql_convert = "UPDATE $table_1c SET `НДФЛ` = CAST(`НДФЛ` AS DOUBLE(10,2));";
А для копирования: $request_copi_from_1c = "UPDATE `$value[0]` SET `НДФЛ` = ( SELECT `НДФЛ` FROM $table_1c WHERE $table_1c.`Организация` = $value[0].name GROUP BY $value[0].id )";
>>855840 Задача свелась к замене всех пробелов на ничего, а всех запятых на точки. $request = "UPDATE $table_1c SET `Оклад по часам` =REPLACE (`Оклад по часам`, ' ', '');";
Я бы в такой ситуации конвертировал данные на стороне PHP, так как там можно сделать например проверку регуляркой и обнаруживать нестандартные значения.
А твой код - вот если будет какое-то нестандартное значение - он же просто его в 0 сконвертирует молча.
Ну и кстати ты тоже выбрал неправильный тип. Тебе нужен не double (неточный тип), а decimal (точный). Изучи, в чем между ними разница.
Почему ты сделал эту ошибку? Потому что вместо последовательного изучения теории торопишься, пропускаешь темы.
>>855897 >Потому что вместо последовательного изучения теории торопишься, пропускаешь темы Задача поставлена, сроки оговорены, а знаю я скул или не знаю, никого не волнует. Так что приходится изучать на ходу. Щито поделать. За подсказки спасибо, выписал себе, обратить внимание на тип. Но это потом, сейчас мне главное показать хотя бы минимально работающее приложение.
>>855765 Если я правильно тебя понял, и проблема в том, что папка в которую загружают картинки общая для всех и в ней сложно найти фото. Сделай как в WP - фото загружается на хостинг в папку с сегодняшней датой.
Это нормально, что при добавлении ~70 столбцов, добавление происходит минуты две? Скрипт успевает свалиться в 504 гейтвей тайм-аут, но в БД добавляется всё до конца.
Тут я беру значения полей из столбца одной таблицы и вставляю во вторую таблицу столбцы с названиями, взятыми из этих полей:
$arr = array(); $q = "SELECT objects FROM $table_objects"; $request = mysql_query($q); if (mysql_num_rows($request) > 0) { while ($len = mysql_fetch_array($request)) { $object_name = $len['objects']; $sql1 = "ALTER TABLE $value[0] ADD `$object_name` int"; if (mysql_query($sql1)) { echo "столбец $object_name из таблицы objects успешно добавлен\n"; } else { echo 'Ошибка при добавлении столбца из таблицы objects: ' . mysql_error() . "\n"; } } }
>>855676 Спасибо, читаю, интересно. >Представление отображает данные, которые ему передали. В веб-приложении обычно >Представление обычно состоит из шаблонов страниц, в десктопных или мобильных приложениях Преставление - это код, который отвечает за отображение информации на экране, отрисовку кнопочек и других элементов интерфейса. Немного запутано и с опечатками.
>>855899 Конечно, JS это не только бэкенд (сервер-сайд язык), его вовсю используют во фронтэнде: как минимум для анимаций и аякса, как максимум - есть море фронтэнд фреймворков (React, Angular), есть шаблонизаторы на основе JS (JRender и тд). Сейчас ты вряд ли найдешь много интернет-сайтов без JS, то-есть ты должен быть готов к этому. Могу тебя немного успокоить - после изучения одного языка - второй изучается быстрее По крайней мере JS после PHP для меня прошел проще в разы.
>>855112 Ну можно и так, только обеспечь между ними взаимодействие, напиши конфигурацию апачу. Поставь несколько версий php. Поставь ngnix. Сделай так, чтобы менялось окружение с полоборота (скриптом). Это что я знаю по поводу линукса для пхп-разработчика.
Fatal error: Uncaught Error: Call to a member function fetch() on boolean in C:\xampp\htdocs\CodeCode\index.php:70 Stack trace: #0 {main} thrown in C:\xampp\htdocs\CodeCode\index.php on line 70
>>856171 Вместо объекта PdoStatement ты получил false. Проблемы скорее всего нужно искать в методах query/execute объекта PDO, без кода тяжело сказать.
>848545 >Калькулятор >Плохо, что switch с операциями скопирован 2 раза. От копипасты надо избавиться. Перенес switch в функцию, так будет правильней? http://ideone.com/gVfev9
>848545 >Навигатор >Попробуй написать решение с рекурсией Что-то слепил, немного не по предложенному алгоритму. Поэкспериментировал, вроде бы решает верно. http://ideone.com/fbSU5j
>Также, дам дополнительную задачку на рекурсию, чтобы лучше в ней разобраться http://ideone.com/yWXwSo
>Надо не добавлять элементы в и без того сложный массив, а сделать отдельные массивы. А так у тебя все вперемешку получилось: тут же и соседние станции, тут же и label которая не является соседней станцией. Как потом разобраться? Переделал немного.. Добавил отдельные массивы, убрал вызов searchPath, да остальные функции немного переписал и попробовал применить docComment, который ты посоветовал в ответе на «Вектор». Нормально ли здесь использовать global или нужно всё же передавать через параметры? http://ideone.com/0SJSa0
>Подозрительно что простановка минимального времени делается 2 раза: >>if ($pointValue['label'] < $minLabel && (!$pointValue['visited'])) { >>if ($paths[$point]['label'] > $newLabel) { В алгоритме сказано: ".. из ещё не посещённых вершин выбирается вершина u, имеющая минимальную метку", для этого я выполняю: > if ($pointValue['label'] < $minLabel && (!$pointValue['visited'])) { и далее "Для каждого соседа вершины u, кроме отмеченных как посещённые, рассмотрим новую длину пути, равную сумме значений текущей метки u и длины ребра, соединяющего u с этим соседом. Если полученное значение длины меньше значения метки соседа, заменим значение метки полученным значением длины", для этого я делаю: > if ($paths[$point]['label'] > $newLabel) { вроде бы всё по алгоритму…
>848545 >Числа прописью >чтобы не мучаться с пробелами, проще было наверно складывать слова в массив, а потом склеивать с помощью implode(). Переделал через implode(), http://ideone.com/tFv3R1
>848567 >Вектор Подобавлял тайп-хинты. Вынес создание отчета в отдельный класс * Попробовал применить docComment (точнее его подобие)
>Вообще, $rank не может быть равен нулю. Убрал значения по умолчанию. Убрал имена. Предполагал, что их можно будет указывать в дальнейшем, а в тестовом режиме можно обойтись и без них.
>Тут есть проблема: тот, кто наследует твой класс должен как-то догадаться что надо переопределить поля. Объявил абстрактные методы setSalary() и так далее, и переопределил их в дочерних классах. Для установки значений вызываю эти методы в конструкторе.. но что-то кажется, что не так делать нужно..
>Тут удобнее анализировать строку регуляркой. Она умеет захватывать части строки. Переделал через регулярку
>>848567 >Антикризисные меры >Вот это уже нарушение принципа единой ответственности Перенес антикризисные меры в класс CrisisCommittee. А такие вещи, как количество инженеров/менеджеров можно оставлять в Департаменте?
>Я бы проверял не человеческое название (которое может поменяться), а имя класса. Поменял, если я правильно тебя понял.
>Она удаляет всех инженеров, не разбирая ранги Переделал. Сортирую всех сотрудников по рангу, собираю всех инженеров (который не являются инженер-директором), слайсами беру 40% и удаляю..
>Если директора нет, будет ошибка обращения к несуществующей переменной Создал до цикла. Какое значение при создании будет правильней: NULL, false?
>думаю что неправильно создавать класс только ради смены зарплаты Убрал класс AnalystImproved. Теперь повышением зарплаты занимается антикризисных комитет. Здесь можно использовать значение по умолчанию setSalary($salary = 500)? То есть, ставим зарплату по умолчанию, как указано в задании, а в случае чего, антикризисный комитет может поставить свое значение.. Или нужно пересмотреть подход?
>Тут копипаста. Лучше настроить возможность клонирования компании и департаментов. То есть в классе Компании принудительно клонировать каждый департамент? А для Департамента аналогично для Сотрудника.. Если так, то добавил. http://ideone.com/wEdkij
Сап, друзья. Помогите, нужно передать данные из одной формы html на одной странице в другую форму html на другой странице. Не знаю js, по своей теме нарыл ссылку вот такую: http://www.javaportal.ru/javascript/examples/loadFormFIO.html НО не понимаю, как в поля формы на новой странице вставить значения из ПРОШЛОЙ формы. ХЕЛП.
Двач, я студентота и хочу искать подработку стажером. Уже предлагали, но надо кое что освоить. Вопросы такие. Насколько популярен php и есть ли у него будущее? Правда ли что все перекатываются на python и js? Будет ли php популярен ещё минимум лет 5? Какую книгу посоветуете? В головном треде пик устаревший донельзя. Что щас народ читает? Желательно чтобы не было разжованно как для даунов типа "переменная, это как спичечный коробок и короче там она имеет название..." Я лабы сдавал. Какие лучше выполнить задания для поднятия скилла? В десектопе идей масса, в вебе ни одной. Есть лишь желание поднять ftp, но это пока для меня круто. Слава Украине! Какие навыки нужны параллельно? HTML знаю, в CSS смогу походу, делов там. Нужно ли знать wordpress или что-то вроде этого? Linux или винда? Что лучше, удобнее?
Да, в JS функции - это "граждане первого сорта" в том плане, что их можно сохранять в перемнные, передавать и возвращать из функций. Также, функции в JS являются объектами, конструктором которых является встроенный "класс" Function (я пишу "класс" так как настоящих классов в яваскрипте нет, а Function - это функция-конструктор).
Так как функции - это объекты, можно делать даже такое:
Помогите с выбором базы данных для движка на PHP. Из требований разве что более-менее хорошая производительность, наличие понятной и структурированной документации и простота.
>>856263 Нужна БД, которая будет хранить овердохуя данных и отдавать их максимально быстро. Я одновременно учу PHP делая свой проект, и при этом хочу научиться писать производительный код. Я тот кун, у которого с json проблемесы были. У меня есть json-файл, в котором 10к объектов. Я его декодирую в многомерный массив, а затем 3 раза пробегаюсь по нему рекурсивным поиском через foreach, вынимая 3 разных ключа. В итоге, тот велосипед на основе json и многомерного массива, который я изобрёл - парсит данные по 2-3 секунды. Мне такая хуйня не подходит, по этому я решил хранить данные не в виде JSON, а перенести это дело в базу данных. И надеюсь, что с базой данных это будет работать быстрее(потому, что, сам понимаешь, если в продакшене страницы будут загружаться по 2-3 секунды - это никуда не годится)
Установил пхп, прописал путь к интерпретатору в нетбинсе, все работает, но вдруг ошибка: Call to undefined function mb_internal_encoding(). Расскоментировал в php.ini-development и php.ini-production строку с соответствующим расширением, перезапустил нетбинс и нихуя! Все равно не видит функцию. В чем может быть дело?
Команда Slack (которым я непользовался и не собираюсь, у которого клиент на HTML и я боюсь представить, сколько он потребляет памяти) написала пост (англ), почему они выбрали для серверной логики PHP: https://slack.engineering/taking-php-seriously-cf7a60065329
Да, PHP может быть не очень в почете у анонимных экспертов с имиджборд или начинающих JS программистов с Хабра, но настоящие разработчики не боятся его использовать.
Будет, только тебе нужно время чтобы тщательно изучить нормализацию БД (чтобы правильно проектировать таблицы - у меня даже есть урок по этой теме https://github.com/codedokode/pasta/blob/master/db/normalization.md ), а также индексы и оптимизацию БД (по моему про нее написано где-то в официальном мануале на англ).
php.ini-development это не конфиг, а образец конфига. Настоящий конфиг называется php.ini. увидеть текущие настройки PHP в командной строке можно, набрав команду
php -i
Нетбинс перезапускать вообще смысла нет так как это ничего не меняет.
>>856272 >только тебе нужно время чтобы тщательно изучить нормализацию БД Вот именно. А мне нужно просто какое-то решение, чтобы "из коробки" встало как надо, и работало. Вообще, я вести базу данных не планирую. Мне нужно просто из json перенести данные в базу, вот и всё.
А вот еще интересная вещь. Фейсбук сделал свою версию "улучшенного" PHP под названием Hack: (англ) https://docs.hhvm.com/hack/
Плюсы:
- больше типизации: можно указывать типы для полей класса, возарщаемых значений функции - генерики: можно делать классы, работающие с объектами определенного класса. Ну например, можно сделать класс универсальный Список объектов (List<T>) и из него получить Список Студентов (List<Student>) или Список Постов (List<Post>). - Hack поддерживается в HHVM - специальном оптимизированном итерпретаторе PHP и Hack, выполняющем тот же самый код быстрее - есть специальный синтаксис для HTML-шаблонов XHP, который позволяет проверять правильность кода: закрываются ли теги, правильно ли исопльзуются атрибуты. В отличие от чистого PHP, все данные в XHP автоматически экранируются с помощью htmlspecialchars, что защищает от XSS. И синтаксис HTML можно проверять до выгрузки на продакшен. - типизированные массивы (для которых задан список полей и типов) - и многое другое
При этом Hack обратно совместим с PHP, то есть можно взять готовый PHP скрипт и почти без переделки превратить его в скрипт на языке Hack.
По моему ты взялся за задачу не своего уровня. Для начала, надо точно определить, чем вызваны задержки и как можно поменять алгоритм работы, чтобы их избежать. В любом случае это требует определенных навыков и знаний. Просто так, погуглив, ты задачу вряд ли решишь.
Это же не задача из серии "как в jquery скрыть блок при нажатии на кнопку". Я не знаю такой волшебной функции или программы, которая все сделает за тебя.
>>856272 >PHP может быть не очень в почете у анонимных экспертов с имиджборд или начинающих JS программистов с Хабра, но настоящие разработчики не боятся его использовать. Ох, я в этой "Тусовке" уже лет 6. И мой вам совет, не слушайте всяких экспертов. Вам язык помогает задачу решить? Используйте. Все эти 'Эксперты' только говном кидаться могут. C++? нее, слишком небезопасно, с массивами работать сложна, и утечки памяти. Java? Неее, слишком муторно, и именовать переменные долго, к тому-же мы не знаем как Мавен работает. Go? - очередная поделка от гугла, через два году придумают Gu и от поддержки откажутся. Objective C - с ума сошёл, будешь рабом эпла, кроме них никто ведь его не юзает. Swift - не язык, а лол, купи макбуков себе и программируй, ну уж нет. C# - майкрософт маст дай, кто его юзает вообще? Да и возможностей маловато. К тому-же он вот вот помрёт. Майкрософт хотят прекратить его поддержку. ( Это мнение слышу вообще с 2008 года )
>>856284 Учиться нужно как раз на реалистичных задачах, которые могут возникнуть в процессе будущей работы. Я с точностью в 99.9% заявляю, что проблема именно в том, что массив дохуя огромный. У меня задержки начались как раз тогда, когда я этот поиск реализовал. Только тогда страница загружалась где-то полторы секунды и я забил хуй. А потом я добавил ещё парочку запросов к API, парочку foreach и парочку json_decode и в совокупности всё дало такую задержку. Так что, у меня один выход - искать замену json. Выбор невелик. Можно сказать, его нет. Я по этому и спрашиваю на счёт бд. Будет ли поиск в БД быстрее, чем поиск в массиве?
То есть ты даже не мерял, а нашел причину "по ощущениям". Тогда сравни "по ощущениям" алгоритмы, по которым работает твой поиск и поиск в БД, и получишь ответ.
Обычно вызов render() идет в конце метода контроллера. Мы подготовили все нужные данные, и вызываем View чтобы отобразить страницу. По частям ее отображать неправильно, так как контроллер не должен знать, из каких частей она составлена, это задача View.
То есть типичный метод контроллера выглядит так:
.. подготовка данных ... $this->render(...);
Иногда вместо render идет редирект (например, при обработке формы), иногда что-то другое (например, выдача страницы ошибки или какого-то нестандартного HTTP-ответа).
Также, путь templates\search.phtml лучше писать через прямой слеш / , так как обратный слеш работает только в Windows.
>>856302 На самом деле, мне в голову только что пришла гениальная мысль. В одном массиве json-данных содержится 23 ключа со значениями, а использую из них я всего 4. Если бы можно было убрать лишние 19 ключей со значениями, то это ускорило бы загрузку в почти 4 раза. Осталось только придумать, как это сделать в огромном файле.
Делаю вывод таблицы с данными, которые взяты из БД. Прямо по примеру с https://habrahabr.ru/sandbox/49535/ только запрос свой. И всё хорошо, но самая первая строка данных пропадает. Насколько я понимаю, mysql_fetch_array при каждом вызове сдвигает указатель, поэтому такая шляпа и происходит. Как это пофиксить?
>>856495 > 2016 > использовать mysql_* функции Их выпилили к чертям из нового PHP, зачем ты учишься по статьям 2012-го года? Вот адекватный подход для работы с БД: http://www.phptherightway.com/#pdo_extension А mysql-функции просто молчат, когда что-то пошло не так, нужно после каждого вызова делать проверки.
>>856528 >нужно после каждого вызова делать проверки Ну приходится. Но работает ведь? Что полезного даёт это самое PDO, кроме экстеншенов из коробки? Я без сарказма, действительно интересно.
- mysql_* функции не поддерживают подготовленные запросы: http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php - Нет транзакций - Нет и не будет поддержки новых фич из MySQL 5, так как расширение разрабатывалось давно - Нужны костыли для обнаружения ошибок
> Но работает ведь? Пока что. Ты понимаешь, что его не поддерживают? Его не улучшают, не чинят, его полностью дропнули ради лучших аналогов.
>>856537 + PDO поддерживает относительно единообразный интерфейс для работы с разными СУБД (MySQL, SQLite, PostgreSQL), а mysql_* функции и mysqli - только в MySQL.
>>856266 А ты уверен, что проблема именно в парсинге? Может быть задержка получается, когда ты выводишь данные на экран? Если у тебя там овер 9к строк. Или ьы не выводишь ничего, но все равно тормозит?
Привет, друзья. Попал в очень плохую финансовую ситуацию, нужно выбираться. Так как раньше уже пробовал кодить и более менее представляю, что к чему, планирую поднять знания и пойти погромировать на апворк или другую биржу. Сейчас возможно человеку без репутации на биржах получить заказ? Разумеется, на php, верстке, около того. Спасибо за внимание.
Кто давно следит за миром PHP, как много из того, что предлагают в RFC в конце-концов обретает жизнь? Сейчас смотрю, там аннотации, генерики, пайп-оператор для избавления от fun1(fun2(fun3(...))), выглядит интересно.
>>856528 >А mysql-функции просто молчат, когда что-то пошло не так PDO между прочим тоже молчит либо говорит что у тебя ошибка. При этом не говорят где. Тоесть отличий никаких.
>>856548 >- mysql_* функции не поддерживают подготовленные запросы: Эм, но ведь поддерживает. >- Нет транзакций Ненужны. >- Нет и не будет поддержки новых фич из MySQL 5 Из которых действительно нужных фичь... Что вообще ввели 5 мускулы? >- Нужны костыли для обнаружения ошибок Но ты мог сам отследить ошибки, а тут работает вообще непонять как. Тоесть вроде и есть запрос, но всегда возникают сомнения что к чему. >>856557 > + PDO поддерживает относительно единообразный интерфейс для работы с разными СУБД Из которых всё равно все юзали только MySQL. А остальное юзали два с половиной зипстера для решения лабораторной.
>>856865 Сорян, там 14 и 15 строку надо было местами поменять. Сначала считать сколько уже выплатил, а потом прибавлять сколько долга осталось. http://ideone.com/skKyUm Локально всё работало, а на идеон залил бажный код. Печально.
>>856865 Кстати круто что у тебя payout отдельно идёт переменной, можно просчитать для разных возможностей не меняя код. Тоже думал так сделать, но тут постоянно критикуют за лишние переменные и строки.
>>856946 Сделал задачи по приведению телефона к нормальному виду. Кстати я делал усложнённую версию и добавил в массив кучу того, что предложили в старых тредах. Так что хардкор и нежность. http://ideone.com/QoBz84
Начал делать коммит и понял почему Ipad вышел неправильно. PHPstorm говорит что код не будет работать и ругается именно на строку где я считаю сколько осталось денег отдать банку. Уж не понимаю почему так.
Ты ведь имеешь в вижу mysqli? mysql-расширение уже устарело и не поддерживается.
Одни эксепшены уже фича, ради которой стоит переходить. Так как ты сэкономишь тонну времени на написании if (!$result) после каждого вызова mysql-функций.
Работа с плейсхолдерами в PDO сделана чуть удобней чем в mysqli.
Также, PDO может работать с другими БД кроме mysql.
В случае, если ты написал неправильный запрос, база данных вернет ошибку, PDO выбросит исключение с ее текстом, а mysqli - нет. Чтобы в mysqli увидеть причину, надо после каждой операции с БД писать if с проверкой результата. Я подозреваю что ты просто его не пишешь (то есть игнорируешь любые ошибки), потому что если бы ты писал, ты бы вряд ли так хорошо отзывался об mysqli.
Как я понимаю, mysqli не предназначен для использования напрямую. Ты должен сделать свой класс-драйвер, который будет преобразовывать ошибки в исключения, передавать плейсхолдеры в удобном формате и тд. Напрямую с mysqli очень неудобно работать, код громоздкий и много лишней писанины.
С PDO тоже впрочем будет удобнее работать через класс-обертку.
Очень странно что ты это не упоминаешь. Может ты и не работал с mysqli или использовал ее как-то неправильно?
Вот ты пишешь "не говорит, где ошибка", но случае ошибки в запросе mysql сообщает "... before xxx" то есть указывает точное место синтаксической ошибки.
>>857051 >Тебе стоит получше изучить SQL наверно. У транзакта слишком неявные. >PDO выбросит исключение с ее текстом Чот весь день вчера бился с ним. Не выкидывало вообще ничего! И вообще вёл себя так, будто всё отлично, хотя обычный Select whare выполнял с 0 возврата. >Чтобы в mysqli увидеть причину, надо после каждой операции с БД писать if с проверкой результата. Так этож круто. Написал что хочешь выдеть ошибку и она появится. Что делать в PDO я вообще непойму. >Я подозреваю что ты просто его не пишешь (то есть игнорируешь любые ошибки) setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); >С PDO тоже впрочем будет удобнее работать через класс-обертку. Класс надо писать всякий раз как надо к базе обращаться... Странное определение удобства. > передавать плейсхолдеры в удобном формате Тут тоже странности, неправильно плэйсхолдер переал, тебе PDO тоже ничего не пишет... >Может ты и не работал с mysqli или использовал ее как-то неправильно? Работал, но пол года всего. >mysql-расширение уже устарело и не поддерживается. Раньше и сним работал, года 4. >случае ошибки в запросе mysql сообщает "... before xxx" то есть указывает точное место синтаксической ошибки. Это круто ведь.
> Написал что хочешь выдеть ошибку и она появится. Что делать в PDO я вообще непойму.
Включить выброс исключений достаточно (если у тебя отключен показ ошибок, то еще смотреть в логи).
Вот в итоге ты не разобрался толком как работает PDO или mysqli, и как включить отображение ошибок в пхп, а споришь.
> Класс надо писать всякий раз как надо к базе обращаться... Странное определение удобства.
Тогда найди готовую библиотеку.
>>случае ошибки в запросе mysql сообщает "... before xxx" то есть указывает точное место синтаксической ошибки. > Это круто ведь. Ты даже не понял, что я написал. Сервер MySQL (не расширение mysqli) возвращает ошибку, PDO преобразует ее в исключение, а mysqli сохраняет где-то внутри и надо специально вызвать функцию, чтобы ее получить.
В общем, у меня сложилось впечатление что тебе стоило бы начать с изучения основ PHP, как показать текст ошибки или исключения, как отлаживать код.
>>857068 Всёравно неявные. >>857066 >Вот в итоге ты не разобрался толком как работает PDO или mysqli, и как включить отображение ошибок в пхп, а споришь. Всмысле, я код скинул по которому смотрю ошибки. Явно разобрался же. >Тогда найди готовую библиотеку. Это ещё более неудобно. Удобно, это когда берёшь и используешь. А тут костыли какие-то. >Ты даже не понял, что я написал. Сервер MySQL (не расширение mysqli) возвращает ошибку, PDO преобразует ее в исключение, а mysqli сохраняет где-то внутри и надо специально вызвать функцию, чтобы ее получить. Что ты такое говоришь? В PDO тоже надо писать PDO::ERRMODE_EXCEPTION иначе ты ничего не получишь! Тоекть профит о котором ты говорил, его просто нет.
>>857066 >В общем, у меня сложилось впечатление что тебе стоило бы начать с изучения основ PHP, как показать текст ошибки или исключения, как отлаживать код. Я пытаюсь понять в чём профтиты использования, но пока я вижу только костыли вместо преимуществ.
require "D:\\OpenServer\\OpenServer\\modules\\php\\PHP-7-x64\\vendor\\autoload.php"; сделал так - заработало поясните ещё за двойные слеши, когда их пишут?
>>857242 > надо ебаться 7 лет и переспросить 20 человек. Проще минут 15 потратить на документацию композера. Высокоуровневый инструмент - не причина проблем. Ты не понимаешь как работает автозагрузка и ждёшь, что композер заработает, даже не используя его в своём коде. Всё, что тебе нужно сделать, это создать папку, перейти в неё, вбить там в консоли composer install либанейм, и подключить autoload.php из появившейся папки vendor. Это делается за секунд 10-15 без учёта времени установки пакетов.
>>857247 Сделай echo "aa\njj" и echo "aa\\njj", в первом случае PHP увидит \n (перенос строки), а во втором - обратный слеш, который используется в неймспейсах.
Добавляем задачу #13 к тяжелому бремени проверок опа задачек с айфонамирастудентамиобменниками: https://ideone.com/N7bizo .
У меня вопросы.
Правильно ли я поступил, что не делил методы на дневные и ночные, а в борьбе с копипастой соединил их, разделив логику кода через аргумент timesOfDay?
И нужно ли было решать отдельно для разных времен суток. Я вначале решил на все сутки, потом перечитал условие и подумал что ты не с проста акцентировал на ночь у солнечных панелей.
>>856999 Собственно вот поиск мыла. Долго мучился именно с выводом в нормальном формате, а не в формате массива. Оп сделай пожалуйста задачи на двумерные массивы! https://ideone.com/I3ZJt9 Тут «Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок: В общем как всегда 2 варианта. str_replace https://ideone.com/IZHbzC а тут preg_replace https://ideone.com/BcQcvB
Если вы думаете что я где-то затупил, и можно было избежать повторений - напишите. Сам я этого не вижу. preg_replace отказался работать с большой регуляркой, потому пришлось искать каждую опечатку отдельно.
>>857445 Если ты сделал задачу про Grammar Nazi, сделай скрипт, которы вместо сообщения об ошибках будет молча их исправлять. Ах, да. не делаю, потому-что в прошлых достаточно убрать [] и всё будет выводиться.
> Я не совсем понял, что значит доделать шифрование до ок уровня, поэтому просто добавил шифровальные значения для остальных букв алфавита Это и требовалось.
Все верно.
http://ideone.com/0kXt6Z - l33tspeak (не так-то просто оказалось подобрать коды к киррилическим букам, лол)
> echo "{$word1[mt_rand(1, count($word1))]} {$word2[mt_rand(1, count($word2))]} {$word3[mt_rand(1, count($word3))]} \n Как-то длинно и запутенно, не стоило тут писать такое сложное выражение, а стоило наверо вынести в переменную.
Так как первые 2 строки повторяются, можно было поместить их в цикл из 2 шагов.
>>850742 >хорошо оплачиваемый Это сколько в деньгах? Просто не думаю что [хорошо оплачиваемый] возможно при [не знает про DI] и [держит логику в контроллерах].
Анончики, взяли на стаж, а здесь на зенде работают и после ларавела это полнейший пиздец, элементарные вещи типа роутов здесь сделаны через жопу с сотнями вложенных массивов.
После ларавела где все легко и просто, это просто пиздец болото какое-то.
Стоит ли работать здесь и тратить свое фремя на изучение зенда или искать что-то получше?
РЕБЯТКИ, АТЭНШН! Мне надо записать в переменную типа строки код пхп страницы с хтмл вместе, как это делается? А то я не знаю как создать новый файл((пхп)страницу) и что-бы там переменные под себя переписать не в ручную а само все делалось, но если ты не понял что я хочу и горишь желанием помочь, напиши мне на ящик: [email protected]
Анон, объясни пожалуйста по задаче с тестами: https://gist.github.com/codedokode/a455bde7d0748c0a351a Я просто слабо представляю, как это тестирование происходит. Например я хочу тестировать поиск файлов. За него отвечает класс SearchGateway и его метод getResults. Мне их нужно тестировать отдельно от всего приложения? Тоесть я создаю папку tests, в ней файл с класом SearchGatewayTest где я через require подключаю исходный клас SearchGateway и делаю что-то вроде: public function testGetResults(){ $searchGateway = new SearchGateway(); $searchGateway->getResults($someString, $somePageNum, $someFilesPerPage); } Опустим здесь логику самого теста. Я все правильно понимаю? Но ведь в тестируемом класе может быть куча зависимостей, которые необходимо как-то эмулировать. Или мне нужно как-то встроить класс с тестом в приложение и тестировать его в контексте всего проекта? (не знаю хорошо ли я объяснил, но думаю ты понял)
>>857051 >А в чем, интересно, преимущества mysqli? Фактически в том, что это тот же самый старый добрый mysql только с новыми свистелками. Видимо его прикрутили чтобы олдфагам было удобнее код переписать. Но таки обидно что поддержку старого выпилили. Уж очень быстро на нём всё проектировалось.
Какие книги стоит читать по PHP и в целом программисту? У меня в библиотеке уже есть пара десяткой по PHP, но всё это устарело ещё лет 5 назад, после вкатывания PDO, а новых книг с PDO и Mysqli и впомине нет. После 2012 вообще книг стало мало. Если раньше кодишь, кодишь себе, раз в 2 месяца купил книжечку, прочитал её и вот 2-3 новые фичи для себя отметил. А тут - вообще чувствую что развитие закончилось.
Юнит-тесты преимущественно тестируют отдельный метод или класс, в изоляции от остального кода. Для этого либо выбирают такие классы, у которых нет зависимостей, либо делают моки/стабы (то есть классы-пустышки) и подсовывают вместо зависимостей - DI это позволяет, хотя иногда для этого приходится делать еще и интерфейс.
Мне не очень нравится идея с моками, так как это трудоемко и тестирует не всегда то, что нужно.
Если же у класса есть зависимости, то придется тестировать весь слой, зачастую вместе с базой данных. Это осложняет тестирование. Потому нам приходится предусматривать какие-то дополнительные меры, например, вставлять данные в базу перед тестом или использовать специальную тестовую базу с вбитыми тестовыми данными.
Код тестов обычно пишется так же как и реальный код для использования класса. Самый простой тест - просто вызвать метод чтобы убедиться что он хотя бы выполняется (smoke test - так назвали базовые тесты радиоаппаратуры, когда ее включали и смотрели не пойдет ли дым).
В твоем случае поиск файлов - это высокоуровневый сервис, опирающийся на низкоровневые классы и базу данных. Если тестировать его в изоляции (заменив например PDO на мок) то ты тестируешь не сам поиск, а скорее способность SearchGateway делать SQL запросы (иногда именно это и требуется, тестировать класс в изоляции, и тогда и нужны моки). В нашем случае поиск опирается на базу данных и без нее тестировать его бесполезно.
Потому чтобы протестировать интеграционным тестом этот класс, нам надо сделать примерно такой сценарий. Мы сначала проверяем, что поисковик ищет запрошенные данные и не ищет незапрошенные:
- внести в базу заранее подготовленные данные - поискать слово, которое есть в этих данных и убедиться что результат содержит нужные объекты - (негативный тест) поискать слово, которого нет в этих данных и убедиться что ни одного тестового объекта не найдено - при желании почистить базу от тестовых данных
Также там еще при желании можно добавить тесты на обработку разных символов, а именно:
- тесты на регистронезависимость поиска - тест на случай если поисковая строка содержит спецсимволы - тест на пустую поисковую строку
Реализовать заполнение базы можно так:
1) начать транзакцию, вставить данные, провести тест, откатить транзакцию 2) сделать отдельную базу (можно для скорости не на реальном а на RAM-диске) и залить в нее заранее подготовленные тестовые данные (fixtures). Есть библиотеки, позволяющие подготавливать такие данные в виде конфигов. Их надо будет поддерживать и обновлять по мере доработки кода.
Вариант 1) проще в реализации, вариант 2) надежнее.
>>858095 >В Оп посте есть пара книг, Да, тут такое дело, что я их уже прочитал. >еженедельный PHP дайджест на хабре. Уже год как перестал читать. Там направление пошло в сторону "С ваи Джонни Ноксвиль, и сегодня мы будем писать велосипед для распарсивания массива 19мерной вложенности.", "Я написал функцию с 78 параметрами на вход, а вам слабо?!!!". Ну и какая-то непонятная тусовка там сложилась. В коментариях года три не видел ничего что можно было бы трактовать как обсуждение. Но в любом случае спасибо анон.
>>858102 А, не знал что он так круто развился, спасибо. Буду его читать теперь. >Об асинхронной обработке сигналов в PHP без тиков, реализованной в PHP 7.1. То чувство, когда GoDaddy ещё даже 7 не накатил, а уже 7.1 все обсуждают.
<table border=0 align=center width=70%><caption><strong>Отработанные часы</strong></caption><tr><td><strong>name</strong></td><td><strong>Архангельск A572</strong></td></tr><tr><td><input name='name' value='Иванов Александр Викторович'></input></td><td><input name='Архангельск A572' value=''></input></td></tr><tr><td><input name='name' value='Петров Евгений Геннадьевич'></input></td><td><input name='Архангельск A572' value=''></input></td></tr><tr><td><input name='name' value='Сидоров Владимир Борисович'></input></td><td><input name='Архангельск A572' value=''></input></td></tr></table>
Из mysql выкусываются два нужных столбца и столько строк, сколько человек приписано к объекту. Данные можно редактировать. И теперь нужно записать их обратно. Проблема в том, что заранее нельзя сказать, сколько строк будет. Ну и имена тоже нужно как-то узнать. Допустим, я сделаю ещё одну кнопку, по которой данные из инпутов улетят в скрипт. Но я нифига не понимаю, как передать, к каким людям и объектам они относятся.
>>858311 >$compSum = ($compDice1 + $compDice2) > $anonSum = ($anonDice1 + $anonDice2) Зачем так городить, когда у тебя уже есть к этому моменту $compSum и $anonSum? Сравнивай только их. А так всё нормально.
if (($anonDice1 + $anonDice2) > ($compDice1 + $compDice2))
В твоем варианте, где ты засунул в одну строку 3 действия, читаемость получается хуже, а у меня сразу видно сколько тут действий и в каком порядке они выполняются.
Хуже того, ты еще в каждой ветке ифа заново эти переменные вычисляешь.
>>858370 >Не надо делать инпуты с одинаковыми именами Знаю, просто не стал возиться с именованием того, что потом всё равно переделывать.
Тут проблема, как это впихнуть в аякс. Ведь если просто поставить кнопку, то в пхп-скрипт улетят все данные из инпутов и страница перезагрузится. А мне хочется, чтобы не перезагружалась.
>>858379 После вопросительного знака не делает букву прописной, также почему-то два пробела между предложениями. Это неправильно. >($offers) as $offer Можно просто: $offers as $offer. Почему у тебя "предложение" переведено как "offer"? Должно быть "sentence".
Взгляни вокруг, огланись назад Интерфейсы с тобою связаться хотят, ООП не таков, каким кажется он, Тестами каждый окружён. Мне всё вокруг подвластно degug, Сделать свой выбор должен ты сам, Встреть свою судьбу. Быть программистом королём, Всех программистов королём, Если дух твой силён, Программистом королём.
P.S следуй в закреплённый или www.google.com/spoiler]
>>858484 >После вопросительного знака не делает букву прописной Ага, добавил 'или' к регулярке и всё заработало. На самом деле по хорошему надо бы ещё восклицательный знак добавить ну и это вот всё, только хочется побыстрее к MVC перейти выполнив эти задания. Внезапно выяснилось что хром сам зменяет все двойные пробелы на одинарные. Очень "Удобно." Написал тест с print_r и всё изменилось. Странно. >($offers) as $offer Можно просто: $offers as $offer.
>Почему у тебя "предложение" переведено как "offer"? Должно быть "sentence". Это гугл транслэйт так перевёл. Я понимаю что это скорее предложение что то сделать чем предложение. Но альтернатив исать не стал.
> https://github.com/TheSidSpears/Students/blob/master/httpd.conf Не надо вставлять целиком конфиг, где 99% никак не относится к задаче. В данном случае стоило бы вставить минимальный пример конфига виртуального хоста, то есть только блок VirtualHost. Например в дебиане/убунту, каждый хост описывается в отдельном файле в /etc/apache2/sites/available/ У тебя правда в конфиге вообще виртуальных хостов нет (ты на каждый проект будешь отдельный Апач запускать?), так что незачем было его вставлять, проще было в ридми вписать пару нужных строк.
> function Start(){ Имя функции пишется с маленькой буквы
https://github.com/TheSidSpears/Students/blob/master/app/Controllers/FrontController.php#L28 > header("Location: error?code=404"); После редиректа скрипт продолжает работать. Также, ты нарушаешь правила HTTP, при отсутствии страницы надо отдавать код 404, а не редирект. Вообще, я часто вижу такую ошибку, когда вместо отдачи страницы ошибки делается редирект. Это в каком-то учебнике так учат?
В твоем случае получается такое: мы просим страницу, нам говорят, она есть, но переехала. Мы открываем новый УРЛ - а там 404. Выглядит как сломанный сайт.
> $controller=new $controllerPath($this->c,$router); А зачем мы роутер в контроллер передаем? Выгдядит немного подозрительно.
> $errorCode=$controller->$actionFunc(); > $controller->showView(); Обычно делают так, что экшен контрллера сразу же и страницу рендерит. В чем смысл разбивать одно действие на 2 метода, не очень понятно. Наоборот, это создает сложности, когда надо отдать не HTML страницу.
Насчет main/search - я бы там вообще не делал 2 отдельных УРЛ, а сделал бы один общий.
В случае если зарегистрированный пользователь заходит на страницу регистрации, логичнее делать редирект например на главную с уведомлением. Но ошибка 403 конечно лучше чем ничего.
https://github.com/TheSidSpears/Students/blob/master/app/Controllers/ProfileController.php#L96 > Удаляет всё, что не 'name','sname','group_num','points','gender','email','b_year','is_resident','hash' Лучше было написать "фильтрует поля по белому списку" - не надо писать сам список, так как он есть в коде и когда код будут править, список в комментарии могут забыть обновить.
> @param array $post Глобальная переменная $_POST Лучше писать "данные из формы в виде ассоц. массива"
> public function getStudentByHash($hashFromCookie){ Переменную лучше назвать $hash, так как модель в MVC не должна знать, откуда к ней приходят данные, как будет использован этот метод и не должна знать ничего о куках. Она лишь знает что надо найти студента по хешу.
Вообще, конечно методы вроде addInfo - это открытый путь к уязвимостям, так как люди забывают делать фильтрацию и передают туда сразу $_POST. Гитхаб так взломали однажды (хоть он и на Руби написан).
Насчет валидатора - у тебя нет желания как-то сделать его более ООП? Например, добавить классы для элементарных валидаторов одного поля или для списка ошибок?
> Если пользователь обращается к "site.ru/path/to/public", то браузер автоматически дописывает "/" в конце, Это не браузер дописывает, а Апач редиректит при попытке открыть папку без слеша в конце. Браузер не может знать, как устроен сервер внутри и соответственно догадаться, что надо дописать слеш, не может.
Игнорировать просто так слеши не стоит, так как это влияет на разрешение (резолвинг) относительных УРЛ:
/page/ + url -> /page/url /page + url -> /url
если я не путаю ничего (проверь!). У тебя есть такие относительные УРЛ и потому возможен баг.
> <div class="col-md-12 well"> > Вы успешно зарегистрировались В бутстрапе есть классы вроде alert-success для сообщений.
> if( (isset($user->email)) and ($user->email==$student->email) ): Лучше проверять наверно по hash или id как неизменному значению. А если используется правильный дата маппер с Identity Map, то можно просто писать $user === $student.
Привет всем. Прошел курс доброанона на http://archive-ipq-co.narod.ru/ Подскажите, пожалуйста, что учить дальше? Хтмл, цсс прошел тоже на код-академии. Хочу сделать сайт. Где понятно написано о создании вэб-сервера и про хттп протокол? а вот, нашел у него же http://archive-ipq-co.narod.ru/tsuzuke.html годные ссылки или что-то другое посоветовали бы?
Сап а PDO можно втыкать в функцию? Сейчас делаю простой селект через PDO, фактически "Select * from table where poll = ".$select (утрирую конечно, но схема понятна) Но результат функция показывать отказывается... Вне функции при этом всё работает.
>>858860 ну как я понял нужно сейчас изучить: 1) html checked 2) http протокол нет 3) css, конкретнее bootstrap в процессе 4) js 5) хз что по жс 6) в питоне как создавать htmlсервер, как обрабатывать запросы, формы и куки 7) работа с базами данных в php
>>858882 PDO собственно крутая штука которая позволяет из PHP работать с большинством если не со всеми БД. Ничего особого учить не надо. Выучи как создавать БД, как обновлять\удалять\выбирать записи. Вроде ты должен был это елать когда выполнял список студентов из задачника опа. >А Yii - это модный Фреймворк? Yii Yii2 до сих пор востребованны Laravel учить, много кому из работодателей она нужна. Ну и писать на ней легко и просто, как говорят.
>>858888 основы БД знаю. ER-диаграммы, больше теоретическую часть, так сказать. а, вообще говоря, есть разница при работе с разными БД? с MySQL и mongodb? или там эта разность меня ебать не должна, т.к. я делаю sql-запросы?
У меня дурацкий вопрос. Что такое "имя поля" в MySQL? Имя столбца - понятно. Вот цитата из учебника:
>SET. После этого ключевого слова должен идти список полей таблицы, которые будут обновлены и непосредственно сами новые значения полей в виде: >имя поля='значение' >Следующий пример производит обновление поля country у ВСЕХ записей в таблице users: >UPDATE `users` SET `country`='Russia'
Получается, `country` - это и есть имя поля? Но где оно в таблице?
>>858945 То есть, "поле" эквивалентно "столбцу"/"column"?
>обрамляются в ОБРАТНЫЕ кавычки, только поля С этими кавычками я уже чуть не поехал. Это как описание самурая без меча, который подобен самураю с мечом, но только без меча.
>>858985 >$strawberryBank = countSum(1.02, 0, 39999, 5000) + 7777; ОП, помнится, говорил, что 7777 надо изначально прибавлять и рассчитывать кредит уже с этой суммой. Ведь у анона нет денег, он, получается, и на эту сумму берёт кредит, лолка.
Такая хуйня аноны, хочу слать сообщения в вк через скрипт на пехепе. Взял готовый код с хабра, а он не отправляет русские буквы. Точнее, приходит говно вида ?4??4??4??4??4??4??4??6?
Ребят , объясните пожалуйста , почему в пхп только одна переменная на всё , или же это не так ? У меня друг начал изучать пхп и когда я у него спросил какие там переменные он сказал что она там только одна и это меня очень сильно смутило тип как так ......
>>859217 >>859220 Допёр . Прост друг как то так объяснил , что мне показалось что прям вот выделить переменную под что то нельзя и увидел в этом полнейший бред , но подумал что полюбому это не так и есть всему объяснение ... но конечно эти ваши интернетные коды уххх.... вот не то что нормальные человеческие , ну там всякие джава с с+ рубик )))))))))))))
Пишу чат, в котором будут комнаты и всё такое. Дошёл до написания кода для отдельной комнаты и возник вот такой вопрос. Пданирую хранить данные о принадлежности того или иного пользователя к какой-либо комнате в таблице с двумя полями id_user и id_room. Само собой, при заходе в комнату какого-либо пользователя данные из куки (id_user создаётся при введении своего ника) должны записываться в соответствующую таблицу если они туда ещё не записаны. Выходит, надо создать условие, если данных id_room нет (проверяется при помощи запроса в базу данных, ищется в таблице), то собственно их записываем, если они есть и принадлежат этой комнате то ничего не делаем, даём пользователю общаться (если у него id_room другой комнаты, просто перебрасываем его в ту комнату, например если в адресной строке пользователь изменит id). Сам чат само собой аяксовый и будет работать без перезагрузки, но любой пользователь в любой момент может перезагрузить страницу, и каждый раз будут дополнительные запросы к базе данных ради проверки принадлежность ид пользователя, к этой комнате, не слишком ли это будет напрягать базу сам сайт? Может лучше стоит при первом заходе пользователя в комнату и добавлении его id в таблицу, просто повесить на него куки которая будет свидетельствовать о том, что он авторизован в этой комнате и проверять по ней?
С прошлого четверга провожу по 12 часов в день за кодом на PHP. И что-то в Воскресенье провёл аж 14 часов. Пилил админку для велосипедного бложика. Напилил только отправку и редактирование постов с подсветкой кода. Хотя в планах было едва-ли не 12 тасков закрыть. Аноны, а это нормально с такой скоростью писать? Учитывая что пишу без либ и юзаю PDO. Или дальше будет быстрее с опытом?
Что то я торможу, надо сравнить две переменные как числа, одна из них берётся из переменной в адресной строке, другая из базы данных (из поля int). Обе имеют значение string, поэтому сравнить их как числа не получается, как поступить, просто перевести при помощи (int)?
>>860133 Молодец. Ещё добавлю что строка выводиться потому что ты берешь выражение в кавычки. Т.е если бы ты написал без них echo $x ✱ $x; то вывелся бы ответ.
>>860356 Смотрю сейчас код калькулятор куна. И в голове мысль о том, что я кодю уже несколько недель, а даже не понимаю что тут написано. Что такое abstract class ? Что такое __construct? Что вообще за $this-> ? В итоге из всего кода я понял только паттерн регулярки.
Как-то грустно становится что за 3 недели я узнал так мало, хоть и честно выполнял все задачи опа сам.
Подскажите по задаче про файлообменник, точнее про начало работы с Silex. Я просмотрел офф - мануал. Этого достаточно для работы с ним? Нужно ли читать мануал по Symphony? Нужно ли использовать классы Symphony, например Request или FileUploaded?
>>860375 > Нужно ли использовать классы Symphony, например Request или FileUploaded? Не шути, анон, конечно же нужно, зачем тогда фреймворк берёшь если будешь по старинке суперглобальные переменные юзать? В доках по Silex'у всё-равно частенько будут мелькать фразы вроде "Для того, чтобы ознакомится детальнее с этим компонентом, почитайте о нём в документации Symfony".
>>860354 Что-то у тебя там с квадрилионами не так - что это и откуда? Числа переводит неправильно либо просто ты что-то там спутал. >Что такое __construct? Что вообще за $this-> ? Это объектно-ориентированное программирование, следующая тема, которая будет. Там и написано, что калькулятор на ООП.
Сделол задачу про студентов из ОП поста. Лень было писать кучу проверок, это скучно и никому по сути не нужно. Данные которые отправляет пользователь почти не проверяются. В остальном я старался. Посмотрите пожалуйста что можно сделать лучше, и можно ли такое показывать на собеседовании?
>>860590 >>860591 >можно ли такое показывать на собеседовании Я бы не стал. Там много чего не так, начиная с сомнительной реализации ActiveRecord заканчивая смешанной с кодом верстки. >Лень было писать кучу проверок, это скучно и никому по сути не нужно Вот это не понял, вроде бы валидатор у тебя нормальный.
>>860598 ActiveRecord я даже не знаю что это? >смешанной с кодом верстки Вот это проблема. Так и не придумал куда это деть. С одной стороны в код верстку вставлять нельзя, с другой стороны кто то говорил что логику отображения крайне не желательно вставлять в шаблоны. Что тут делать, не понятно. Ну сейчас посмотрю как другие делали. >валидатор у тебя нормальный К нему много чего нужно дописать. Да и в строку поиска можно СКЛ код вставить.
Sliex это микрофреймворк, созданный на основе нескольких компонентов симфони. Симфони содержит в себе компоненты, которые не привязаны к ней намертво, а которые можно использовать отдельно, что авторы Силекса и делают (и ты кстати при желании тоже можешь их использовать).
> `local` enum('местный','иногородний') NOT NULL, Лучше использовать латинские идентификаторы. Мы ведь все равно их не выводим пользователю, а используем только как идентификатор.
email в качестве PRIMARY KEY плохая идея так как его можно поменять. Если будут какие-то другие таблицы, ссылающиеся на таблицу студентов - придется как-то менять значения и в них, что неудобно. Вообще, первичный ключ все-таки лучше никогда не менять.
Потому тут стоит использовать либо естественный ключ - хеш либо добавить искуственный id.
В SQL дампе не должно быть команд создания базы данных.
Желательно сделать отдельную папку для публичных файлов, а не вываливать весь код в публичную папку.
Валидировать лучше не массив неизвестной структуры, а модель студета. Иначе твой валидатор заточен только на работу с формой и им нельзя например проверить данные из базы.
> $vld = new Validator(); Зачем так сокращать? Лучше писать $validator. IDE все равно использует автодополнение так что печатать это второй раз не придется.
> $disp->DisplayIndexTop(); > $disp->DisplayTable($abtrList); > $disp->DisplayIndexBot(); Контроллер не должен разбираться, как вывести страницу и из каких частей она состоит. Вызов для вывода страницы должен быть один.
> private $name, $surname, $sex, $groupId, $email, $balls, $birth, $local; Надо писать каждое свойство отдельной строчкой, так требует PSR и в твоем варианте нельзя прокомментировать свойства.
> public function CreateNew($arr) { У тебя тут расчет что массив содержит все нужные поля. Но вообще, массив POST может и не содержать их или содержать массивы вместо строк например. Нужно сделать чтобы код не выдавал ошибок в такой ситуации.
> public function GetAllAbiturients() { Наверно удобнее возвращать массив объектов, а не массив массивов непонятной структуры.
Твоя система авторизации никак не защищает от регистрации чужих данных.
Более того, твой код в Displayer - это сплошная копипаста. Ты почему-то даже не попытался оптимизировать его за счет цикла. Это плохо, не надо копипастить однотипный код, надо думать, как без этого обойтись.
> $editorPage = str_replace("%groupId%", $abtrData['3'], > $abtrData['3'], Вот это тоже плохо. Как я должен догадываться, под каким номером идет какое поле? Более того, если мы в базу данных добавим поле, эти номера могут поменяться. Такой ненадежный код использовать неправильно.
> if (strlen($valueArray['email'])>100) strlen считает не число букв, а число байт (буква в utf8 может занимать несколько байт). Неправильно ее тут использовать.
> $errArray[2] = "Фамилия должна быть не больше 100 символов" Неправильно использовать тут числовые индексы так как непонятно что они обозначают.
CSS код надо вынести в отдельный CSS файл.
В общем, над задачей надо поработать. А именно:
- привести оформление в соответствие с PSR - лучше сделать разделение на части в соответствие с архитектурой MVC - сделать защищенную авторизацию, не позволяющую редактировать чужие данные - сделать лучшее разделение на классы в соответствие с принципами ООП, использовать DI - сделать защиту от XSS, CSRF - добавить HTML5 валидацию в форме - убрать часть данных из публичной папки
Перечитай комментарии к задаче, там много полезной информации.
>>860769 Спасибо за объемный фидбек. Сейчас поисправляю. >Желательно сделать отдельную папку для публичных файлов, а не вываливать весь код в публичную папку. А что такое публичные файлы?
Объясните мне на уровне идеи, или не знаю как сказать. Постигаю ООП, с понятиями и всем остальным вроде разобрался. Но при этом мой код - та же процедурщина, просто глобальные переменные и функции имеющие нечто общее теперь рассованы по классам. Раньше было $a = 5 $b = 2 function sum(a,b) {return a+b} Теперь class Calc() { ... public static function sum() {return this.a+this.b} } Ну и так далее, я думаю каждый постигший дзен с этим сталкивался. Как уйти от "процедурного" ООП к настоящему
Надо для начала проектировать, из каких классов будет состоять приложение, и за что каждый отвечает. Если ты видел например задачи про Вектор или Кошки-мышки в момем учебнике - там именно это и требуется, причем без ООП код получается гораздо хуже и запутаннее.
Твой пример прокомемнтировать не получится, так как для функции сложения 2 чисел ООП не нужен. Нужен пример сложнее, где было бы оправданно применение ООП.
>>861065 >$x + 1000 Что это означает? Это никуда не сохраняется и вообще не имеет смысла. Любое выражение должно записывать результат куда-либо, а тут этого нет. Вообще тут удобнее использовать цикл while: пока сумма баланса не станет больше или равной миллиону. А если через for, то во втором действии просто плюсовать единицу к году. Вот что тебе надо: 1. Сумма баланса делится на сто и умножается на десять - получается текущий процент. 2. Этот текуший процент просто прибавляется к текущей же суме баланса. 3. Выводится в echo.
Файл со скриптом в какой кодировке? файл с текстом? Должны быть оба в utf-8 без BOM. Также, надо указать кодировку браузеру либо в заголовке Content-Type, либо в метатеге meta charset.
Проверить заголовки можно в отладчике браузера (ctrl + shift + I) на вкладке network.
Ты имеешь в виду как настроить веб-сервер на твоем домашнем компьютере, чтобы он был доступен из интернета? Для этого надо получить у провайдера так называемый "белый" IP адрес, видимый снаружи. По умолчанию, многие провайдеры помещают клиентов за NAT, так, что напрямую из интернета с твоим компьютером соединиться нельзя. Получения "белого" адреса (обычно это платно) выставляет твой компьютер наружу, но надо понимать что он становится доступен и для всяких атак извне.
Ну и разумеется, компьютер должен быть постоянно включен и ты не должен его перезагружать, а то сайт будет недоступен.
Также, если поискать, можно найти какие-то варианты обойтись без "белого" адреса. Ну например, если твой провайдер выдает тебе динамический, но глобально доступный IP адрес, можно использовать dyndns.
Вообще, проще наверно найти хостинг (бывают даже бесплатные, на Западе можно найти бесплатный хостинг без рекламы погуглив "free web hosting") и загрузить свой сайт туда.
> 2. Старый оп покинул этот тред? Нет, просто у него много дел и он не может круглосуточно сидеть в треде, а заходит периодически.
Нюфаня присоединяется к вашему треду. Четвертый день в пути к светлому будущему. Вот решил задачу про Опечаточник, в уроке про Регулярки. Кажется мне, что не совсем верно. http://ideone.com/n6X69v
sleep работает как говноАноним21/10/16 Птн 14:32:06#712№861331
вообщем, нужен скрипт который работает с промежутком в час 24 раза в сутки. дальше работу он заканчивает. установил ini_set('max_execution_time', 90000); и сделал sleep(3600) после каждой итерации цикла. Не работает. Срабатывает не через час как задумано, а через 5 минут. Когда я ставлю sleep(60) все работает как и должно. Что за хуйня, аноны? И да, через крон не хочу, хочу так.
>>861331 > сделал sleep(3600) после каждой итерации цикла. Не работает. Срабатывает не через час как задумано, а через 5 минут. Эм... Тогда зачем ты поставил 3600 милисекунд?
Калькулятор сделал. Правда я думаю что вместо if else нужно как-то присваивать $op $char а потом это конвертировать в действие, но я понятия не имею как. Алсо не могу понять почему строка 37 не выводит echo (инби4 потому-что там exit?) http://ideone.com/0RcleA
>>861419 Какой-нибудь пруф плз. Сам нагуглить не могу. Попробовал сейчас time_sleep_until(time()+3600); но в этот раз было не 2 итерации а вообще только одна. говно какое-то.
Потому что первичный ключ это идентификатор и ссылки на него могут быть в других таблицах, в файлах, в логах. Искать и как-то их менять сложно, неудобно и не всегда возможно.
>>861435 Чё-т я запутался, браток, но вот так работает верно: http://ideone.com/KGMfzl Сам что-то не пойму, почему не идёт на последнюю итерацию с "=". Может, кто объяснит. Нашёл тут свой калькулятор, который делал 275 счастливых дней назад, когда думал, что программирование - это вполне себе легко.
Наверно оно задумывалось чтобы получить номер для нового вставляемого комменатрия (SELECT MAX(number) WHERE parentId = ..). Если ты можешь без него и если запросы укладываются в индекс, то наверно незачем и добавлять его.
> Вместо DOCUMENT_ROOT хранить путь вида "D:/xampp/htdocs/path/to/project" в конфиге?
Проще определять этот путь через __DIR__ например в бутстрап-скрипте или в какой-то функции.
>> Форматирование ужасное > В чём именно? Не соответствует PSR. Скобки после класса и функции ставятся на новой строке, между функциями стоит оставлять 1 пустую строку. Можешь вставить код на phpformatter.com и посмотреть что он там исправит.
>>861711 Пустой, в моём вопросе означало "Содержит пустую строку." инчае говоря $op=''; Спасибо за помощь. Вот мой код. http://ideone.com/KGMfzl Кстати я понял почему не выполнялось условие =. Потому-что на = надо проверять $char, а я проверял по очевидным причинам $op.
>>861331 Jenkins ставь на сервер, вноси туда время, и забудь о sleepах в php как о страшном сне. Все так делают, это стандарт на фирмах, вечно выполняющися скрипт никто не делает.
>>861738 Я последовал вашим рекомендациям из урока по верстке под ie. Больше всего меня удивило, что майкрософт сами не заботятся о кроссбраузерности своих же браузеров. Скачать с их сайта мне так и не удалось, пришлось самому искать ссылку на удалённое скачивание с их сайта.
>>859437 12 часов многовато, я по 8-9 на работе в день пишу, потом уже ничего не сображаю. За день одна-две небольшие фичи это норма, 12 тасков это ты разбежался, оптимист. Если пишешь нормальный читаемый объектно-ориентированный код с SOLID принципами, выверенными на скорость запросами в ДБ и юнит-тестами, то и вообще может по 2 дня уходить на небольшой тикет. Времени у тебя может больше уходить из-за кривой архитектуры, т.е. если все со всем связано, код повторяется и все классы не имеют четко обозначенных ролей.
>>849953 Индексы ставить, юзать javascript и ajax, выводить по 500 штук максимум, при прокрутке или по кнопке грузить новые 500 штук, старые при этом стирать из браузера.
ОП, c++ сильно быстрее php будет? Есть скрипт на php, который скачивает через curl, делает ресайз картинок через GD, запись новых на диск и запись в БД через PDO. Картинок чертова туча, длится все это дело по 16 часов. Есть смысл на другие языки смотреть (C++, Java) или существенного выигрыша не будет?
>>861747 CGI скрипты гугли, там и C++ и С. >Есть смысл на другие языки смотреть (C++, Java) или существенного выигрыша не будет? GD - это и есть C++, просто команда от PHP передаётся ему через интерпретатор, а он обратно возвращает картинку. Хотя мжет я что-то путаю. В любом случае надо проверить, может ты напишешь что-то в 100500 раз быстрее и мощнее
В CLI max_execution_time по умолчанию выключен, включать его незачем (или надо ставить 0). sleep работает нормально, гораздо больше вероятность что ты где-то накосячил или администратор сервера прибивает долго работающие скрипты.
А вообще делать надо через крон. Если нищехостинг это не позволяет, то вряд ли он позволит тебе запускать и долгоживующие скрипты.
У МС сейчас позиция, что есть новый браузер Edge, а старые они потихоньку хотят хоронить.
Я еще помню, когда-то был сервис (xenocode), который позволял упаковывать приложения вместе с библиотеками и он в качестве своей рекламы предлагал браузеры, включая ИЕ, запакованные так, что они не требовали установки и можно было запустить хоть несколько версий одновременно, но потом они из перестали распространять.
Я сам сейчас погуглил, действительно, ИЕ7 или 8 скачать непросто, и он доступен не под все версии ОС. Если не получится их установить, можно наверно тогда ограничиться ИЕ9 и выше (для их установки понадобится семерка). Также, тут https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/ предлагаются образы вирутальных машин от МС начиная с ИЕ8.
Я сам когда-то собирал себе образы на основе какой-то "урезанной" версии винды с рутрекера, так как она занимала меньше места чем официальный образ.
Я бы советовал не вариться в собственном соку, а показывать код или может обсуждать общую архитектуру чтобы избежать каких-то типичных ошибок, которые делают начинающие. Также могу посоветовать комментарии к задаче про студентов, там много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
Для начала стоило бы изучить, что именно сколько времени занимает. Если у тебя основные задержки это скачивание файлов то может можно как-то поменять алгоритм или распараллелить процесс. Gd и Curl сами по себе на Си так что их ускорять бессмысленно.
> if (!preg_match("/(19|20)[0-9]{2}/" > if ((!preg_match("/[0-9]{1,3}/", $student->score)) То же самое, нет привязки к краям строки
> if (!filter_var($student->email, FILTER_VALIDATE_EMAIL)) { Имей в виду, что это не пропустит email вида ivan@почта.рф с нелатинским доменом.
> $errors['email'] .= " Введенный email уже используется"; > .= Это не вызывает ошибки о попытке обращения к несуществующему элементу массива? Чтобы что-то приписать к строке, надо ведь сначала прочесть ее из массива.
https://github.com/never3ver/students_list/blob/master/app/Helper.php#L11 > preg_match("/$word/ui" Нельзя просто так подставлять произвольную строку в регулярку так как в ней могут быть спецмисволы которые вызовут ошибку синтаксиса (например если это строка "+++"). Нужно экранировать спецсимволы с помощью preg_quote().
https://github.com/never3ver/students_list/blob/master/app/Authorization.php#L40 > public function logIn(Student $student) { > if (!$student->cookie) { Эта функция залогинит студента только если у него еще не сгенерирована кука. Залогинить студента с проставленной кукой не получится. Нелогично как-то, надо либо переименовать (и выдавать ошибку для непустого поля cookie) либо переделать.
https://github.com/never3ver/students_list/blob/master/templates/editForm.html#L31 > <input type="radio" name ='sex' value="<?=Student::GENDER_MALE?>" required checked='checked'> Тут странно что радиокнопка всегда включена. Стандарт позволяет указать несколько кнопок включенными одновременно? Не стоит полагаться на поведение браузеров, оно может поменяться, надо делать максимально надежный код.
Также, ты ставишь атрибут required на радиокнопках - а как он применяется - к блоку радиокнопок в целом или к одной конкретной? Такие моменты стоит перепроверять, вдруг окажется что атрибут required значит, что именно эта конкретная кнопка должна быть нажата.
Баг: я ввел при регистрации год 1900, а он сохранился в БД и выводится как 0000.
Также, можно ввести год из будущего, например, 2090.
Вместо "Редактировать" лучше написать "Редактировать мои/ваши данные".
Можно не проверять, а сделать чтобы по умолчанию была обычная отправка формы, а при наличии JS и поддержки нужных технологий событие отправки формы бы перехватывалось и данные как-то отправлялись бы через JS.
Так как первая и вторая строка генеируются одинаково, то можно использовать цикл из 2 повторений для них.
Также, можно попробовать сгенерировать весь стих циклом. Мы сначала делаем массив массивов (то есть массив, cодержащий варианты выбора первого слова, второго слова итд), а потом проходим циклом по нему и генерируем стих:
Я придумал еще такой ваиант: делаем массив, описывающий структуру стиха (то есть варианты выбора для каждого слова), проходим по нему циклом и генерируем стих:
Его не надо запоминать. Если разобрать принципы, по которым он написан (как он разбит на классы, за что отвечает каждый класс, как они связаны), то сам код запоминать не требуется, ООП код можно анализировать на уровне классов, не опускаясь до кода в них.
Так что изучай ООП, MVC, делай задачу про студентов и потихоньку начнешь это понимать.
> if ($oversum>5000){ > elseif($oversum<5000){ А что, если ровно 5000?
> $credit+$commission+($credit($percent/100)); Это выражение там раза 3 повторяется. Попробуй убрать копипасту, например, вынеся его в отдельную переменную или сразу прибавив к долгу.
> $credit=($credit+$commission+($credit*($percent/100)))-$oversum; Если мы тут подставим oversum то получится что там выражение вычитается из точно такого же выраждения и проще было сразу написать ноль.
Ответ верный, но код слишком усложнен. Можно упростиь.
> Ответ на любой вопрос http://ideone.com/885RFf > $random=array_rand ($answers, 2); не очень понятно, зачем брать 2 случайных ответа, но работает в общем верно.
> Если я просто нажму стар дебагинг - ничего не происходит, Скорее всего он запускает скрипт в командной строке и вдобавок может быть останавливает его на первой строке. Или же может это режим когда ты должен руками вставить нужную ссылку в браузер. Надо смотреть документацию чтобы понять.
>>861761 >можно было не писать условие, а просто написать else. Исправил (Тут понятно что исправил незначительную деталь, пожтому не буду тебя лишний раз нагружать кодом. ) >Тут вместо числа 10 стоило использовать переменную $percent. Исправил. >А что, если ровно 5000? Вероятность крайне мала, но добавил в обработку. >Попробуй убрать копипасту, например, вынеся его в отдельную переменную или сразу прибавив к долгу. Поправил. Впринципе всё как ты сказал, если нет времени не смотри. http://ideone.com/2mhFHe >проще было сразу написать ноль. Страшно же, вдруг ошибусь в расчётах, а это как раз покажет что ошибся. >не очень понятно, зачем брать 2 случайных ответа, По другому не работает. Я думал что он берёт 2 параметра из массива, ключ и значение ключа.
>>861709 > Скобки после класса и функции ставятся на новой строке А это критично? Я просто привык уже ставить скобки так
>>861710 Видимо, я не понял суть. Вот будет у нас массив array(1,1,1,19), полученный с помощью первой ф-ии. Нам нужно сделать ++19 и вернуть его в виде валидной строки с помощью второй ф-ии. Так вот как будет происходить процесс замены 20 на "020" внутри этой ф-ии? В этом как-то помогут стандартные функции работы с массивом?
>>861777 > Скобки после класса и функции ставятся на новой строке >А это критично? Я просто привык уже ставить скобки так В приличных IT компаниях, такое может вызварь разрыв тимлидера. И я не шучу.
var_dump(realpath($path)) выдаёт правильный путь. Все заголовки определяются верно,пути ведут на картинку, но Content-Length=0 и файл почему-то не находится.
Я тут переделывал свою систему регистрации абитуриентов в соответствии с рекомендациями которые мне дали в треде и у меня возникла проблема: Я хочу выделять красным цветом поля в которые пользователь ввел неправильные значения. Но в треде мне сказали что а) настройки стилей должны лежать в отдельном ЦСС-файле. Б) ЦСС/ХТМЛ кода в моих контролерах быть не должно. Вопрос: как мне выделять красным определенные поля формы, если php-код в css файле не работает? А если я загружу CSS файл в стринг и в нем исправлю какие то строки, то нарушу требования MVC.
>>861799 Ну у меня есть массив с ошибками, и я хочу проверять наличие в нем элементов с какими нибудь ключами и выделять соответствующие поля формы. Ну например если ErrorsArray['name'] существует то background-color у inputa с именем "name" сделать красным. Такой был план.
>>861755 >Jenkins как замена крону выглядит как минимум странно. Чому странно? Уже в третьей компании сталкиваюсь, что все кронжобы в дженкинсе по табам прописаны, и /etc/crontab вообще не используется. В последней компашке даже заставили оставшиеся кронжобы в дженкинс перевозить. Плюсы налицо - дженкинс кладет в лог для каждого билда весь вывод, красит неудачные билды, можно по истории билдов потом смотреть, где что не так пошло. Еще в кронжобах из php мы тогда [START], [INFO] и [ERROR] тэги используем при выводе, дженкинс соответственно их правильно обрабатывает, по цветам и табам раскидывает.
>>А что, если ровно 5000? > Вероятность крайне мала, но добавил в обработку. Надо писать так:
if ($x > 5000) { ... } else { ..
Тогда вопросов нет - видно, что все возможные варианты проверены. А когда ты пишешь
if ($x > 5000) { ... } elseif ($x < 5000) { ..
Тогда при чтении кода появляется вопрос - а почему пропущен случай с 5000? Не важно, большая или маленькая вероятность, что попадется такое число, код вверху выглядит логичнее.
> Поправил. Впринципе всё как ты сказал, если нет времени не смотри. > http://ideone.com/2mhFHe Код внутри веток if/elseif довольно похожий. Нельзя ли оставить только одну копию кода? Также подумай, не удобнее ли тут использовать функции min/max для определения размера выплаты.
>>проще было сразу написать ноль. > Страшно же, вдруг ошибусь в расчётах, а это как раз покажет что ошибся. да, это хорошая идея.
>>не очень понятно, зачем брать 2 случайных ответа, > По другому не работает Работает, перечитай мануал по этой функции.
>> Скобки после класса и функции ставятся на новой строке > А это критично? Я просто привык уже ставить скобки так Если каждый будет писать, как ему нравится, в коде будет бардак. Лучше сейчас привыкнуть писать правльно. Смотри второй пост в треде.
> Видимо, я не понял суть. Вот будет у нас массив array(1,1,1,19), полученный с помощью первой ф-ии. Нам нужно сделать ++19 и вернуть его в виде валидной строки с помощью второй ф-ии. Так вот как будет происходить процесс замены 20 на "020" внутри этой ф-ии?
- берем существующий путь и разбиваем на массив чисел - увеличиваем последнее на 1 - собираем новый путь из массива
За добавление нулей отвечает функция сборки пути из массива чисел. Она получает на вход массив чисел и возвращает правильно отформатированную строку.
Этот подход позже позволит легко поменять алгоритм записи пути, например, убрать точки (чтобы место не занимали) или использовать более плотный бинарный формат хранения чисел.
Скорее всего проблема в бекслешах в пути. Лучше использовать прямые слеши, которые работают под Windows и linux. Также стоит проверить мануал по xsendfile:
- есть ли mod_xsendfile в списке расширений Апача, которые выводятся в phpinfo() ? - включена ли опция XSendFile on ? - задан ли белый список разрешенных папок в опции XSendFilePath ? - проверь лог ошибок Апача, нет ли там чего.
То, что ты видишь заголовок X-Sendfile скорее всего значит, что он не перехватывается модулем и не обрабаывается.
Если поле заполнено неправильно, просто добавь к нему специальный css класс. Если ты используешь бутстрап, то там уже есть такой класс, который подсвечивает поле красным.
Если ты не используешь бутстрап и пишешь CSS сам, то обрати внимание, что поле может быть ошибочным по 2 причинам:
То есть если ты пишешь CSS сам то тебе надо написать стили, выделяющие поле красным в обоих случаях. Если ты используешь бутстрап - там все уже есть.
> А если я загружу CSS файл в стринг и в нем исправлю какие то строки, то нарушу требования MVC. и сделаешь твой код переусложненным. Для того чтобы поменять состояние какого-то элемента удобнее всего добавить ему CSS класс:
Здраститя, просто хочу сказать спасибо за такой ПОКА-ЧТО понятный гайд. ПОКА-ЧТО все ошибки из-за невнимательности и рассеянности, а не из-за не усвоения материала. Ну это пока. Угу.
Сделал чат на ПХП, яваскрипт и аяксе, с комнатами, никами, возможностью редактировать ники и комнаты и т.д. Но, для вывода сообщения без перезагрузки страницы приходится использовать функцию setInterval, которая выполняет функцию проверки новых сообщений в базе данных каждую секунду, и выводит если такие есть. Как сделать без этого вообще не понимаю, есть ли возможность сделать чат без такой функции?
Стабы и моки используются если ты хочешь протестировать сам класс в изоляции от остальных классов. Это не всегда нужно, иногда нам может понадобиться протестировать класс вместе со всеми зависимостями. Хотя это уже будет называться не "юнит", а "функциональный" тест.
То есть вопрос именно в том, что ты тестируешь. Если например твой класс может использоваться совместно с какими-то классами которые пишет пользователь (и которых у тебя нет), то естественно тебе надо тестировать его с моками вместо пользовательских классов. Если зависимости берутся из другой библиотеки - то наверно тоже стоит тестировать класс в изоляции (какой смысл тестировать чужую библиотеку?).
Если же у класса всегда одни и те же зависимости и их пишешь тоже ты, то тут возможны варианты и может быть проще тестировать все вместе.
В примере:
$manager->normalizer = new UrlNormalizer([
Авторы тестируют классы вместе, они все равно к одному компоненту относятся и они тестируют этот компонент целиком.
Вот тут:
$request = new Request;
Тоже все нормально, если какая-то функция принимает на вход объект Request то почему бы его в тестах и не использовать? Он тут используется как "глупое" хранилище данных без внутренней логики.
Но я замечу, что там используется глобальная переменная $_GET что в общем плохо (это по идее может иметь какие-то побочные эффекты). Из-за того что код в Юи ее использует, и тесты получаются не очень чистые.
Вообще, я бы переписал этот тест. Я бы на каждый шаг создавал новые Request и UrlManager чтобы сделать тест более надежным и избежать влияния предыдущего теста на следующий, и вместо копипасты я бы сделал массив значений pathInfo и ожидаемых результатов роутинга. Но конечно если код исплоьзует глобальные переменные то добиться полной изоляции сложнее.
Я сам не сторонник усложнять тесты без надобности, но ответ на вопрос использовать моки/не использовать зависит от планируемого сценария использования класса.
Могу предложить еще посмотреть тесты от симфониевсого роутера:
Этот тест фактически проверяет что роутер вызывает метод matchRequest у матчера (там роутер содержит матчеры, которые проверяют запрос на соответствие опрделенному правилу) ровно 1 раз. Если подумать, это довольно бредовый тест: например, почему он должен вызывать этот метод ровно 1 раз? Задача роутера разбирать URL и нигде не написано как именно он это делает.
Вдобавок, матчера в тесте внедряется в роутер в обход инкапсуляции, через рефлекшен, что тоже неправильно, так как этот тест сломается если мы поменяем имя приватного поля в роутере.
Вот как бы я тестировал сценарий "проверить, что в роутер можно вставить кастомный матчер":
- сделал бы свой класс тестового матчера, реагирующего на определенный запрос и возвращающего определенный ответ. Не знаю, можно ли это сделать через мок, может быть надо писать именно новый класс. - создал роутер, внедрив в него этот матчер - дал бы роутеру запрос с определенным URL - проверил бы что возвращен определенный ответ
То есть я бы не делал предположений о том как внутри устроен роутер и сколько раз он вызывает какой метод, а тестровал бы его так же как если бы я использовал его в своем коде.
А то что у них - по сути тестирует не документированное поведение роутера, а особенности его внутреннего устройства. Такие тесты легко ломаются пи рефакторингах и непонятно что тестируют.
Вообще, я смотрю, там тесты злоумпотребляют этими проверками, что определенный метод определенного класса вызван N раз. Это нормально, создать мок, который всегда возвращает фиксированное значение, но вот так считать сколько раз какой метод вызван - это стоит использовать только там, где документировано что эти методы будут столько раз вызываться.
>>862083 >В самом последнем блоке вместо elseif ... лучше написать просто else без указания условия. Имена функций (mt_rand) принято писать с маленькой буквы.
Т.е. даже не указывая условия, этот если выполнится, ТОЛЬКО при равном количестве очков у игрока и судьбы? Окей. Понял.
А если в условиях не выйдет так легко, как в этом уроке, то не критично будет все-таки делать elseif?
Во-первых, вместо setInterval правильнее использовать setTimeout - в случае ошибки в коде его работа прервется, в отличи от setInterval. Во-вторых. каждую секунду опрашивать это перебор, будет много запросов если много пользвоателей.
Твой подход называется polling, то есть периодический опрос сервера. Есть методы получше, а именно:
- (костыль из старых времен) long polling, COMET - это когда мы отправляем запрос и сервер "подвисает" до истечения таймаута или появления нового сообщения. тянуть больше 30-60 секунд нельзя, так как браузер или прокси-сервер может закрыть соединение по таймауту. Профит в том что нам не надо слать запросы каждую секунду - (современный подход) использовать вебсокет. Вебсокет позволяет установить постоянное соединение с сервером и пересылать по нему данные в обе стороны, в том числе с сервера на клиент, асинхронно. Минус - нужен современный браузер и конечно JS.
В случае с вебсокетом тебе так же нужна программа-демон-мультиплексор, которая принимает и держит соединения от клиентов, а также принимает и пересылает уведомления о событиях клиентам. То есть когда пользователь A отправляет сообщение в комнату, скрипт на сервере уведомляет демона и тот пересылает сообщение всем клиентам, которые подписаны на эту комнату.
Мультиплексор можно написать самому или взять готовый.
Есть также стандартный протокол, работающий поверх вебсокета, The Web Application Messaging Protocol (WAMP) и библиотеки для работы с ним.
Если ты хочешь это сделать, тебе надо изучить:
- сетевое программирование и обычные классические сокеты - асинхронная работа с сокетами - WebSockets - The Web Application Messaging Protocol - библиотеку ReactPHP которая позволяет писать программы, асинхронно работающие с сокетами, поддерживающую в том числе WAMP - JS библиотеку вроде autobahn поддерживающую WAMP на стороне клиента
Вот тут ссылки и задачи по сеетвому программированию: >>853691
Если тебе интересны исторические и работающие в старых браузерах способы long polling, то надо гуглить по слову COMET: https://habrahabr.ru/post/104945/
Ну это зависит от ситуации: если тебе надо ловить все случаи, когда ни одно условие выше не сработало, то else. Если же надо ловить не все случаи, то elseif.
Слушай. Это все замечательно, но я не понимаю, как это пхп работает в виде интерфейса. Ну вот я сделал эту игру, это же последовательные строки идут. А как здесь вот как на харкаче. Нажал кнопку - доп. окно, вот снизу списочек ссылоку, набор досок.
Это все пхп, и это все вот таким же путем можно провернуть?
А графика сайтов? Как связывается графика и код? Как это все распределяется?
Интерактивность на страницах делается за счет яваскрипта (а не за счет PHP). В HTML-страницу можно встроить программу на языке яваскрипт, и она будет вызываться при нажатии например на кнопку, и будет перестраивать DOM (дерево HTML документа) так, что на страницу вставится нарисованное окошко.
Загруженный в браузер HTML документ представлен в памяти в виде дерева объектов DOM и программа на яваскрипт может модицифировать это дерево, соответственно меняя вид страницы на экране, показывая окошки, выводя надписи итд.
При желании яваскрипт-программа может отправлять фоновые HTTP запросы на сервер (это называется аякс).
PHP отвечает за обработку, хранение и выдачу данных на сервере. Это не всегда нужно, иногда нам хватает только HTML + JS. Но если у тебя например есть на сервере база данных, то тебе понадобится PHP-код, принимающий данные с клиента и отдающий их ему. Или если у тебя чат, то тебе понадобится программа на сервере, пересылающая данные между клиентами.
Плюс, если сайт большой, какие-то страницы могут генерироваться на PHP и быть неинтерактивными,а какие-то интерактивными и использовать JS.
>>862099 Т.е. я правильно написал? Грубо говоря пхп - информационный банк данных о сайте. Ява и хтмл - объекты, которые хранятся в "банковских ячейках" этого банка?
Человек жмет ссылку - ссылка идет по номеру в нужную ячейку, достает оттуда объект и отсылает человеку.
Нет. PHP это не банк данных, это язык для написания программ, которые выполняются на сервере. "банк данных" это база данных, например MySQL или Postgresql.
Яваскрипт (не ява) и HTML не хранятся в базе данных.
Начни с изучения основ протокола HTTP, и как работает веб-сервер:
Я не понимаю. Как это решить. Если нужно 9 раз перемножить. Здесь 10 переменных? Или как. х * х = у Где х одна переменная, а у - другая? Как это составить в цикле? Нужен сброс какой то переменной?
Я час корпел, и так ничего и не придумал. Тут же дело в математике. Зачем нужно действие 1, если в цикле оно выполняется самый первый раз, и все? Просто как хранилище одной переменной?
Тело цикла в задаче подразумевает ТОЛЬКО echo использовать?
В действие два в цикле можно несколько действий совершить.
>>862103 Пхп это тот, кто все обрабатывает на сервере. Зашел ты в магазин например, набил корзину, и хочешь сделать заказ. Кому-то надо проверить наличие товара на складе, посчитать сумму заказа, проверить правильно ли ты адрес свой ввел, и прочее такое. Вот этим Php на сервере и будет заниматься. Чтобы с данными работать (например проверить есть ли товар на складе), ему надо к базе данных подсоединиться, тут он и будет использовать какой-нибудь Mysql. А часть правил можно жестко закодировать, например список городов России прямо в PHP файле, и если ты страну Россия ввел и город не из списка, то php поймет и выдаст, что заказ невозможен. Причем часть таких расчетов можно не делать на сервере, а делать сразу в клиенте, что быстрее (нет передачи данных по сети, и не грузится сервер). Тогда и используют Javascript, например им можно проверить правильность формата телефона или тот же список городов России.
>>862255 Починилось! Скорее всего ошибка с путями в settings.php была, т.к. заработало после того, как я там поправил. Приятно когда откладываешь решение ошибки, занимаешься другим, и в процессе и VHost настроил и ошибку исправил.
>>862167 >х * х = у Это неверно, потому что в программировании надо наоборот: у = х умножить х. В случае этой задачи нужно $i умножить на $i в теле цикла for. Цикл for состоит из трёх условий и позволяет в третьем условии, допустим, прибавлять к переменной $i единицу for ($i = 1; $i <= 9; $i++). А уже в самом теле цикла эта переменная умножается сама на себя, выдаётся результат с помощью echo. Собери это - задача решится.
>>862263 Погоди. Получается, тело цикла - основное поле для творчества, и там можно что угодно написать, помимо простого echo? Т.е. я там могу и переменные сохранить, и изменять их?
А инфа переменных в теле цикла сохраняется только во время работы цикла? Допустим $а = 1 $б = 1 + 1 И с каждым циклом а будет постоянно увеличиваться на 1, а как цикл перестанет работать все сбросится.
>>862328 >Получается, тело цикла - основное поле для творчества, и там можно что угодно написать, помимо простого echo? >Т.е. я там могу и переменные сохранить, и изменять их? Конечно! И в теле цикла можно что угодно писать, и в условиях тоже (только там должно быть обязательно три разделённых точками с запятой условия). >А инфа переменных в теле цикла сохраняется только во время работы цикла? >Допустим >$а = 1 >$б = 1 + 1 >И с каждым циклом а будет постоянно увеличиваться на 1, а как цикл перестанет работать все сбросится. Да, пробуй это на простом цикле, быстро и решительно - только так будешь усваивать всё, а иначе ничего не поймёшь. http://ideone.com/d321qG
>>862337 >$а = 1 >$б = 1 + 1 >И с каждым циклом а будет постоянно увеличиваться на 1, а как цикл перестанет работать все сбросится. Нет, в этом случае $a будет всё время равно 1 - хоть это в теле цикла, хоть это в условии. А $б будет равно 2 - и там, и там. Чтобы они изменялись, надо делать так: >$а = $а + 1 >$б = $б + 1 Такого рода. Чтобы переменная, которая получилась от предыдущего прохождения цикла, увеличивалась на 1. А иначе ничего не будет изменяться - каждый раз переменная будет становиться равной единице или равной "единица плюс единица".
Потратил 2 дня на решение задачи про банкомат. В 50% случаев она не работает. Судя по условиям опа, писал неправильно. Понятия не имею как её решать и в каком направлении вообще идти ( Вот уж не думал что она окажется настолько сложной.
> Использовал такое решение: require_once (__DIR__ . '/../app/init.php'); > Это абсолютный путь или относительный? __DIR__ возвращает абсолютный путь.
> Можно ли использовать такое решение require_once ($_SERVER['DOCUMENT_ROOT'] . '/app/init.php')? Не стоит. DOCUMENT_ROOT отсутствует при вызове скрипта из командной строки например.
>>а как же зайти на страницу с таблицей студентов? >>Мне кажется, это неудобно, если она не открывается напрямую.
> Ты имеешь ввиду добавить адрес вроде /list, который бы вел на список? > Как я понял условия задачи, доступ к списку студентов пользователь получает по ссылке Я имел в виду что у тебя список не был доступен без регистрации, а хорошо бы иметь возможность его просматривать.
> Можно ли использовать в автозагрузчике вот такие пути __DIR__ . '/../' . $className . ".php" ? Можно. Но лучше всего не расставлять __DIR__ по куче функций, а сделать одну функцию, получающую путь к корню проекта.
> Но ведь HTML валидация тоже не пропускает русские символы? Проверил, ivan@почта.рф проходит в Хромиуме.
> Я решил проверять только на наличие следующих опечаток - отсутствие @ или точки перед доменом или самого домена. Ок, хорошо
> В другой ситуации, думаю можно устанавливать часовой пояс клиента в объекте DateTime::setTimezone(), гадая по IP и на JS? Можно, но это редко когда нужно, при указании даты рождения часовой пояс не важен ведь. Он важен если нам нужно время и тут да, проще всего получить часовой пояс средствами JS.
> Если в каждом поле формы плеэйсхолдер будет начинаться с "Например, ...", > то воспринимать такую форму будет сложнее из-за повторений? Да, тоже верно.
> В Bootstrap отступы другие получаются, не так красиво выглядит. Можно переопределить же.
> Нужен ли префикс в именах переменных при экстракции, например form_abiturient? нет
> Ты имеешь ввиду алгоритм в методе updateAbiturient в Gateway или в контроллере ? > Но ведь я и так загружаю студента из бд, затем заполняю его свойствами поля формы. Пользователь > изменяет или не изменяет эти свойства. Затем обновляю только те свойства студента, которые есть в форме. Да, тогда все правильно.
В ридми не указано что надо настроить папку public как публичную.
> if (isset($_GET['page']) && (intval($_GET['page']))) { А что проверяет условие intval($_GET['page']) ? Что после преобразования в число там будет не 0? Если ты хотел проверить, является ли выражение числом, то есть is_numeric и ctype_digit.
> $curl['page'] = intval($_GET['page']); > } else { > $curl['page'] = NULL; По умолчанию наверно можно ставить значение 1
Логика обновления абитуриента по-прежнему неудачная. Вот твой алгоритм редактирования:
- создать пустого абитуриента - записать в него данные из формы - сделать UPDATE в БД
Тут много возможностей сделать ошибку. Например, мы добавим в абитуриента новое поле, но не добавим его в форму. Тогда метод updateAbiturient() вполне может записать для этого поля в базу пустое знаечние. Или наоборот, мы уберем одно из полей из формы, и тогда опять же в базе оно будет очищено.
Правильнее делать так:
- загрузить абитуриента из БД - обновить в нем поля соответствующие форме - сохранить обратно
Либо же надо как-то явно передавать в функцию обновления список обновляемых полей, что неудобно - проще сохранять все поля.
https://github.com/enotocode/Studentslist/blob/master/app/Authorization.php#L41 > public function createNewRegistry() Вот этот метод на мой взгляд сделан неудачно. Ты сначала генерируешь код и ставишь куку, а только потом сохраняешь его в базу. Мне кажется, надежнее наоборот. Иначе возможна ситуация, когда кука выставлена, а записи в БД нет.
Ты используешь там название "пароль", но наверно правильнее будет "токен", так как пользователь этого пароля не видит и ввести не может.
В классе авторизации очень не хватает комментариев, там куча методов, названия которых не дают особых подробностей. Вот представь что тебе дали такой класс, ты разберешься, как им пользоваться?
Непонятно назначение метод authosise(). Зачем он, если можно сразу вызвать getUserId() ?
Ты сохраняешь поля userId и userPass, но они обрабатываются несогласованно. Например при регистрации поле userPass перезаписывается, а userId сохраняет старое значение.
Более того, если подумать, кешировать достаточно одно поле, а не два. Это лишь повышает вероятность ошибок.
В общем, нужно отрефакторить класс авторизации.
> setcookie ('userPassword', $pass, strtotime( '+10 years' )); Ты не указываешь путь, и кука может быть доступна не на всем сайте. Прочитай про параметр path у кук.
> $sql .= " WHERE CONCAT (name, lastName, groupNum, egePoints, email, dateOfBirth) LIKE '%" . $searchKey . "%'"; Лучше бы подставлять значение через плейсхолдер. Вообще, может тут удобнее собирать запрос через sprintf?
И надо правильнее проверять значения $order, сейчас у тебя при передаче неправильного значения будет ошибка обращения к несуществующему элементу массива вот тут: $this->sort[$colum]
Сборку запроса надо упростить, сейчас там нагромождено много ифов и легко сделать ошибку.
> <?= "Имя должно содержать только буквы, символ(ы): " . htmlspecialchars($errors->get('nameForbidden'), ENT_QUOTES) . " - недопустимы"; ?> Наверно сообщение удобнее было бы целиком формировать в валидаторе?
> Поле может принимать значение GENDER_MALE или GENDER_FEMALE, вы отправили: Боюсь для обычного пользователя это сообщение не очень понятно.
>>862617 Спасибо за ответ, начинаю усваивать. В первый же раз прочитал, что в начале выполняется тело, а потом второе действие, но не сразу же это понял. До конца думал что в начале действие 2, а потом тело в конце списка.
Алсо, шапка это действие1, условие и действие 2?
Буквально два часа потратил на эту задачу. Пипец, аж голова заболела.
Но рад что решил, сейчас начну переделывать первую задачу, и таки сделаю с 1 переменной. Попробую.
>>862676 А тут - нет. $moneyBoy = $moneyBoy + $procent * (1 + 10/100);
так что-ли? И после этого вторую строчку $procent можно убирать? Погоди. Так это адаптация формулы расчета сложного вклада? Тогда зачем 10/100, а не сразу 0,10?
И по второму. Что значит, начальный возраст + число прошедших лет? Начальное число одной переменной шестнадцать. А второй 0. Разве переменная может одновременно держать две разных цифры, автономных друг от друга?
Это не годится. Вот допустим мы захотим чтобы там выводилось не 9, а только 6 строчек. Или 20 строчек. Придется переделывать код. А я хочу чтобы нужно было поменять только 1 цифру.
Также, цикл у тебя там не используется так как код внутри выполняется лишь 1 раз. Если та, то цикл и не нужен получается, ведь цикл нужен чтобы выполнить одни и те же действия несколько раз.
Надо переделать программу так, чтобы число строчек задавалось только в одном месте и можно было его поменять на любое другое число.
Нет, неверно. Ну вот смотри, что такое процент? Это 1/100 доля. Чтобы получить N % числа мы должны поделить его на 100 и умножить на N:
share = number / 100 * N
Чтобы увеличить число на N%, мы придавляем к нему эту долю:
number = number + number / 100 * N number += number / 100 * N
Но тут можно пойти еще чуть дальше. В первом выражении number можно вынести за скобки и получается
number = number *(1+ N / 100) number *= ...
> Что значит, начальный возраст + число прошедших лет? Начальное число одной переменной шестнадцать. А второй 0. > Разве переменная может одновременно держать две разных цифры, автономных друг от друга? Не может. Но мы можем сделать одну переменную, хранящую начальный возраст, вторую - сколько прошло лет и получить текущий возраст, сложив их.
Что-то торможу, пишу опрос, создал две таблицы, в одной хранятся вопросы, в другой хранятся ответы, ответы с вопросами связаны при помощи специального поля в таблице с ответами id которых равняется id вопроса. Пытаюсь получить данные из базы данных, при помощи одного запроса, пишу следующее Таблица 1 questions столбцы id, text_quest Таблица 2 options столбцы id, text_option, qwant, id_quest (Столбец id_quest в таблице 2, соответствует полю id в таблице 1)
"SELECT questions.text_quest, options.text_option, options.qwant FROM `questions` INNER JOIN `options` ON questions.id = options.id_quest"
Само собой мне выводит в немного не нужном мне виде, мне надо, чтобы был многомерный массив, каждый массив которого содержал данные поля questions.text_quest и все варианты ответов options.text_option, как это сделать?
>>862699 Я наверное немного не правильно объяснил, суть в том что есть две таблицы, в одной вопросы, в другой варианты ответов, мне надо на странице вывести вопрос а под ними варианты ответа на этот вопрос. Таблицы объединены внешним ключом. Я используют такой запрос:
SELECT * FROM 'таблица_вопросов' INNER JOIN 'таблица_ответов' ON 'поле_ид_в_таблице вопросов' ='поле_ид_вопроса_в_таблице_ответов'
В итоге мне выводится массив в таком формате: Array( [0] => stdClass Object ( [text_quest] => Текст вопроса 1 [text_option] => Вариант ответа 1) [1] => stdClass Object ( [text_quest] => Текст вопроса 1 [text_option] => Вариант ответа 2 ) [3] => stdClass Object ( [text_quest] => Текст вопроса 1 [text_option] => Вариант ответа 3 ) ... [0] => stdClass Object ( [text_quest] => Текст вопроса 2 [text_option] => Вариант ответа 1) [1] => stdClass Object ( [text_quest] => Текст вопроса 2 [text_option] => Вариант ответа 2 ) [3] => stdClass Object ( [text_quest] => Текст вопроса 2 [text_option] => Вариант ответа 3 ) и т.д.
Как мне изменить формат вывода на более удобный? Конечно можно сделать в два запроса, вначале вызывать все вопросы и по полю id в каждом из них вызывать варианты ответа со всеми данными, но хотелось бы сделать в один.
>>862711 А по другому никак разве нельзя? Разве нет команд для того чтобы получить что-то типа "Текст вопроса 1"=>array( "Вариант ответа 1"=>array( "текст ответа"=>"текст", "количество проголосовавших"=10), "Вариант ответа 2"=>array( "текст ответа"=>"текст", "количество проголосовавших"=30), ....
А как прячут файл обработчик той или иной формы? Если не прописывать action явно в форме, то его можно прописать в аяксе, но код аякса же виден на странице в исходном коде, как можно его скрыть?
Если получаешь массив, но ты не знаешь какое именно там значение параметров, но каждый из них тебе надо добавить в таблицу в базе данных. Нормально будет пройтись циклом по всему массиву и для каждого его элемента вызвать функцию добавления в базу данных? И есть ли другие варианты?
Спал сегодня, снится мне сон что я на пляжу, в какой-то стране с вечным летом, ночь, вечеринка, кругом девушки симпотичные, светомузыка, я захожу в какое-то здание, достаю из рюкзака ноут, цепляюсь к зарядке, начинаю апдэйтить репозитории с гитхаба, но они не отвечают. Тут я понимаю что я во сне, просыпаюсь, минут 20 думаю как настроить аутолоадер так, чтобы во сне код править. И всерьёз об этом думаю... Аноны я поехал уже? Или это нормально?
Старые ответыАноним24/10/16 Пнд 05:58:00#824№862770
>>861757 Спасибо, исправил. https://github.com/never3ver/students_list Смущают вот какие моменты: >Тут странно что радиокнопка всегда включена. Выставлено, так сказать, значение по умолчанию, не совсем понимаю почему это странно. >Также, ты ставишь атрибут required на радиокнопках - а как он применяется - к блоку радиокнопок в целом или к одной конкретной? Я так понимаю, что радикнопки изначально предполагают выбор или или, так что к блоку. >Баг: я ввел при регистрации год 1900, а он сохранился в БД и выводится как 0000. Гугл говорит что тип YEAR корректно работает с промежутком 1901-2155. Как это лучше обойти?
Некоторое время не программировал, сейчас начал писать один скрипт, создал базу данных туда не добавляются кириллические символы. При этом основу скрипта скопировал с прошлого скрипта, который спокойно добавлял кириллические символы. Кодировка у всех страниц utf-8, у базы данных и у всех полей тоже utf-8. В чём дело?
Привет, кто шарит в базах данных, подскажите: есть задание: "Спроектировать БД (можно в любом виде - таблицами, схемои - хоть от руки, SQL- фаилом). Есть саит интернет магазина. Там есть категории, которые могут быть вложены друг в друга (уровень вложенности не будет более 3х). В категориях находятся товары. На саите также есть личныи кабинет. В нем могут зарегистрироваться пользователи. У пользователя есть заказы, в которых есть товары."
>>863307 У тебя всего 5 таблиц, а ты уже всё запутал так, будто их у тебя 500. А смысл? В Orders - 2 user_id? зачем? bigint? У твоего мгазина будет 9 223 372 036 854 775 807 Юзеров? Name 63? Тут ты зачем экономишь?
В bigint ничего сообо плохого. Не магазин, но я сталкивался когда int не хватает (например когда записи часто пересоздаются, также у мейл ру ид юзера это бигинт).
EAV надо использовать только для атрибутов, которые есть не у всех товаров. Если атрибут есть у всех товаров, например, цена, его надо добавлять как обычное поле.
Скорее всего нужна какая-то связь между категориями и допустимыми атрибутами товара. То есть у всех процессоров есть Тактовая Частота и число ядер, и это должно где-то храниться.
>>863332 >Если попросить функцию найти 1 ключ (то есть не ставить второй аргумент), она вернет не массив, а сам этот ключ. Ты это учел? У всех опы странные, а у нас самый лучший оп на свете. Спасибо!
Таблица с чем-то вроде кеша, где по крону пересоздаются порядка миллиона или нескольких записей (ссылающихся на другую таблицу). За полтора года лимит id был исчерпан и посыпались ошибки.
>>863332 >Таблица product_attribute не соответствет принципам нормализации (поле attribute_name не зависит от ключа целиком и значения дублируются). >Первичные ключи выбраны неверно в productsAttributes. Вспомни определение перв. ключа для начала.
Если убрать поле id, а поля product_id и attribute_name сделать первичным ключом, то я молодец?
Я таки нашел время что бы довести до ума свое решение задачи про регистрацию студентов. https://github.com/ghp26/Students Переписал и исправил почти все кроме пары вещей. >валидировать лучше не массив неизвестной структуры, а модель студета. »наче твой валидатор заточен только на работу с формой и им нельз¤ например проверить данные из базы. Вот это не понял. валидатор заточен для работы с формой и больше ни для чего другого не используется.
>У тебя тут расчет что массив содержит все нужные поля. Но вообще, массив POST может и не содержать их или содержать массивы вместо строк например. Нужно сделать чтобы код не выдавал ошибок в такой ситуации. Да, у меня расчет что массив POST содержит все нужные поля, и это не безосновательно, потому что все поля POSTa проверяются валидатором и если в них есть ошибки, то код не поломается, а выведет странцу на которой будет указанно(подчеркнуто красным и написано текстом) что именно введено не правильно
"WHERE `birth` LIKE %текст_на_кирилице%" выдает ошибку SQL General error: 1271 Illegal mix of collations for operation 'like' Что с этим делать так и не придумал, поэтому поиска по дате пока нет. Вообще совершенно внезапно прога начала выдавать эту ошибку.
>>863610 Ссылку давай, так непонятно ничего. В любом случае, в минус не должно ничего уходить: получается, что так банк тебе платит в какой-то момент, а ты ему возвращаешь часть, логики нет.
>>863612 Вот такого вида должна быть ссылка: http://ideone.com/MHoMsH А выведи там сумму долга - какая получится? Почему ты думаешь, что получилась верная сумма? Пока вижу, что всё неправильно, должно получиться в итоге 61270 рублей со многими копейками.
>>863615 А по условиям задачи пацан знает о текущем долге? Т.е. он видит что можно заплатить меньше 5к? Если да, то какая проблема просто еще одним условием урезать уплату долга до такого значения, чтобы в ноль ушло?
>>863444 Попробовал проверять на массиве двойной вложенности, и заработало. В коде выше, почему-то isset выдавал что элемент массива существует, а потом снова ошибку. Спасибо тебе добрый анон за помощь. >>863448 Я пробовал искатть максимальное количество элементов в массиве символов (в строке), но после этого я получил много ошибок при работе с массивом и вынужден был уискать другие пути.
Попытался сделать с разметкой как у опа, но я слишком ньюфаг для этого.
> return (a.population < b.population) ? 1 : -1; Ты не проверяешь ситуацию, когда население равно и надо вернуть 0. Из-за этого при сортировке может быть ошибка. Алсо, есть интересный хак:
return a.population - b.population, хотя конечно такие хаки стоит как минимум комментировать.
> Hamburger.sizeList = { > "small": {money: 50, calories: 20}, для обозначения типа надо тут тоже использовать константу, а то если мы поменяем определение на
Hamburger.SIZE_SMALL = 1;
то все перестанет работать.
> " Разрешены размеры: " + Object.keys(Hamburger.sizeList) + ". А это можно, складывать строку и массив? Интересно. Я бы добавил join рад пробела после запятой.
> this._size = Hamburger.sizeList[size]; Я думаю, правильнее хранить исходные данные. Свойство называется размер а не стоимость и число калорий с указанным размером. Более того, как ты напишешь условие "если этот гамбургер маленький"? Надо хранить сам размер, а не прозводные данные.
> for (var topping in this._toppings) { Имей в виду, что у цикла for .. in есть проблемы если кто-то расширит прототип Object - добавленные в прототип свойства попадут в цикл:
> if (typeof data == "object" && data.length > 0) { Неточное определение array-like. Array-like это любой объект у которого есть length >= 0 и свойства 0 .. length - 1. Кроме arguments это например
Сложный алгоритм, при этом нет комментария. Имена переменных однобуквенные так что понять что они значат, трудно. Что значит $pew? Как это читать и проверять? Имена переменных должны начинаться с маленькой буквы.
> // заполнение массива значением long, до 6600 Там наверно надо брать сумму, а не заложенное жестко число 9999
> $nominals = array(100, 200, 500, 1000, 2000, 5000); Этот массив можно получить из $check.
> $check[0] = array( Не очень понятно почему не просто $check = array ...
переименуй переменные, добавь комментарии и ссылку на алгоритм, а пока проверить код трудно.
RAR? Боюсь что мне пока что неохота это скачивать, копировать, настраивать сервер. Начни с отладчика в браузере (Ctrl + Shift + I), почитай про него https://learn.javascript.ru/debugging-chrome
Посмотри, какие данные отправляются, что происходит на сервере. Посмотри логи ошибок веб-сервера (error.log). Также, ты можешь использовать встроенный в PHP веб-сервер, который пишет запросы и ошибки в консоль. Если ты работаешь с БД, то убедись что включен режим выброса исключений при ошибке.
Натыкай в скрипт var_dump и посмотри какие данные куда приходят, что в переменных, что возвращают функции. Найди строку, которая работает не так, как надо.
В общем, изучи и изложи суть проблемы более подробно. Какие данные приходят в скрипт, какая строчка работает не так, что пишется. В какой строчке проблема.
> очему не работает доступ к символу через $char = $text[1]. Потому что пхп криво спроектирован в этом случае. [1] берет не второй символ, а второй байт строки. А в utf-8 символ может занимать несколько байт и ты его в принципе получить не можешь целиком без mb_substr. В общем, непродуманно сделано, они ориентировались на древние 1-байтные кодировки которые мы сейчас не используем (так как в них нельзя использовать более 256 символов).
> ни echo $char, ни var_dump($char) - ничего не выводят. Они выводят один байт из нескольких, только половину буквы.
> http://ideone.com/SuS3yI - палиндром Выглядит верно, но хотелось бы увидеть работающую версию кода, а не закомментированную.
> http://ideone.com/eTXny3 - Лев Толстой. Код очень переусложнен. Также, ты используешь неудачные имена переменных вроде $all1_3Words, all2Words которые легко перепутать и плохо читаются (1 похожа на l). Подчеркивание не используется в PSR.
тут надо либо сделать по-простому, либо сделать массив с вариантами слов и пройтись по нему циклом:
ALTER TABLE во многих случаях сводится к пересозданию таблицы (создание нового файла таблицы, копирования в него данных и замены старого файла), если она большая то это определяется временем чтения и записи на диск (гигабайт нельзя мгновенно прочитать). Выгоднее делать один большой ALTER TABLE чем много маленьких.
И странно что ты делаешь изменение структуры БД из веб-скрипта. Такие вещи надо запускать в командной строке, также погугли про миграции. По моему ты изобретаешь велосипед.
Ну и mysql_fetch_array устарел несколько лет назад. Изучай PDO.
ОП и шарящие в 3 слиме ананасы, ай нид хелп с файлообменником. https://github.com/never3ver/fileshare/blob/master/public/index.php#L92 Пытаюсь реализовать отображение страницы ошибки при отсутствии файла для скачивания, ситуация абсолютно идентична как для обработчика самого слима так и для самописного обработчика. При нажатии на ссылку "скочять" фаерфокс сначала показывает свою страницу об ошибке, что-то там про "firefox couldn't find...", при обновлении либо нажатии try again отображается уже то что и должно вылезать, т.е. моя страничка с ошибкой или страничка обработчика слима. Хромиум вообще пытается скачать файл весом 0 с именем плейсхолдера. Далее, и в лисе и в хромиуме при прописывании ссылки в адресной строке или открытии ссылки в новой вкладке/окне все работает как часы, т.е. я сразу вижу то что должно быть. Почему так?
Надо бы открыть отладчик в браузере (Ctrl + Shift + I) и посмотреть на вкладке network что там посылается и получается.
Также можно установить Wireshark, но он не ловит пакеты на 127.0.0.1, тебе надо узнать IP на сетевой карте и обращаться к нему. В Вайршарке будет видно все, что пересылается. желательно закрыть все лишние программы чтобы было меньше мусорного трафика.
В любом случае ты должен не гадать вслепую, а уметь посмотреть HTTP запросы и ответы.
В гугле есть уроки https://www.google.ru/search?q=psr-7&newwindow=1&gbv=1&sei=wT0QWKKKKJHLsAGnkzY хотя по моему если долго смотреть на код из самого стандарта то более менее понятно станет. Там описаны интерфейсы для классов, которые представлояют разные виды HTTP сообщений (запрос/ответ). Мне немного не нраится что туда еще $_SERVER засунули который мало отношения имеет к HTTP.
Для показа страниц ошибки может быть стоит сделать функию.
Тогда у тебя все хорошо. У тебя есть низкоуровневый инструмент - tcpump + GUI инструмент WireShark который все отлично будет перехватывать. Обязательно попробуй его.
Вот пример использования tcpdump- https://texnoblog.wordpress.com/2010/04/17/using-tcpdump/ - его просто запустить, но увы, он выводит пакеты, а не собранный HTTP диалог. Ели ты не разбираешься в TCP/IP то будет немного сложно понять.
Также, есть такая тулза как curl. С ней легко отправить запрос руками:
>>863775 спасибо, я прочитал урок, про нормализацию даже понял/заучил первые 3 формы. По ссылкам прошелся, часть задач решил, но вопрос именно про проектирование базы данных для типичных задач, вроде способов хранения свойств товара. В нете есть много статей, но они все отрывочны и словно пересказ пересказа. 99% предлагают EAV. Также нашел еще 2 решения: для каждой категории товаров своя таблица, и общая таблица для всех товаров (поля с отсутствующими свойствами товаров заполняются NULL).
>>863333 Выше предлагал сделать одну таблицу с общими свойствами цена/название, а индивидуальные свойства категорий товаров реализовать с помощью EAV?
>>863795 Обязательно покопаюсь в этой теме подробнее, сейчас я запустил wireshark и вот что заметил: пикрилейтед показывает, что при отображении фаерфоксом собственной заглушки, это второй пик >>863783, в теле ответа есть верстка. Почему она не обрабатывается браузером?
>>863808 Попробовал через оперу, старую, еще до вебкита, в ней все норм! Даже в links работает как надо, кек. В общем я воткнулся в тупик с этой ситуацией.
>>863814 Резюмируя: сервер получает запрос и отдает правильный ответ, на который странно реагируют лиса и хромиум, лиса думает что у ответа нет тела, хромиум вообще ничего не думает и пытается скачать файл с нулевым размером, при обращении по вбиванию ссылки в адресной строке и при пкм и открытии в новой вкладке все норм. При этом старая опера и консольный линкс реагируют адекватно без всяких проблем, уверен что остальной зоопарк маргинальных линуксобраузеров также покажет отсутствие каких-либо неприятностей. Какая-то НЁХ.
>>863818 Все, решил проблему. Дело было в наличии атрибута download в ссылке. Потому и некробраузеры нормально реагировали, им этот атрибут по всей видимости неизвестен.
>>863674 У тебя не вычисляется в последний месяц 1000 за кредит и три процента от 200 с чем-то рублей. Но вот сами эти 200 с чем-то рублей прибавляются. Задача - на последнем круге прибавить и 1000 + 3% от 200.
>>863773 >Ну и mysql_fetch_array устарел несколько лет назад. Изучай PDO. Этот поезд в огне, но по прежнему едет в Бабруйск. PDO будет в версси 2.0.
Мне нужно заменить в таблице все запятые точками, за исключением первого столбца. Как это сделать? Если имена столбцов известны, то можно просто их прописать в запросе типа $request_create_table = "UPDATE $table_1c SET `НДФЛ` =REPLACE (`НДФЛ`, ' ', '');"; Но если их много и они могут изменяться? Можно, конечно, подсчитать количество столбцов, потом запустить цикл и последовательно в каждом столбце изменить (за исключением первого), но мне кажется, должно быть более простое решение. Или нет?
>Там наверно надо брать сумму, а не заложенное жестко число 9999 Нет, там так и задумано, но если есть вариант лучше - с удовольствием выслушаю.
>Этот массив можно получить из $check. Мне нужны были в цикле не только значения номиналов(100, 200, 500), но и их ключи для более простой записи(они используются в цикле где инициализирована переменная $i), но если возможно использовать один массив, при этом не сильно усложняя запись кода - так и сделаю.
>Не очень понятно почему не просто $check = array ... у каждой суммы, которую можно выдать - свой запас банкнот, который хранится в $check[n], где n - сумма, которую нужно выдать. При этом используются только те элементы массива $check, при котором возможно выдать сумму n используемыми номиналами, если сумму выдать невозможно, в элементе массива $check[n] будет NULL.
>>863621 Да, знает и видит, что можно заплатить меньше 5к. Но дело в том, что вот на последнем месяце ему надо заплатить 200 рублей - а ведь ещё и 1000 за обслуживание кредита, а ещё 3% от этих 200 рублей. Там в какой-то момент сумма становится 4к - а к ним прибавляется 1000 за обслуживание и проценты, в итоге как раз остаётся 200р, к которым опять тыщу и проценты нужно прибавить. Вот тут какая логика.
> А это можно, складывать строку и массив? Интересно. ...
Не рекомендуется все что кроме строк складывать со строками? А то мне понравилось, что в js есть возможность преобразования любого объекта в строку (toString), которое еще можно по-своему сделать.
> для обозначения типа надо тут тоже использовать константу ...
SMALL_SIZE: {money: 50, calories: 20},
Вот так? Или как. Кстати, а есть ли возможность в js узнать имя переменной? Я пытался в первом решении этой задачи вытащить имя константы из Hamburger.ИМЯ_КОНСТАНТЫ, но не нагуглил как такое возможно.
Подключаю много файлов в отдельном файле, а потом подключаю его к нужным мне файлом, в таком виде: include "inc\db.php"; include "inc\quest.php"; include "inc\quest_maper.php"; include "inc\option.php"; include "inc\option_maper.php";
Пытаюсь добавить ещё один файл:
include "inc\voter.php";
Выводит ошибку failed to open stream
Если записать вот так:
include "inc/voter.php";
Всё начинает работать, причём слеш в предыдущих подключениях не меняю, всё выглядит таким образом:
include "inc\db.php"; include "inc\quest.php"; include "inc\quest_maper.php"; include "inc\option.php"; include "inc\option_maper.php"; include "inc/voter.php";
>>864225 Вряд ли это поможет, но я читал о том, что если использовать include/require вместо include_once/require_once, то это может привести к проблемам при множественном подключении различных скриптов. В одном из include'ов вверху есть уже include "inc\voter.php"? Почему ты просто не используешь автозагрузчик композера, твои обратные слеши не будут под линуксом работать.
> SMALL_SIZE: {money: 50, calories: 20}, > Вот так? Нет, не так. Обычно исплоьзуют число или строку в качестве значения. Я специально в комментариях к задаче написал что если поменять значение константы, программа должна работать так же как и раньше.
Константа используется для обозначения типа гамбургера, а не хранения его цены.
> Не рекомендуется все что кроме строк складывать со строками? Главное чтобы ты понимал, по каким правилам происходит это сложение. Не сказал бы что это полезная фича, из-за нее ошибки остаются незамеченными, например:
return "Size: " + hamburger;
вместо
return "Size: " + hamburger.getSize();
Из-за того, что JS позволяет строку сложить с объектом, ошибка в первом варианте остается незамеченной.
> if (is_array($value)) { мне кажется проще все значения сделать массивами, просто там, где единственный вариант, делать массив из 1 элемента, например ["\n"]. Хотя не знаю, твой вариант тоже в годится.
Хороший повод не использовать атрибут download (либо написать разработчикам браузера в багтрекер). Я не знал про такую особенность. Как по мне, так лучше не пользоваться тогда этим атрибутом, а полагаться на Content-disposition.
Еще у некоторых браузеров есть/была особенность, что если тело страницы с ошибкой меньше определенного порога, то они вместо нее показывают свою. Может у старых ИЕ была такая проблема.
В случае с товарами мы имеем наследование таблиц (то есть мы можем вообразить что у нас есть таблица товаров-процессоров, таблица товаров-монитров, и тд и все они унаследованы от базовой таблицы товаров). Для наледования таблиц есть несколько стандартных паттернов:
1) видов товаров очень много так что например реализация Class Table Inheritance потребует кучу таблиц и приведет к гигантским запросам с джойнами 2) свойства и категории товаров могут добавляться менеджерами без привлечения программиста - значит надо бы это делать без изменения структуры базы
Потому в таких случаях используют EAV. Она обычно содержит примерно такие таблицы (пишу по памяти, могут быть неточности):
- таблица категорий товаров - таблица всех существующих свойств - таблица связи М-М между категориями и свойствами - таблица значений свойств, перв ключ в ней (id товара + id свойства), плюс она обычно содержит колонки вроде intValue, stringValue, dateValue для разных типов значений
EAV имеет и недостатки. Это некоторая громоздкость запросов и возможные иногда затыки с производительностью. Для борьбы с ними можно использовать разные формы кеширования, в том числе и с хранением денормализованных (избыточных) данных в самой БД.
Но обычно все же используеют именно EAV благодаря ее гибкости и расширяемости и соответствию принципам нормализации.
> Также нашел еще 2 решения: для каждой категории товаров своя таблица, и общая таблица для всех товаров (поля с отсутствующими свойствами товаров заполняются NULL). Это реализации описанных выше паттернов.
> вопрос именно про проектирование базы данных для типичных задач, Ну вот в моем уроке перечислены основные принципы на основе которых делается проектирование:
Какие можно использовать методы в качестве защиты от накрутки при голосовании? Я создал таблицу в БД, куда заношу IP проголосовашего, и потом если его IP есть в базе данных и от соответствует id опроса вывожу ему сразу результат. Но, пользователь может сменить ip. Стоит ли вешать ещё и куки при голосовании, а потом проверять по ней, ведь куки он может тоже почистить?
Пользователь может сменить и IP и куки и при желании даже User-Agent. Вопрос лишь в том, что стоит на кону. Если ценный приз - накрутят сколько угодно голосов.
Сап, у меня цель за два месяца устроится на стажировку/джуном/даже за бесплатно, опыта в программировании очень мало, изучал многие языки по чуть-чуть, то есть только синтаксис, пхп среди них. Возможно ли это? Думаю задрачивать каждый день 6-10 часов.
Считалочка. Добавил имена из одной из прошлых задачь, так что вместо простого решения задачи, получился эдакий сложный левел. Пришлось изучить все аспекты сравнения массивов. http://ideone.com/VC2y4t
Да, в задаче сказано сколько человек в классе и сколько слогов в считалочке, но ничего не сказано о том, сколько человек должно в итоге остаться пить чай. Поэтому у меня это 7 человек. И наверное поэтому у меня и у ОПа разные ответы (хотя скорее всего я неправильно решил задачу.)
Видел, что для кеш файлов используют сериализацию/десериализацию, а имена для файлов пропускаются через md5. Вопрос: зачем? инбфо: Вот у тех кто так пишет и спрашивай. Мне нужно кешировать html-странички (чтобы не мучать чужой сайт запросами) и я не особо понимаю зачем страницы сериализовать и имена прогонять через md5.
>>864399 Думаю, разобрался. Функция md5 нормализует имя файла, так как её результат - только латинские буквы и цифры, без слешей и прочих ненужных символов. А сериализация мне не нужна, так как я сохраняю только страницы, а не переменные.
>>864452 Я не разбирался с алгоритом работы md5, но он ведь 100% даст уникальное имя для URL? А мои функции, фильтрующие слеши и все остальные символы, могут в теории дать разным URL одинаковые имена при создании кеш-файла. Например, если я буду убирать из URL символы [^\w\d]
Или можно просто сделать preg_replace для '/' и '\' на 'slash'.
Не очень понятно, зачем if, если обе ветки одинаковы.
Считает вроде верно.
Навигатор >>Попробуй написать решение с рекурсией > Что-то слепил, немного не по предложенному алгоритму. Поэкспериментировал, вроде бы решает верно. > http://ideone.com/fbSU5j
> static $allPath = array(); Вот это неправильно. Эта же переменная никуда не исчезает и при попытке проложить второй маршрут в ней останутся данные из первого. Получается побочный эффект. Очевидно тут нельзя ее использовать.
Функция не должна ничего сохранять в долгоживущую переменную. Она получает нужные ей данные через аргументы и возвращает через return.
Маска файла >>Также, дам дополнительную задачку на рекурсию, чтобы лучше в ней разобраться > http://ideone.com/yWXwSo
Некорректно работает для маски te*?? и имени tennis ( http://ideone.com/UuWPSV ). Значит, есть ошибки в алгоритме.
Я думаю, проблема в том, как ты обрабатываешь звездочку. Ты при наличии звездочки сначала проверяешь версию, что она не соответствует ни одному символу:
А только потом, в другом месте, ниже, пробуешь убрать один символ из файла. Но это происходит в самом конце функции и если после звездочки идет знак вопроса, до туда просто не доходит выполнение.
Не надо разносить код обработки звездочки на 2 части. Надо вписать его внутри if ($lMask == '*').
Там можно использовать либо цикл либо рекурсию. Кстати, перебирать варианты можно в 2 направлениях:
- попытаться захватить зведочкой весь остаток имени, а если не сработает, убавлять символы по одному - это "жадный" подход, звездочка пытается съесть максимум символов - наоборот, попытаться захватывать по 1 символу, увеличивая длину - это "нежадный" подход
То есть логика тут примерно такая:
- если в маске встретилась звездочка, она может соответствовать от 0 до N любых символов. Соответственно, делаем цикл и перебираем все варианты, пока какой-нибудь не сработает. Либо рекурсия (то же самое, но другим способом): вызываем сами себя 2 раза: со звездочкой и отрезанной буквой от имени и без звездочки и проверяем, совпал ли хоть один. Но мне кажется, с циклом будет нагляднее. Тут жадность звездочки определяется порядком вызова.
Навигатор > http://ideone.com/0SJSa0 > Нормально ли здесь использовать global или нужно всё же передавать через параметры?
Не, это плохая идея так как создает побочные эффекты и затрудняет понимание работы функции.
> $labels[$point] = PHP_INT_MAX; есть еще константа, обозначающая бесконечность - INF
> function doAlgorithmDijstra($labels, $visited) Комментарии улучшают код, но тут стоило бы дописать еще тайп-хинты (array $labels).
> Поиск вершины с наименьшей меткой Это можно было вынести в отдельную функцию ради читабельности.
> foreach ($labels as $label => $value) { $label наверно правильнее было назвать как $pointName, а $value как $distance или $time или $label.
> $nextPoint = $paths[$workPoint]; Не $nextPoint, а $nextPoints (множ. число)
Сама реализация выглядит верно.
> В алгоритме сказано: > ".. из ещё не посещённых вершин выбирается вершина u, имеющая минимальную метку", для этого я выполняю: > вроде бы всё по алгоритму… Ну ок, значит я не разобрал код правильно. Может потому, что он был не очень понятный. Сейчас намного лучше.
Вектор > Убрал в функция createEmployee, padLeft, padRight - тайп-хинт > //Для int и string, т.к. ideone считает их за объекты Это потому что там PHP5, а не PHP7.
> Метод возвращающий имя компании Лучше "Возвращает название компании"
Комментарии в общем хорошие. Но не менее важно давать такие имена переменным и методам, чтобы их назначение было понятно без комментария (у тебя это более-менее соблюдается).
> abstract protected function setSalary(); Правильнее назвать getDefaultSalary() так как этот метод не меняет ставку, а возвращает ее значение по умолчанию. Сделать чтобы они возвращали нужное число, а не присваивали.
В случае с профессией, она не может поменяться, потому логично убрать свойство profession и оставить только абстрактный метод getProfession().
Константы LARGE_COL можно поместить в класс CompanyReport, так ка кони с ним связаны. Обычно пишут как CompanyReport::COL_LARGE, то есть тип знаечния идет в начале.
> preg_match('/([0-9]+)x([а-яё]+)([0-9])/iu', Нет привязки к краям строки, также теоретически строка может не соответствовать регулярке и надо бы поставить if.
> $isDirector = ($i == ($totalPeople - 1)) ? true : false; То же самое что $isDirector = ($i == ($totalPeople - 1)). == возвращает true или false.
> for ($i = 0; $i < $totalEmployee; $i++) { > $departament->addEmployeeToDepartment($employee[$i]); Тут лучше foreach использовать.
Так, в общем, неплохо.
Антикризисные меры > А такие вещи, как количество инженеров/менеджеров можно оставлять в Департаменте? Если эта функция достаточно универсальна и может использоваться где-то еще, то можно в Департаменте. Вместо 4 отдельных функций лучше сделать одну, принимающую название класса. А то что ты будешь делать, если надо добавить новые профессии?
Можно усовершенствовать функцию еще дальше и принимать анонимную функицю, которая получает по очереди каждого работника и определяет, учитывается ли он или нет. Это позволит делать подсчет по произвольному условию.
>>Если директора нет, будет ошибка обращения к несуществующей переменной > Создал до цикла. Какое значение при создании будет правильней: NULL, false? null, так как оно обычно обозначает отсутствие значения.
> Здесь можно использовать значение по умолчанию setSalary($salary = 500)? То есть, ставим зарплату по умолчанию, как указано в задании, а в случае чего, антикризисный комитет может поставить свое значение.. Или нужно пересмотреть подход?
Я думаю, лучше сделать отдельную функцию определения начальной зарплаты и отдельную для ее изменения.
> $countDepartment = $this->getCountDeparments(); > for ($i = 0; $i < $countDepartment; $i++) { Тут лучше foreach использовать.
Увольнение у тебя реализовано на мой взгляд неправильно. Ты берешь список работников, меняешь его и записываешь его назад в Департамент. Но разве это правильно, когда любой может менять список работников? Правильнее будет использовать инкапсуляцию и скрыть список работников внутри Департамента так, что снаружи можно только вызывать методы найма и увольнения, но нельзя менять список напрямую. Это задача Департамента - поддерживать список работников.
А ты фактически кусок кода из Департамента вынул и перенес в другой класс. Логичнее если Антикризисный Комитет знаимается более высокоуровневыми вещами чем ручная правка списка сотрудников, а правкой списка занимается Департамент.
Или представь, например, что ты захочешь сделать счетчик уволенных их Департамента работников. В твоем нынешнем коде тебе придется искать все места где их увольняют, и туда вписывать еще увеличение счетчика. А в моем варианте код увольнения находится в Департаменте и добавить счетчик очень просто.
То же самое касается и назначения нового Директора - это логично сделать методом в Департаменте.
Кстати поиск работников соответствующих условию - тоже довольно универсальная вещь, чтобы реализовать ее в Департаменте.
> uasort($listOfEmployee, 'sortByRank'); Вместо глобальной функции тут лучше использовать метод класса или анонимную функцию:
> echo " ".phoneNumberCheck($correctNumbers[$i])." \n "; Но функция phoneNumberCheck() ничего не возвращает, а ты пытаешься ее результат вклеить в строку.
Работает правильно.
Старые ответы - ВекторАноним27/10/16 Чтв 15:47:13#921№864630
> public function getSalary() > { > $salary; А что делает команда $salary; ? В PHP объявлять переменные не надо. Они сами создаются при прсвоении значения.
У тебя конструктор класса-наследника проставляет зарплату по умолчанию, потребление кофе итд. Но ведь это не очень очевидно, что при наследовании надо написать это в конструкторе. Надо бы сделать код более очевидным. Например, сделать абстрактный метод getDefaultSalary() который обязан будет реализовать наследник.
> public function addEmployees($number, $class, $rang) > public function addDirector($class, $rang)
На мой взгляд, тут лучше сделать по-другому. Создание работников - не задача Департамента. Его задача - поддерживать их список, принимать и увольнять. Есть ли какая-то причина, по которой Департамент должен сам создавать объекты Работников, а не принимать уже созданные? Мне кажется удобнее создавать их снаружи, так как мы в этом случае можем менять разные свойства работника перед приемом на работу.
В классе Company ты зря в конструктор прописал список работников. Ведь получился не универсальный класс Компании, а с жестко заложенным списком. Лучше сделать универсальный класс, а работников создавать снаружи.
Вывод таблиц тоже лучше бы убрать из класса Компании. Его задача наверно представлять компанию и хранить департаменты, а не выводить отчет. Хотя конечно тут программа не очень большая, и можно совместисть эти функции, но лучше наверно сделать вывод отчета отдельно от Компании.
> PHP Notice: Undefined variable: sumOfSalary in /home/kGVikj/prog.php on line 221 А вот это надо бы исправить.
Если разобрать, что делает код, то будет очевидно, почему пропадает первая строка.
> Насколько я понимаю, mysql_fetch_array при каждом вызове сдвигает указатель, поэтому такая шляпа и происходит. Как это пофиксить? Ну ты в общем-то прав. Пофиксить - поменяв алгоритм работы.
> $mobileNumber = str_replace(" ","",$mobileNumber); > $mobileNumber = str_replace("-","",$mobileNumber); Эти 4 строки можно заменить одной preg_replace. Что и сделано во второй версии функции. Только я бы не заводил переменные $pattern и $replacement, а сразу бы подставил строки.
> (^ ?8|^\+ ?7) ^ можно вынести за скобку
> PHPstorm говорит что код не будет работать и ругается именно на строку где я считаю сколько осталось денег отдать банку. Уж не понимаю почему так. Ты бы ссылку еще дал на тот код, а то я подсказать не смогу ничего.
Сложновато как-то. Это ведь решается одной регуляркой, они для того и придуманы, чтобы кода меньше писать.
> return NULL; // А так можно? Логичнее возвращать исходную строку. А то странно, функция удаляет все из строки если там нет латинских букв. Легко из-за этого ошибиться.
И как я понимаю, если написать английскими буквами и через пробелы: ДY PAK то функция пропустит слово: http://ideone.com/SCdl9U
Старые ответыАноним27/10/16 Чтв 15:48:12#923№864632
> function City(powerStations, powerPanels, powerLines, houses) { Удобнее тут сначала создать пустой город, а потом добавлять элементы сети. Плюс, у тебя класс так написан, что добавить новые виды элементов сети нельзя. А надо, чтобы было можно. Ну например, завтра появится какая-нибудь ТЭЦ которая вырабатывает электричество и тепло сразу. Или аккумулирующая станция, запасающая энергию днем и отдающая ночью.
Лучше сделать универсальный метод city.addNetworkElement(element).
Насчет функций. Там много похожего кода. Лучше сделать одну функцию, считающую и возвращающую все данные (баланс, прибыль/расходы, количество произведенного/потребленного), и вызываеть ее из функций вроде getFinanceResult ().
> City.prototype.getFinanceResult = function(overflowPower) { Неудобно как-то. Почему нельзя без передачи overflowPower сразу получить результат?
> Util.convertKwToMw Я бы советовал использовать внутри везде стандартные единицы, а преобразоывать только если на выходе, хотя лучше вообще не преоразовывать. Пусть другой код этим занимается.
> House.FLAT_TAKE_DAY_POWER = "4KW"; Проще наверно в ваттах или киловаттах все считать...
> PowerPanel.TYPE_ONE = "typeOne"; > PowerPanel.TYPE_TWO = "typeTwo"; лучше наверно просто мощность числом передать.
Элементы сети (электростанции, дома) имеют кое-что общее:
- их можно присоединить к сети - они потребляют или отдают энергию в сеть
Раз так, логично тут использовать наследование и сделать общие методы, например чтобы узнать их вклад в баланс энергии. Тогда мы сможем в Городе не разделять их по типам, а работать с любым элементом сети одинаково.
Ну к примеру для подсчета баланса достаточно просто просуммировать вклад каждого элемента независимо от типа.
> Правильно ли я поступил, что не делил методы на дневные и ночные, а в борьбе с копипастой соединил их, разделив логику кода через аргумент timesOfDay? Можно так сделать, можно сделать 2 метода.
> И нужно ли было решать отдельно для разных времен суток. По идее хорошо бы иметь возможность получить дневной/ночной балансы отдельно.
Старые ответыАноним27/10/16 Чтв 15:48:42#924№864633
> ([a-z0-9\-])+\.)+([a-zа-я0-9] почему-то в начале доменного имени можно использовать только латиницу, а в конце - еще и кириллицу. А так, работает верно. Я бы только еще \b добавил для надежности. А то вот такое получается: https://ideone.com/6Vs5HX
> Оп сделай пожалуйста задачи на двумерные массивы! Подумаем, вообще многомерные массивы усложняют понимание кода и с ними важно не переусердствовать.
> Напиши скрипт, проверяющий текст на наличие злостных ошибок: > В общем как всегда 2 варианта. > str_replace https://ideone.com/IZHbzC
> $regexpA='/(\s\sа\s)|(([а-я0-9]\sа\s))/u'; > $regexpNO='/(\s\sно\s)|(([а-я0-9]\sно\s))/u'; Они очень похожи, можно объединить. Вместо \s\s не лучше написать "1 или более раз \s" ? Если после "но" стоит запятая, \s не сработает, лучше использовать \b.
> $regexpSpace='/(,[^\s])|(;[^\s])|(![^\s])|([?][^\s])|([.]{2}[^\s])|([:][^\s])/'; Это можно упростить, используя для знаков препинания символьный класс [....]
> '/(жы)|(шы)/ui'; И тут можно укоротить регулярку за счет символьного класса.
> '/(координально)|(сдесь)|(зделал)|(зделаю)|(зделан)/u'; Скобки не нужны.
> (зделал)|(зделаю)|(зделан) Это можно сгруппировать и укоротить.
str_replace что-то уж очень много. Лучше preg_replace.
Разбивать на слова не обязательно - если делать правильно, можно заменять сразу в тексте.
> Ведь если просто поставить кнопку, то в пхп-скрипт улетят все данные из инпутов и страница перезагрузится. А мне хочется, чтобы не перезагружалась. тебе рано браться за аякс, тебе надо изучить обработку событий в DOM. https://learn.javascript.ru/events-and-interfaces
Старые ответыАноним27/10/16 Чтв 15:49:40#926№864635
> -++$i, Так писать не стоит, так как трудно понять последовательность действий. $i++ лучше вынести на отдельную строку.
> Айпад в кредит http://ideone.com/E90Mea > if ($creditBalance <= $monthlyPayment) { > $monthlyPayment = $creditBalance; Тут можно заменить if на min/max
Решено верно.
Старые ответыАноним27/10/16 Чтв 15:50:18#927№864636
> Внезапно выяснилось что хром сам зменяет все двойные пробелы на одинарные. Скорее всего ты выводишь текст не как текст, а как HTML, а в этом языке любое число пробелов и переводов строк воспринимается как 1 пробел.
> return mb_strtoupper(mb_substr($text, 0, 1, 'UTF-8'), 'UTF-8') . Слишком длинно, многое можно выкинуть.
> [.]|[!]|[?]|[;] Тут лучше использовать просто квадратные скобки без вертикальной черты
> foreach ($sentences as $sentence){ > echo $sentence; echo лучше ставить снаружи функции.
> $yodaSay=preg_replace("/([[:punct:]]+)\s/", '$1 ', $yodaSay); > $yodaSay=preg_replace("/\s([[:punct:]]+)/", '$1 ', $yodaSay); Это можно сделать одной строкой
Если подходить с точки зрения нормализации и "идеального" проектирования, то у тебя нет такой вещи как "пользователь в комнате". У тебя есть список пользователей, комнат и список заходов/выходов пользователей в комнаты. Но работать будет очень неудобно, да и чат не банк чтобы требовать такой уровень, потому проще сделать просто связь между пользователями и комнатами.
Лучше не делать связь "много пользователей - одна комната", а сделать "много пользователей - много комнат", то есть пользователь может сидеть в нескольких комнатах.
> Сам чат само собой аяксовый и будет работать без перезагрузки, но любой пользователь в любой момент может перезагрузить страницу, и каждый раз будут дополнительные запросы к базе данных ради проверки принадлежность ид пользователя, к этой комнате, не слишком ли это будет напрягать базу сам сайт? думаю нет, если правильно расставить индексы.
Старые ответыАноним27/10/16 Чтв 15:50:49#928№864637
> if ($number == 1) { А если число == 21 ? Выведет "рублей"? 21 рубль должно быть.
> }elseif ($number == 0 || $number >5 and $number<21){ > return "рублей"; > }else { > return "рублей"; По моему elseif тут не особо нужен
> $splitter = preg_split('//u', $number, -1, PREG_SPLIT_NO_EMPTY); С числами надо работать математическими методами, деление, умножение, а не как со строками.
> function smallNumberToText($number, $isFemale) Функция переусложнена и много кода дублируется. Надо упрощать до 5-6 условий.
> switch (($separatedNumbers[$i])) { > case 1; > case 2; Разве это не задача функции inclineWord выбирать форму слова?
> Исходное число 39917850 > На вашем счету три квадриллиона девять триллионов девять миллиардов один миллион семь тысячь восемьсот пятьдесят рублей Неправильно ведь. Там всего 39 миллионов с копейками.
Если ты хочешь считать квадриллионы, надо кое-что учесть. В PHP есть 2 типа чисел:
>>864630 >Ну ты в общем-то прав. Пофиксить - поменяв алгоритм работы. Я там костыль вставил. После первого вызова смещаю указатель обратно. >>864634 >тебе рано браться за аякс За ссылку спасибо, а аякс просто работает.
> $op=$char; > $number = 0; Это повторяется много раз. Надо бы избавиться от повторов.
> Алсо не могу понять почему строка 37 не выводит echo Потому что в группе if/elseif может выполниться только один блок, и до условия elseif ($char=="=") { просто не доходит. Срабатывает одно из более ранних условий вроде elseif ($op == "+")
Вроде никаких особых различий нет. От версии ОС может зависеть список поддерживаемых аудио/видеокодеков, но в ИЕ8 их (как и HTML5) еще нет. Если выбирать что-то одно, я бы ставил под Win7 как более распространенную.
Как передать аргументы во внутреннюю функцию? Первое решение это получать массив аргументов внешней ф-ии. Можно передавать его аргументом, а можно и нет, все равно он будет доступен. Но внутренняя ф-ия должна уметь с ним работать. Например ф-ия add из примера не работает с массивом: function add(a, b) { return a + b; } Второй вариант, это попробовать сформировать строку, а потом превратить ее в функцию.
> For radio buttons, the required attribute is satisfied if any of the radio buttons in the group is selected. > To avoid confusion as to whether a radio button group is required or not, authors are encouraged to specify the attribute on all the radio buttons in a group.
То есть да, достаточно указать required хотя бы на одной радиокнопке и она примняется к блоку в целом. стоит всегда проверять такие спорные вещи по стандарту, а не надеяться на "авось работает".
> Гугл говорит что тип YEAR корректно работает с промежутком 1901-2155. Как это лучше обойти? Либо использовать другой тип (вроде MEDIUMINT), либо запретить 1900 год в валидации. Странно для типа с названием YEAR иметь такие дурацкие ограничения. 1900-й был не так и давно.
Читать тяжеловато, надо сделать промежутки между колонками.
> count($lines)+10; Откуда взялось 10? Что еще за магическое число? Нужно определять максимальную длину строки, а не подбирать наугад.
> if ($symbols[$i]==' '){ > echo " "; не очень понятно, зачем тут if.
> $symbol = preg_split('//u', $lines[$i], -1, PREG_SPLIT_NO_EMPTY); переменная $symbol не используется.Ошибка в этой строке из-за того, что ты обращаешься к несуществующим элементам массива $lines.
> Ошибка при обращении к несуществующему элементу массива проявляется. Может кто подскажет как её обойти? Не обращаться к несуществующим элементам.
Старые ответыАноним31/10/16 Пнд 22:10:26#941№867398
https://github.com/ghp26/Students/tree/master/public/tpl Почему шаблоны в публичной папке? Чтобы их можно было открыть браузером напрямую и просмотреть их код? Также, не стоит смешивать в одной папке css и html, лучше разнести в разные.
> if (iconv_strlen($formValues['name'], "UTF-8")>50 Лучше может mb_strlen? Ей не требуется указывать кодировку, если она задана в mb_internal_encoding().
> Вот это не понял. валидатор заточен для работы с формой и больше ни для чего другого не используется. Идея ООП в том, чтобы разбивать код на максимально несвязанные части, так, чтобы каждый класс можно было рассматривать и редактировать в отдельности, особо не думая о других классах. Заодно это облегчает использование этих классов.
Если твой валидатор можно было бы использовать только с формой, то этот принцип нарушался бы. Но на самом деле, я тут не вижу привязки к форме, просто ты данные передаешь массивом. Это имеет такие недостатки:
- надо долго изучать код, чтобы понять, какого формата надо передать - в массиве могут оттсутствовать любые поля. Тяжело писать код, когда не уверен что поле есть в массиве.
Лучше будет сделать валидатор, который валидирует модель абитурента независимо от того, откуда она получена, и не знает ничего про форму. Это не всегда возможно, например в каких-то формах могут быть дополнительные поля, которых нет в модели, или дополнительные правила валидации, но в данной задаче это нетрудно сделать. Как бонус, мы получаем например возможность перепроверить внесенные в базу данные с помощью этого валидатора. Модель абитуриента у тебя уже есть.
> Да, у меня расчет что массив POST содержит все нужные поля, и это не безосновательно, потому что все поля POSTa проверяются валидатором и если в них есть ошибки, то код не поломается, а выведет странцу на которой будет указанно(подчеркнуто красным и написано текстом) что именно введено не правильно
Нет. Посмотрим на код:
> $errorsArray = $validator->validate($_POST); > .... > public function validate($formValues) > if (iconv_strlen($formValues['name'], "UTF-8")>50) Если в $_POST нет ключа name, то обращение к $formValues['name'] вызовет ошибку. Кстати, если вместо массива передавать в валидатор объект-модель студента, то проблемы не будет - в объекте всегда есть описанные в классе поля.
Класс сохранения абитуриентов в БД не должен заниматься поиском настроек или установкой соединения.
Папку .idea надо убрать из репозитория, внести в .gitignore, вернуть. папку vendor тоже. В репозитории должен быть твой код, а не устаревшие копии сторонних библиотек.
Кстати, раз уж ты используешь композер, зачем вручную делать require автозагрузчика твига? Исопльзуй композер и для автозагрузки своих классов тоже.
> "WHERE `birth` LIKE %текст_на_кирилице%" выдает ошибку SQL General error: 1271 Illegal mix of collations for operation 'like' > Что с этим делать так и не придумал, поэтому поиска по дате пока нет. Вообще совершенно внезапно прога начала выдавать эту ошибку. Я что-то вспоминаю, это из-за того, что оно типа DATE. Если открыть мануал на англ., то видно:
> Implicit conversion of a numeric or temporal value to string produces a value that has a character set and collation determined by the character_set_connection and collation_connection system variables. (These variables commonly are set with SET NAMES. For information about connection character sets, see Section 11.1.4, “Connection Character Sets and Collations”.)
Числа и даты при преобразуются в строку (а это происходит при исплоьзовании LIKE) с использованием кодировки и collation (правил сортировки строк по алфавиту), которые заданы в настройках соединения с mysql (обычно это делается через SET NAMES).
У тебя не задана кодировка соединения и используется какая-то, заданная в конфиге mysql. Очевидно, что она не совместима с кодировкой, используемой в поисковом запросе. Ты можешь узнать какие конкретно там кодировки и collation запросами (их надо делать из php скрипта):
SELECT CHARSET('%пример запроса%'); SELECT COLLATION('%пример запроса%'); SELECT CHARSET(birth) FROM students LIMIT 1; // + то же самое с COLLATION
Попробуй сделать и посмотреть, что выведется. В таблице у тебя utf8, а вот какая кодировка соединения - непонятно.
Скорее всего там будут несовместимые значения. Чтобы это исправить, надо задать кодировку соединения с БД utf8.
Старые ответыАноним31/10/16 Пнд 22:11:06#942№867400
Не нужно заменять ключи, лучше сделать отдельный массив с заголовками. Также, там бы не помешало немного ООП, плохая идея передавать массивы непонятных форматов, в которых непонятно, есть ли нужные ключи.
> for ($k=0;$k<33;$k++){ Откуда взялось число 33? Если мы поменяем текст, надо вручную персчитывать это число? Зачем тогда вообще компьютер нужен, если все делается вручную?
Найти максимальную длину строки в массиве несложно. При желании это делается в 1 строку с помощью array_map и mb_strlen.
> if($doubleArray[$r][$k]==' '){ > echo " |"; зачем для пробела делать особый случай? Это такой же символ, как и другие.
Вместо $k и $r лучше использовать те же $i и $j.
> for ($j=0; $j<count($symbol); $j++) { > $doubleArray[$i][$j] = $symbol[$j]; Тут не нужен цикл. Копирование массива делается одной строчкой.
Надо дорабатывать программу и получше разобраться в работе с массивами.
> Попытался сделать с разметкой как у опа, но я слишком ньюфаг для этого. там всего лишь надо немного пробелов добавить.
>>867400 >> Попытался сделать с разметкой как у опа, но я слишком ньюфаг для этого. >там всего лишь надо немного пробелов добавить. не работает в современных браузерах. Пробелы все удаляются же.
>>867625 Нет, если ты записываешь в строку пробелы, а они не выводятся, значит или что-то не так в коде, или пробелы ты на самом деле не записал или ideone опять шатают, но это маловероятно.
Чтобы переносы строк (и пробелы) нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк и пробелы в нем (так как в языке HTML перенос строки и любое число пробелов равносилен 1 пробелу).
Иначе перенос строки и пробелы будут в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице их не будет.
Старые ответыАноним01/11/16 Втр 14:09:07#946№867751
С комментариями конечно становится понятнее. Однако, не стоит ссылаться на номера строк, так как ои могут меняться при редактировании и тебе придется возвращаться и править комментарий. Лучше просто разбить комментарий на части и написать их перед относящейся к ним командой.
Например, так:
// проверка определяет есть ли нужная купюра номиналом $i в банкомате $check[$k] = $check[$k - $nominals[$i]];
Комментарии должны описывать алгоритм и ход мыслей автора, а не пересказывать содержимое каждой строчки. Вот этот комментарий несет мало пользы:
$tic = true; > также переменная $tic становится true
Я понимаю, что ты описывал ход выполнения программы, но в данном случае ты описал его слишком подробно. Лучше было бы написать, для чего она предназначена, а то, что ей присваивается true, легко увидеть в коде. И надо дать ей нормальное имя, так как я не понимаю, что значит "tic". Что за тик?
Я вижу комментарий "переменная, которая позволяет или запрещает добавить одну банкноту к истинному решению, в зависимости от истинности выражения в строке ", но он мало что проясняет. Наверно надо написать "переменная, показывающая, найден ли способ выдачи суммы в $k рублей"
> $bestNominal Тоже непонятно, что значит "лучший номинал"? По каким критериям он лучший?
> $solutionsStorage > Значение массива $solutionsStorage под ключём n - лучшее(меньшее) количество банкнот, которым можно выдать число n. Тогда массив правильнее назвать $minNotesForSum. В этом случае код будет гораздо очевиднее и потребует меньше комментариев.
Массив $check тоже назван не очень удачно так как непонятно что он "проверяет". Не описано нигде, что он хранит.
В общем, вот как надо сделать:
- описать перед переменными их назначение (очевидные вещи вроде счетчика цикла можно не писать) - дать переменным название, которое соответствует комментарию - описать в начале алгоритм в общих чертах, не пересказывая ход выполнения программы, а описывая именно принцип работы алгоритма. Ну например:
/* Мы используем алгоритм <название> <ссылка>.
Мы берем последовательно суммы от 1 до до запрошенной суммы (6600) и для каждой определяем минимальное количество и оптимальный набор банкнот, которыми ее можно выдать. При этом на каждом шаге мы используем решения для предыдущих шагов, добавляя к ним 1 купюру. Ну например, если мы хотим выдать сумму в 900 руб., у нас есть купюры номналом 100, 200, 500, и ранее мы рассчитали, что:
- сумму в 800 руб. (900 - 100) можно выдать 3 купюрами (500 + 200 + 100) - сумму в 700 руб. (900 - 200) можно выдать 2 купюрами (500 + 200) - сумму в 400 руб. (900 - 500) можно выдать 2 купюрами (200 x 2)
То мы перебираем эти варианты, пробуем к каждому добавить по 1 купюре и выбираем лучший <по таким критериям>.
Очевидно, что сумму в 900 руб. оптимальнее всего выдать 3 купюрами, добавив 200р. к варианту выдачи для 700. Однако, мы должны учитывать и запас купюр. Если у нас имеется в запасе лишь 2 купюры номиналом 200, то мы можем прибавить 500-рублевую купюру к варианту выдачи 400 рублей.
Как только мы дойдем до запрошенной суммы, мы получим решение задачи.
При этом мы должны учитывать оставшийся запас купюр. <описание, как это учитывается>.
Если сумму не получается выдать <описание ситуаций, когда выдать сумму невозможно, например для суммы вроде 1 рубль>. */
Хорошие комментарии и описание очень важны, если ты хочешь работать в команде над каким-то большим приложением, так как твоим колллегам будет проще разобраться в коде и сложнее допустить ошибку. Но даже если ты работаешь один, понятный код сэкономит тебе самому немало времени.
Заметь, что я постарался избегать дословного пересказа кода.
Кстати, почему $check хранит оставшийся запас купюр, а не использованные номиналы? Так не проще было бы?
> $nominals = array(100, 200, 500, 1000, 2000, 5000); > $check[0] = array( > 100 => 0, > 200 => 3, nominals наверно можно получить из check.
> for ($i = 0; $i < count($nominals); $i++){ > $nominals[$i] Тут надо было применить foreach. Не надо копипастить выражение $nominals[$i] 10 раз.
> for ($k = 1; $k < $amount + 1; $k++){ Возможно, переменную надо было назвать как $testAmount или как-то так, чтобы было понятно, что в ней хранится.
> $k - $nominals[$i] >= 0 Может лучше писать $k >= $nominals[$i]
> $solutionsStorage[$k] = $solutionsStorage[$k - $nominals[$i]]; Вот тут я не понимаю, почему у нас решение для большей суммы требует столько же купюр, сколько и для меньшей. Почему не прибавляется единичка?
перемнную $tic правильнее очищать не в начале программы, а в начале цикла для суммы $k. Тогда это можно будет делать 1 раз и будет нагляднее видно, что она используется только внутри итерации цикла.
Я так понимаю, ты там определяешь лучший вариант и прбавляешь единицу позже. Но не лучше ли сразу прибавлять эту единицу, чтобы не возникало вопросов? А то у тебя какое-то время в $solutionsStorage хранится неверное значение. В случае с массивом $check, можно новую комбинацию тоже сразу считать и записывать в $check.
Вместо 9999 наверно лучше использовать константу INF - бесконечность. С ней нельзя делать математические операции (получится та же бесконечность), но можно делать сравнения.
Почему в алгоритме определения $bestNominal ты считаешь лучшей именно купюру с макс. номиналом?
В общем я вижу, что ты разобрался в алгоритме, но важно еще донести информацию читателю твоего кода, а с этим пока не очень.
> Мне нужны были в цикле не только значения номиналов(100, 200, 500), но и их ключи для более простой записи(они используются в цикле где инициализирована переменная $i), но если возможно использовать один массив, при этом не сильно усложняя запись кода - так и сделаю.
Можно сделать переменную с начальным запасом купюр, ее скопировать в $check и по ней определить номиналы, отсортировав их.
> у каждой суммы, которую можно выдать - свой запас банкнот, который хранится в $check[n], где n - сумма, которую нужно выдать. При этом используются только те элементы массива $check, при котором возможно выдать сумму n используемыми номиналами, если сумму выдать невозможно, в элементе массива $check[n] будет NULL. Это надо написать в комментарии к массиву и переименовать его.
Старые ответыАноним01/11/16 Втр 14:10:18#947№867753
> Да, в задаче сказано сколько человек в классе и сколько слогов в считалочке, но ничего не сказано о том, сколько человек должно в итоге остаться пить чай. Как только их останется столько же, сколько слогов в считалочке, подсчет заканчивается и они идут пить чай.
Сериализация нужна, если ты хочешь сохранить в файл например массив. Файл это ведь строка по сути и чтобы записать туда массив, надо его как-то обратимо преобразовать в строку, для этого служит сериализация.
Это был комментарий про загрузку пользователяи файлов, а не про кеш. В кеше можно использовать md5, но мне не нравится что по хешу нельзя понять исходный ключ, это неудобно.
sup аноны. я тот анон, что просил у вас помощи по фильтрам. В общем я уже подошел к концу своего тз и опять прочитав задания понял, что нихуя не понял что от меня хотят собственно вот:
Создать два базовых класса описывающих сотрудника с почасовой оплатой, второй, описывающий сотрудника с месячной ставкой. Вычисление оплаты труда для сотрудников с почасовой оплатой будет иметь следующую формулу: количество часов * сумму за один час. Для сотрудников со ставкой метод расчета возвращает месячную ставку. Реализовать следующую функциональность:
ну собственно дальше функциональность всю запилил, что они хотели. Я не глупый, шарю в опп, но хоть убей не пойму что они от меня хотят. как именно описать сотрудника?, типа при выводе всех сотрудников определять тип сотрудника и переводить его в нужный объект, который просто пересчитает его зп и закинет все параметры в свойства. По типу метода фабрики. В общем кто из более опытных анонов понял в чем дела, прошу объяснить.
Это не чат! Высказывайтесь одним большим постом, а не цепочкой мелких
Это тред для начинающих. Не написал за свою жизнь ни одной программы и имеешь тройку по математике? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут:
Двач лежит? Есть запасной тред: http://dobrochan.org/s/res/23225.xhtml#i46467
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост, прежде чем писать код).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.
Надо переходить к более серьезным задачкам, которые научат тебя всему этому.
- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 2/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md
Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Платиновые вопросы
- Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Посоветуйте редактор кода - Sublime Text 3, Notepad++, PhpStorm
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
- Что самое главное для программиста? Умение аккуратно оформлять код.
- ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
- Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.