Это копия, сохраненная 21 марта 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>649329 (OP) (больше 1000 постов!)
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в 2-3 дня, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
- Для начала установи Апач + PHP (советы ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Yii2: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование
- Если ты все решил, переходи к Symfony 2/Doctrine 2
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863
Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Не придирайся к знанию английского языка.
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Не придирайся к знанию английского языка.
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Я помню, у анона было сложности с синусами и косинусами - надо все же с ними разобраться.
По поводу https://github.com/foobar1643/student-list - ты еще переделваешь код или все уже исправил?
Всё, разобрался. Спасибо
Благодарю за ответ.
>А почему ты один репозиторий используешь для 2 проектов?
Думал, что так будет удобнее. Ошибался. Пока оставлю как есть.
> используй абсолютные (идущие от корня диска), например с использованием константы __DIR__
Типа такого: require_once(__DIR__ . '../src/init.php') ?
> По моему тут может быть ситуация когда переменная не определена. Как можно писать надежный код если неизвестно существует переменная или нет?
Поясни, пожалуйста. isset($_GET['registered']) недостаточно?
> А почему так много статических методов?
У меня в хелперах нет полей, так что не увидел резона делать нестатические методы. В UrlHelper есть смысл параметры ($sort, $dir и прочее) сделать членами класса и передавать в конструктор? Видимо да, т.к. это улучшит читаемость кода вьюхи А в TokenHelper - $token?
> Однако тогда надо обеспечить инкапусуляцию, то есть чтобы никто другой напрямую к этой куке не обращался.
Не очень понял, как это можно сделать.
Что-то типа такого:
$myCookie = $_COOKIE;
unset($_COOKIE);
// используем функции хелперов, которые работают с $myCookie
$_COOKIE = $myCookie;
>> public static function fromRow($row)
> Маппингом студента на строчку базы данных должен заниматься класс для работы с базой данных.
Но это же по сути конструктор. В языке с перегрузкой методов, я бы их и использовал, а тут приходится так извращаться.
>> $characters[rand(0, $charactersLength - 1)];
> Квадратные скобки не будут работать если мы добавим нелатинские символы, например кириллицу.
Я понимаю, но зачем нам здесь поддержка кириллицы?
Благодарю за ответ.
>А почему ты один репозиторий используешь для 2 проектов?
Думал, что так будет удобнее. Ошибался. Пока оставлю как есть.
> используй абсолютные (идущие от корня диска), например с использованием константы __DIR__
Типа такого: require_once(__DIR__ . '../src/init.php') ?
> По моему тут может быть ситуация когда переменная не определена. Как можно писать надежный код если неизвестно существует переменная или нет?
Поясни, пожалуйста. isset($_GET['registered']) недостаточно?
> А почему так много статических методов?
У меня в хелперах нет полей, так что не увидел резона делать нестатические методы. В UrlHelper есть смысл параметры ($sort, $dir и прочее) сделать членами класса и передавать в конструктор? Видимо да, т.к. это улучшит читаемость кода вьюхи А в TokenHelper - $token?
> Однако тогда надо обеспечить инкапусуляцию, то есть чтобы никто другой напрямую к этой куке не обращался.
Не очень понял, как это можно сделать.
Что-то типа такого:
$myCookie = $_COOKIE;
unset($_COOKIE);
// используем функции хелперов, которые работают с $myCookie
$_COOKIE = $myCookie;
>> public static function fromRow($row)
> Маппингом студента на строчку базы данных должен заниматься класс для работы с базой данных.
Но это же по сути конструктор. В языке с перегрузкой методов, я бы их и использовал, а тут приходится так извращаться.
>> $characters[rand(0, $charactersLength - 1)];
> Квадратные скобки не будут работать если мы добавим нелатинские символы, например кириллицу.
Я понимаю, но зачем нам здесь поддержка кириллицы?
>$myCookie = $_COOKIE;
>unset($_COOKIE);
>// используем функции хелперов, которые работают с $myCookie
>$_COOKIE = $myCookie;
Что-то я фигню написал.
Желательно учитывать требования стандарта:
>If comparefn is not undefined, it should be a function that accepts two arguments x and y and returns a negative value if x < y, zero if x = y, or a positive value if x > y.
http://www.ecma-international.org/ecma-262/6.0/index.html#sec-array.prototype.sort
https://ideone.com/ccwxQH
https://ideone.com/ZuRDo8
https://ideone.com/7g3WwD
h1 {font-size:2em;} // получится 20рх
h2 {font-size:1.6em;} // 16рх и т. д.
Правда геморрой в том что размер шрифта наследуется и на третьем-четвертом уровне вложенности будет далеко не так наглядно все вычислять, но там можно и rem применить.
А вот как быть с размерами блоков, отступов, паддингов? Смутно себе представляю как вычислить размер паддинга в процентах или ем.
Сейчас буквально везде вижу в тестовых заданиях mobile-first или 'все должно быть адаптивно'.
Исходя из логики. Если ты делаешь элемент, высота которого зависит от размера шрифта - используй em, если от пикселей - то пиксели.
Ну к примеру, возьмем такой элемент как "текст написанный уменьшенным/увеличенным шрифтом". Очвеидно что тут размер должен быть в процентах от родителя, чтобы маленький текст в заголовке и маленький текст в абзаце имели разный размер.
Паддинг на кнопке может зависеть от шрифта на ней.
"все в em" это какой-то нездоровый фанатизм. Еще нездоровее - идея указывать размеры в процентах от ширины окна, так, что функция увеличения и уменьшения масштаба перестает работать.
Много лет назад процентные размеры шрифта имели смысл, так как в ИЕ6 при увеличении масштаба менялся размер шрифта на body или html, и если размер бы указывался в пикселях, то текст не увеличивался. Но это было очень давно, у современных браузеров такой проблемы нет (но верстальщики придумали верстать в процентах от размера окна и функция масштабирования снова сломалась).
Ну и помни что везде где можно обойтись вообще без указания размеров и без дублирования цифр в css. Например если надо сделать блок на 20 px уже родителя, это можно сделать маргином, а не вычитая из ширины родителя 20.
> можно и rem применить.
Я плохо представляю когда нужен rem . Наверно для страниц где можно менять размер шрифта программно? Все равно не очень понимаю.
> Сейчас буквально везде вижу в тестовых заданиях mobile-first или 'все должно быть адаптивно'.
Это тут вообще не при чем.
http://bootstrap-3.ru/customize.php
, пробовал уже разные комбинации, и другие слова-цифры, и без кавычек в пхп.ини . В общем тест выдает что всё ок (пикрелейтед), но входящих коннектов в phpstorm нету и соответственно на брейкпоинтах не происходят остановки
Ты php скрипт в браузере или консоли запускаешь? В обоих случаях надо передать параметр который включит отладку.
Так же не забудь в php.ini включить отладку. И перезапустить Апач.
> что в пхп ини то же самое
А ты тот файл который нужно редактируешь? Настройки видны в phpinfo() ?
Тот, до этого я менял другие настройки (порта сменил с 9000 на 9005 так как ругалось на то, что он занят в Шторме) после этого ошибка с занятым портом пропала и появилось ожидание коннекта с ключом
>>665213
Как побороть проблему чтобы шторм увидел входящий коннект от дебагера.
>Ты php скрипт в браузере или консоли запускаешь? В обоих случаях надо передать параметр который включит отладку.
Ставлю брейкпоинты в скрипте, перезапускаю страницу в браузере
Страницу нужно открывать из Шторма. Он дабавит GET параметр в адресс, что бы дебагер видел что пора конектится.
Спасибо, ОП, большое за комментарии по кошкам-мышкам. Очень дельные замечания, сейчас сижу правлю код свой.
>Явное нарущение инкапсуляции. Животные не должны ковыряться во внутренностях Поля, а должны просить его переместить их значок. Ну или, что еще лучше, можно вообще убрать там массив с картой и тогда это не требуется.
Согласен, теоретически можно было сделать вообще без визуального массива, но, когда начинал делать задачу, это казалось наиболее логичным. Надо перекраивать будет тогда решение.
Вообще, я уже студентов тихонько подбиваю с разных сторон, сейчас про PDO читаю. Думаю за них взяться на днях, кошки-мышки и антикризисные меры сообразно твоим комментариям исправлю, но навряд ли стану загружать снова(ошибки понял, лишний раз мучить тебя смысла мало), если только вопросы появятся новые. Теперь уже студентов жди, опушка!
Эммм, если у меня цмска и мне нужно отследить определенный скрипт на определенной странице каким образом мне запустить из IDE'шки определенную страницу. Нет, я точно видел в нетбинсе работу дебаггера в таком виде: установка брейкпоинтов по скрипту, отдельный запуск браузера, в браузере открывается нужная страница - срабатывают брейкпоинты и в самом нетбинсе отображается отладочная инфа. Если запускать скрипт в браузер из иде'шки это пиздец
>>664772
> endswitch;
>Это для шаблонов, тут используй фигурные скобки
Поясни за это, ты намекаешь, что лучше использовать обычный синтаксис, ок, понял, но о каких шаблонах говоришь и почему?
> $move1 = new Movement($this->y, $this->x);
> $move2 = new Movement($this->y + 1, $this->x);
...
> $move6 = new Movement($this->y + 1, $this->
>Копипаста, убирай
много ломал голову, как от копипасты-перечисления ходов избавиться ещё когда решал задачу, но не придумал. Подкинь совет?
Расширение для браузера.
The easiest Xdebug для Firefox например. Но опять же, все должно быть нормально настроено.
Запустил в браузере через Закладки полученные на сайте шторме (/marklets) страница перезагрузилась, в шторме всё равно висит та же надпись что нет входящих подключений с таким то ключом
Ну вот xdebug на гостевой убунте сконфигурированный. Можно запускать дебаг из броузера (расширение ставит куку), можно из IDE (добавляется переменная в GET). Х.з. чем тебе еще помочь.
Верно ли я понял что мне в $random мне нужно использовать mt_rand (1,6) ?
И ещё я немного не вьехал как достать вариант с выпавшим числом из массива.
Пытался зделать так http://codepad.org/taLdglSx но получил fatal error: Function name must be a string
Хотя у тебя там ключи руками прописаны, так что все нормально. Мой косяк, не глянул.
>192.168.56.1 - это на отдельном сервере или на локалхосте? мне на localhost ругалось, поставил просто http://fashion и вроде тест прошел норм
Это хост. ВиртуалБокс создает виртуальный сетевой интерфейс. Виндовс в нем 192.168.56.1. Убунта с виртуалки коннектится к 192.168.56.1.
>>665311
Убери ' ' вокруг $random
php парсит то, что внутри " " и не парсит то что внутри ' '.
$answers["$random"] и $answers[$random] сработает. А $aswers['$random'] нет.
В первых двух случаях он поставит значение переменной и будет искать собственно это значение. В третьем будет искать в массиве ключ строку '$random'.
Думаю годная штука, которая подойдет новичкам и любителям видны для запуска своих приложений без ебли и без денверов
http://codepad.org/pKoJDIJP
Нет, там в echo должно быть:
> слово1 слово2 слово3
> слово1 слово2 слово3
> Я слово4 слово5
А не так, как у тебя.
Чтобы добиться верного решения, можно пропустить всё через цикл.
Первые два раза выводится строка "слово1 слово2 слово3", а во время третьего прохождения цикла выводится строка "Я слово4 слово5" и цикл обрывается.
>Я хз почему random лишь один раз рандомит и остаётся таким навсегда, по этому пришлось пустить рандом второй раз.
Потому что один раз становится переменная определённой, а потом ты её выводишь в эхо.
Чтобы этого не было, надо изменять переменную перед каждым выводом, как я выше написал про цикл.
у меня так и идёт
word1 2 3
1 2 3
я 4 5.
я делал циклы и рандом все равно оставался одним и тем же.
У тебя идёт:
echo "$randomText1 $randomText2 $randomText3\n";
echo "$randomText4 $randomText5 $randomText6\n";
echo "Я $randomText7 $randomText8.\n";
А желательно всё-таки вот так:
echo "$randomText1 $randomText2 $randomText3\n";
echo "$randomText1 $randomText2 $randomText3\n";
echo "Я $randomText4 $randomText5.\n";
Но так-то задача на строки, вывод их из массивов, так что вполне можно и твоё решение посчитать правильным. Но ты подожди ОПа, что он тебе скажет.
А, хотя, нет: он как раз скажет что-нибудь про копипасту, там же её у тебя много.
он скажет все переделывай. ведь нельзя было делать такие штуки
1 => 'блабла',
А я не додумал как по другому отдельные слова вытаскивать. Могу через count пронумеровать и зарандомить число, но мне слово же нужно. хотя, если как нибудь word1[....].
Цикл жи есть.
Я объяснил же в первом сообщении этот момент.
Цикл с $i, делает три круга. В первом и втором круге изменяются randomText1 $randomText2 $randomText3 и выводится echo "$randomText1 $randomText2 $randomText3\n";. А в третьем круге выводится echo "Я $randomText4 $randomText5.\n"; (а изменяться они могли и раньше, допустим).
Алсо, вопрос по бутстрапу. Разбираюсь с макетами, почему вместо результата выше, у меня получается то, что ниже. Колонки длиннее чем должны, не вкладываются друг в друга и переносятся на новую строку.
Посоны, как собрать кусочки воедино? Никак не могу вдуплить.
Где лучше хранить тексты постов? Нормально хранить в базе данных, или можно хранить в текстовых файлах?
Что будет, когда к текстовому файлу будут обращаться несколько посетителей одновременно?
В вузе рассказывали, что когда несколько пользователей обращаются к базе данных, то всё будет в порядке.
Ты порт и в IDE и в php поменял? В phpinfo этот порт виден? С настройками явно что-то не то, кем может быть занят этот порт? Запости конфиг относящийся к xdebug из phpifno(), а также настройки ИДЕ (если там есть что-то кроме того что выше на скриншоте).
И посмотри эту страницу, https://xdebug.org/docs/remote
Моя цель - написать простенький сайт за 3 месяца. Верстка, связь с БД, etc.
Тебе нужно следовать пути в ОП-посте описанном. При должном усердии извояешь свой файлообменник ты.
Там еще могут быть замечания ведь. Лучше бы с ООП на этих задачах разобраться. А студентов можешь делать параллельно, я все равно вряд ли сразу проверить смогу.
>>665246
Там надо либо GET параметр приписывать либо куку ставить. Расширения к браузеру делают именно это. Почитай документацию по xdebug чтобы понимать как это работает.
>>665248
> ок, понял, но о каких шаблонах говоришь и почему?
http://www.phpinfo.su/articles/practice/shablony_v_php.html
> как от копипасты-перечисления ходов избавиться
циклами
>>665291
Лучше показывать настройки из phpinfo(), чтобы он вывел текущие. Вот почему у тебя стоит порт 9000 если ты в IDE его поменял?
>Вот почему у тебя стоит порт 9000 если ты в IDE его поменял?
Что куда поменял? Я не анон с проблемой. У меня все работает.
Да.
> Думаю годная штука
Почему ты так думаешь? какие ты видишь преимущества и недостатки?
Вот что я вижу:
- образ виртуальной машины тяжелее чем Апач с PHP, ему надо больше диска, ОЗУ, процессора
- там могут быть чужие настройки. Например вместо легкого дебиан какая-нибудь тормозная убунта с кучей сервисов. Вместо нормального редактора какой-нибудь вим. А у меня например есть виртуальная машина где все привычно
- там может быть высокое потребление памяти По идее для PHP хватило бы 192 Мб, но там в образе куча сервисов и вряд ли он в эту цифру уложится. Ну и в любом случае напрямую PHP будет работать быстрее чем с виртуализацией
- для вагранта надо ставить руби в систему. Где гарантия что он не попрописвает себя всюду и не будет с чем-нибудь конфликтовать? Да и тащить огромный интерпретатор как-то нелогично по моему.
- без виртуалки PHP напрямую читает файлы с диска. В случае виртуалки приходится испоьзовать какие-нибудь общие папки которые работают медленнее
- куча лишего хлама: зачем мне редис, постгрес и какой-то непонятный beanstalkd. что это вообще такое?
- странные перенаправления портов - это зачем? Почему нельзя 80 использовать например?
- как я понимаю образ там read-only, и установить новый пакет через apt-get install не выйдет?
А посмотрим, как подают авторы этот образ? Легко развернуть? Ну не знаю, с одной стороны можно поставить апач + php + mysql и настроить их, а с другой ставить виртуалбокс, руби, вагрант, образ, и настраивать все в нем. Не сказал бы что это легче.
Ну и если нужен линукс, лучше установить в виртуалку дебиан. Хоть устанавливать дебиан научишься.
Ну то есть у использования вагранта наверно где-то есть преимущества. Хотелось бы про них услышать, а пока у тебя только личное мнение что это "годная штука".
Ну и начинающим вредны сборки. Хоть раз в жизни Апач или дебиан стоит установить самостоятельно.
>и установить новый пакет через apt-get install не выйдет?
Как раз таки выйдет. Вообще, как по мне, ключевое удобство Vagrant'а - это песочница (можно откатываться, юзая снапшоты в virtualbox) + последующий беспроблемный деплой на VPS. Зачем это новичку - вообще без понятия. Я не поддерживаю >>665335-анона. Homestad - так вообще уже готовый box с полностью настроенным под работу линуксом. Это плохо для новичков - слишком высокий уровень абстракции; возникнет незначительная легко устраняемая проблема, а новичёк с ней не справится по причине отсутствия элементарных знаний в более низкоуровневых вещах.
Я пропустил слово и мне лень было педалить backspace. А дальше уже стилистические требования.
Я все замечания исправил, просто там еще несколько багов с отображением поисковых результатов нашел и исправил, из-за этого имя коммита такое странное получилось.
Ну 9015 тоже свободен был, разве сыграет такую большую роль?
Попробуй сделать какую-нибудь задачу из ОП-поста с использованием Yii. Тех же студентов или файлообменник.
Курсы на ютабе посмотри, так проще вкатишься.
С ООП знаком, такие слова, как абстрактный класс или интерфейс не вызывают у меня страха. Но я открываю директорию yii и охуеваю о того, сколько всяких методов, что пока для меня остаются загадкой.
Все херня. Учи классические алгоритмы. А всякую лабуду типа обсерверов, абстрактных строителей и мостов нагонишь по мере надобности, когда к этому придешь.
Может кто рассказать как правильно юзать printf?
Есть кусок кода >
https://ideone.com/w0LcUw
При попытки вывести его с помощью этого >
https://ideone.com/b7UIkt
Получаю ошибку yntax error, unexpected T_STRING.
Так вот..Как правильно пихать html код в printf что бы все работало?
>> if (FormHelper::isFormSent()) {
>> else if ($_SERVER['REQUEST_METHOD'] == "GET") {
>А что если ни одно из условий не сработает?
Отдастся пустая страница с кодом 200. Это плохо?
>Как правильно пихать html код в printf
Никак. Если очень хочется, то нужно разобраться с кавычками Лучше делать как написано здесь http://www.phpinfo.su/articles/practice/shablony_v_php.html
Уже разобрался , но , спасибо
Если я не отвечаю, то это не значит, что я не читаю твои подробные ответы и разборы или не стараюсь исправиться.
Просто чаще всего нечем ответить, настолько всё разобрано.
Аноним
То, что, что легко:
W1. https://ideone.com/r93YE8
W2. https://ideone.com/8BIRn7
W3. https://ideone.com/yqbFo1
W4.1 https://ideone.com/Yikc7R
W4.2 https://ideone.com/gipbSX
Надо было напрячь мозг:
W5.1 https://ideone.com/MwfLmz
W5.2 https://ideone.com/cVgjxu
W5.3 https://ideone.com/iFv71d
W5.4 https://ideone.com/jMJLFM
W5.5 https://ideone.com/kVp3j3
W5.6 https://ideone.com/QcFU0m
W5.7 https://ideone.com/Eh48abC
Лёгкие вроде бы все правильно решены.
Задача W5.1 решена неверно, там должно быть 61270 с копейками. Это непростая задача, многие на ней подолгу сидят.
Задача W5.2 решена неверно, там должно получиться 1060 тысяч в последний год и он должен быть 50-ым по счёту. Если я не путаю сейчас.
W5.6 решена неверно, там у тебя функция mt_rand(1, count($letters)) выдаёт слоги из массива с 1 по 16, тогда как должна выдавать слоги с 0 по 15. Автоматически нумерация в массиве идёт с 0, а count($letters) считает, начиная с 1. В итоге у тебя нулевой слог никогда не появится и будет ошибка, когда выпадет 16-ый слог.
W5.7 - там ничего нет.
>>666035
В возрасте тридцати одного года.
>>666038
Ab-w.net, с него начинал учить HTML, CSS, там же учился устанавливать Wordpress.
$creditSum - $payout < 0 преобразуем в $creditSum < $payout. Убирается лишнее действие.
$creditSum <= 0 должно быть == 0. Если у тебя возникает ситуация, что баланс кредита меньше нуля, значит алгоритм работает неверно и Ванька переплачивает банку.
Так вроде все отлично.
Да. Думаю надо сделать так:
- либо метод = POST и мы принимаем данные формы
- во всех остальных случаях выдаем страницу для GET
Я как минимум HEAD могу вспомнить который ведет себя как GET но прибивает скрипт при попытке выдать текст.
>>666043
Да, там странная строка:
> if ($sum > 1000000) {
> $y++;
Зачем дополнительно плюсовать? Также, $y лучше назвать нормально и поставить вместо $i в шапку цикла.
Ну это выбор анона можно сказать. Хотя практически все видеокурсы длинное нудное скакание по верхам. Иначе они просто не будут продаваться.
Не забывай и про то, что без написания кода ничего не выйдет. Тут толковый учебник (вроде ОПовского) намного больше тебе даст, чем простое смотрение на то, как кто-то разбирает или пишет код.
Это само собой разумеется. Была бы на работе пека, на которой можно кот пейсать, этим бы и занимался. А так рабочая машина сейчас в ФЗС за ДМЗ и пиздец. Разве что браузер есть, но я не хочу жабаскрипт.
А также есть "облачные" IDE вроде https://www.google.ru/search?q=cloud+php+ide&newwindow=1&gbv=1&sei=bP_OVtCsGMScsgHfjIzoAw
Инета нет, в том и дело. Есть вайфай и планшет, но я заебусь же там набирать кот.
Иди в перезвоним тред или куда-нибудь в /b/. Тут задачи решают.
Понятно. Ну тогда не пиши код. Занимайся чем-нибудь другим.
Настойчивость. Усидчивость.
В последнее время с какого-то хуя стало популярным слово "мотивация".
- Мне чтобы учиться/работать/дрочить хуй нужна мотивация, - пиздят на каждом шагу. Какого хуя вообще? Вы хоть знаете, что такое мотивация? Что под постоянной мотивацией ваши межушные нервные узлы свернулись бы в трубочку?
Если за тобой в лесу бежит медведь, а ты убегаешь, вращая глазами и бросаясь в него собственным говном - вот это мотивация. Если вычислили по IP, где ты живешь, и идут ебать твою мамку, а ты, пытаясь предотвратить неизбежное, превращаешь свой подъезд в храм тиpeча и смазываешь входную дверь свиным эякулянтом - это твоя ёбаная мотивация. Она есть, а через минуту медведь сгорел в машине, мамку выебали, и её больше нет. И что дальше будешь делать? Мотивация, блядь. На этом говне далеко не уедешь. Все делается при помощи упорства и настойчивости, которые должны стать качествами твоей личности, анон, а не при помощи мотивации.
Купи клавиатуру к планшету.
Я поначалу просто так набирал код на Идеоне в планшете.
Если есть возможность и желание - купи недорогой нетбук, установи на него Апач и РНР, так пиши.
Сервер даже и на планшет можно установить, ОП как-то приводил пример, какие-то приложения для Андроида.
Годная мысль. Наверное, так и сделаю.
Ушел учить.
Неа, страх и мотивация - это разные вещи. Это как кнут и пряник. Просто разумный человек понимает, что программирование, как и любая другая работа - это просто инструмент. А какая цель? Как правило, у нормального человека цель - хорошо провести время. Программирование иногда помогает в этом, но чаще всё-таки нет. Это зависит от индивидуальных предпочтений, и от того, сколько человеку надо денег. Я бы сказал, мотивация - это связь между чем-то неосвоенным и целью, без которой непонятно, нафига оно тебе надо.
как понимать эти вещи? Сильно будет мешать в будущем незнание? В общем, я в ступоре
Абсолютное значение это просто положительное число, что тут можно не понимать?
Абсолютное значение - это модуль числа.
Представляй модуль числа как расстояние от нуля до числа на числовой прямой. У расстояния знака нет, так что это просто положительное число.
Модуль 5 равен 5. Модуль -5 равен 5.
> |5| = 5
> |-5| = 5
> abs(5) == 5
> abs(-5) == 5
Как-то так.
>Сильно будет мешать в будущем незнание
На уровне 9 классов математику знать весьма желательно, т.к. это будет мешать не только в PHP.
>Будет ли это плюсом, если при устройстве на работу
Песенником-балалаечником на средневековую ярмарку, если только
Тамадой еще можно
>Будет ли это плюсом, если при устройстве на работу
Плюсом при устройстве на работу будет если сможешь перевернуть бинарное дерево, или написать квиксорт.
Вполне годная задумка.
Любой хороший собственный проект на Гитхабе или на своём домене будет характеризовать твои способности только положительно.
Ты хочешь написать генератор рифм или генератор стихов?
Что?
Приветствую. Задачка лишь косвенно связана с PHP. Но тем не менее.
Есть объект(помещение) с двумя свойствами: мин. площадь(building_area_min) и макс. площадь(building_area_max)
Пользователь вводит начальную($s_from) и конечную площадь($s_to)
Формируется запрос на вывод помещений по этим двум полям.
Общий запрос:
$args['meta_query'][] = array(
'relation' => 'OR',
array(
'key' => 'building_area_min',
'value' => array($s_from, $s_to ),
'type' => 'NUMERIC',
'compare'=> 'BETWEEN'
),
array(
'key' => 'building_area_max',
'value' => array($s_from, $s_to ),
'type' => 'NUMERIC',
'compare'=> 'BETWEEN'
),
array(
'relation' => 'AND',
array(
'key' => 'building_area_min',
'value' => $s_from,
'type' => 'NUMERIC',
'compare'=> '<='
),
array(
'key' => 'building_area_max',
'value' => $s_to,
'type' => 'NUMERIC',
'compare'=> '>='
)
)
);
Допустим пользователь вводит ($s_from=20) и конечную площадь($s_to=100)
Должны отображаться
1) помещение от 22 до 80
срабатывает
array(
'key' => 'building_area_min',
'value' => array($s_from, $s_to ),
'type' => 'NUMERIC',
'compare'=> 'BETWEEN'
),
2) помещение от 50 до 120
срабатывает
array(
'key' => 'building_area_max',
'value' => array($s_from, $s_to ),
'type' => 'NUMERIC',
'compare'=> 'BETWEEN'
),
3) помещение от 5 до 120
срабатывает
array(
'relation' => 'AND',
array(
'key' => 'building_area_min',
'value' => $s_from,
'type' => 'NUMERIC',
'compare'=> '<='
),
array(
'key' => 'building_area_max',
'value' => $s_to,
'type' => 'NUMERIC',
'compare'=> '>='
)
)
Все работает как надо, но последний вложенный запрос создает дикие тормоза.
Может есть какой-то другой способ сделать выборку пересекающихся массивов ? В sql не особо понимаю.
Приветствую. Задачка лишь косвенно связана с PHP. Но тем не менее.
Есть объект(помещение) с двумя свойствами: мин. площадь(building_area_min) и макс. площадь(building_area_max)
Пользователь вводит начальную($s_from) и конечную площадь($s_to)
Формируется запрос на вывод помещений по этим двум полям.
Общий запрос:
$args['meta_query'][] = array(
'relation' => 'OR',
array(
'key' => 'building_area_min',
'value' => array($s_from, $s_to ),
'type' => 'NUMERIC',
'compare'=> 'BETWEEN'
),
array(
'key' => 'building_area_max',
'value' => array($s_from, $s_to ),
'type' => 'NUMERIC',
'compare'=> 'BETWEEN'
),
array(
'relation' => 'AND',
array(
'key' => 'building_area_min',
'value' => $s_from,
'type' => 'NUMERIC',
'compare'=> '<='
),
array(
'key' => 'building_area_max',
'value' => $s_to,
'type' => 'NUMERIC',
'compare'=> '>='
)
)
);
Допустим пользователь вводит ($s_from=20) и конечную площадь($s_to=100)
Должны отображаться
1) помещение от 22 до 80
срабатывает
array(
'key' => 'building_area_min',
'value' => array($s_from, $s_to ),
'type' => 'NUMERIC',
'compare'=> 'BETWEEN'
),
2) помещение от 50 до 120
срабатывает
array(
'key' => 'building_area_max',
'value' => array($s_from, $s_to ),
'type' => 'NUMERIC',
'compare'=> 'BETWEEN'
),
3) помещение от 5 до 120
срабатывает
array(
'relation' => 'AND',
array(
'key' => 'building_area_min',
'value' => $s_from,
'type' => 'NUMERIC',
'compare'=> '<='
),
array(
'key' => 'building_area_max',
'value' => $s_to,
'type' => 'NUMERIC',
'compare'=> '>='
)
)
Все работает как надо, но последний вложенный запрос создает дикие тормоза.
Может есть какой-то другой способ сделать выборку пересекающихся массивов ? В sql не особо понимаю.
Со вторым случаем ошибся, сработает тоже первое условие. Для второго случая найдется помещение допустим от 20 до 50
Спасибо за идею, сегодня поставил на виртуалку убунту сервер, настроил, установил xdebug, настроил phpstorm и всё заработало, проблемы были только с айпишниками но в итоге спустя 5 часов ебли всё заработало, я счастлив!
1. мы объявляем переменную класса protected $x;
2. мы делаем два метода, если хотим работать с этим $x из других классов - сеттер и геттер. Геттер - просто даёт переменную, сеттер даёт возможность установить новую.
Как же мы защитили её в таком случае? Ведь сеттер-геттер это же полный контроль над переменной, не?
Ты можешь в геттере и сеттере производить любую валидацию.
Кстати, для твоей ситуации достаточно private.
Например
private $age;
private $no_u_cant;
public function get_age() {
if (!$this->no_u_cant)
return $age;
}
public function set_age($age) {
if ($age >= 18 && $age <= 99 && !$this->no_u_cant)
$this->age = $age;
}
Представь ситуацию что тебе в большом приложении дали задачу сделать какую-нибудь верификацию объекта которы используется по всему приложению. Ты будешь открывать кучу файлов и по пол часа разбираться как именно и где именно используется твой объект. При инкапсуляции верификацию можно сделать в сеттере, отредактировав при этом один файл.
И не только ифы.
Можно еще переопределить __set() и __get() и возвращать значения в ответ на любой рандомный член класса, которого у тебя даже нет, допустим.
Самый простой пример.
class GetSet {
private $storage = array();
public function __get($index) {
if (array_key_exists($index, $this->storage))
return $this->storage[$index];
else
return false;
}
public function __set($index, $value) {
$this->storage[$index] = $value;
}
}
$obj = new GetSet();
$obj->lalka = 'dicks';
echo $obj->lalka; // dicks
И не только ифы.
Можно еще переопределить __set() и __get() и возвращать значения в ответ на любой рандомный член класса, которого у тебя даже нет, допустим.
Самый простой пример.
class GetSet {
private $storage = array();
public function __get($index) {
if (array_key_exists($index, $this->storage))
return $this->storage[$index];
else
return false;
}
public function __set($index, $value) {
$this->storage[$index] = $value;
}
}
$obj = new GetSet();
$obj->lalka = 'dicks';
echo $obj->lalka; // dicks
Описал объект, определил геттер и сеттер для всего объекта.
Это значит, что любое обращение к непубличному свойству объекта (даже если оного не существует) улетит в функцию __set(), где мы уже решаем, что делать.
В примере мы складываем всё в массив $storage и вынимаем оттуда же.
Пример синтетический, поэтому пусть так, например:
class NewsItem {
private $newsTitle;
private $newsRawText;
public function __construct($newsTitle, $newsRawText) {
$this->newsTitle = $newsTitle;
$this->newsRawText = $newsRawText;
}
public function __get($property) {
switch ($property) {
case 'title':
return $this->newsTitle;
break;
case 'text':
return strip_tags($this->newsRawText);
break;
}
}
}
$someNews = new NewsItem('Битард повесился в прямом эфире', '<b>На месте дежурит бригада <i>траллей</i> из /b/</b>');
echo $someNews->text; // На месте дежурит бригада траллей из /b/ (тегов нет)
Описал объект, определил геттер и сеттер для всего объекта.
Это значит, что любое обращение к непубличному свойству объекта (даже если оного не существует) улетит в функцию __set(), где мы уже решаем, что делать.
В примере мы складываем всё в массив $storage и вынимаем оттуда же.
Пример синтетический, поэтому пусть так, например:
class NewsItem {
private $newsTitle;
private $newsRawText;
public function __construct($newsTitle, $newsRawText) {
$this->newsTitle = $newsTitle;
$this->newsRawText = $newsRawText;
}
public function __get($property) {
switch ($property) {
case 'title':
return $this->newsTitle;
break;
case 'text':
return strip_tags($this->newsRawText);
break;
}
}
}
$someNews = new NewsItem('Битард повесился в прямом эфире', '<b>На месте дежурит бригада <i>траллей</i> из /b/</b>');
echo $someNews->text; // На месте дежурит бригада траллей из /b/ (тегов нет)
Я вообще не занимаюсь этой вашей пыхой, но хочу сказать следующее для ньюфагов - пыха нужна всегда и везде,так что не ссыте вкатываться.
мимо-ява-адепт
>$someNews = new NewsItem('Битард повесился в прямом эфире', '<b>На месте дежурит бригада <i>траллей</i> из /b/</b>');
>echo $someNews->text; // На месте дежурит бригада траллей из /b/ (тегов нет)
>$obj->lalka = 'dicks';
>echo $obj->lalka; // dicks
но ведь эти выражения в любом случае, не зависимо от всего твоего кода, будут выводиться так, как показано. Я чего-то упускаю?
насчёт echo $someNews->text проебался, да, но пример с диком - он всегда и будет диком же, и без __set() с __get(0
Как будто ява не везде нужна. 80% энтерпрайза на ней написано. Хотя порог вхождения там выше конечно.
Суть не в выводе текста или его метаморфозах.
У тебя внутри объекта есть некоторые данные внутри приватных свойств. Этих данных целиком и полностью хватает для описания объекта.
Но там, снаружи, тебе не нужны эти данные в сыром виде. Они тебе нужны, возможно, как-то переработанными, и под другими именами.
>>666688
Слушай, ну серьезно. Тебе для начала надо выучить синтаксис языка.
Это да, порог действительно выше.
По работе приходится часто общаться с пыхокодерами, и уяснил что готовы брать ребят даже без знания фреймворков.
Простите, я не знаю как отклеить сажу. Ёбаная вакаба
кажется, я начал понимать твой пример, спасибо.
>>666696
>Простите, я не знаю как отклеить сажу.
и ещё погромист называется
Если сажа решила подружиться с постом - разве я должен им мешать?
База у любых программистов должна быть, я считаю. Это первым делом оценки сложности алгоритмов, линейная алгебра, основы анализа и т.д.
У многих начинающих просто отсутствуют эти базовые знания, хотя они умеют формочки на симфони делать.
...
Тебя на работу ни один уважающий себя работодатель не возьмет. Пока не выучишь математику хотя бы до уровня первого курса ВУЗа будешь работать в шарагах за 15к\мес.
Да беда в том, что я это уже осознаю, лол.
У меня вообще больно тугой ум, очень трудно все дается.
Искренне хуею с постоянных репортов уровня "я выучил HTML+CSS+JS+PHP за 6 месяцев, че дальше".
Я уже 7 лет PHP-макака, и до сих пор быдлокожу за еду. Сложные алгоритмы повергают мозг в ступор.
Спасибо большое. Вот, исправил ошибки:
W5.1 https://ideone.com/94782z
W5.2 https://ideone.com/MCoNPH
W5.6 https://ideone.com/qhdVJ8
W5.7 https://ideone.com/Eh48ab
Вот, еще порешал.
W5.8 https://ideone.com/WNN6jp
W5.9 https://ideone.com/QNB4l9
Конечно, переменная из функции видна только в функции.
Вардампь внутри функции.
Если жизненно важно сделать это снаружи, добавь еще один ссылочный аргумент.
function doSomething($regularArg1, $arg2, &$ref) {
// че-то происходит
$ref = твоя_переменная;
}
var_dump($ref);
Лол, и правда ведь.
Лол, я даже не знаю алгебры уровня 9 класса.
После дискриминанта и системы уравнений я просто пинал хуи вплоть до выпускного.
Спасибо за костыль, браток.
>Лол, я даже не знаю алгебры уровня 9 класса.
>После дискриминанта и системы уравнений я просто пинал хуи вплоть до выпускного.
Я вообще учился в школле с гуманитарным уклоном и проебывал матешу как только мог. Так что ты хоть что-то знаешь. А я могу только в первый курс мед. вуза.
В алгоритмы можешь? Оценку сложности алгоритмов, оценку времени исполнения, потребления памяти и прочее?
БЭ В КВАДРАТЕ МИНУС ЧЕТЫРЕ АЦЭ
Выучил эту формулу наизусть, идя в школу на контрошу по алгебре. Хоть я и не помню, что она означает, но саму формулу помню, хек.
Книг computer science достаточно будет?
Нюфаги, го сюда. Будем делиться опытом, помогать с лабами, выискивать баги.
Грязно.
Почему inclineWord возвращает такую парашу?
> $result = " (".$number.") ".$result;
> declensionMillion
11 миллион? 12 миллиона?
> declensionThousands
11 тысяча? 12 тысячи?
Тебе не кажется, что делаешь однородные действия?
Что число можно разбивать в цикле бесконечно?
Что можно написать код, работающий на числе любой длины, входящего в конфиг вида:
$largeNumbersNames = array(array('тысяча', 'тысячи', 'тысяч'), array('миллион', 'миллиона', 'миллионов'), array('триллион', 'триллиона', 'триллионов'), array('квадриллион', 'квадриллиона', 'квадриллионов'), ...);
Причем при изменении конфига (удалении названия степени, добавления) код должен работать.
Работает.
У меня другой вопрос.
Работает ли trim() в массиве?
foreach($textArr as $key => $value){
trim($value);
}
Благодарю за критику.
Да не могу я в универсальность, делаю всё в лоб, да еще и через жопу. Про такой вариант $largeNumbersNames даже и не подумал.
Походу хуже моего говнокода уже быть не может.
Ну ты даешь.
Что ты вардампить собрался, если после ретурна функция прекращает работу?
https://ideone.com/Yc0sGK
Пробелы сначала надо удалить с помощью preg_replace(). Ставишь регулярки, которые удаляют лишние пробелы и запятые, заменяя их на один пробел.
Если вы сначала че-то там режете по регулярке, а потом еще что-то перебираете и проверяете - вы что-то делаете направильно.
А конкретно этот кадр вдобавок не понимает, что в foreach значения передаются не по ссылке. И что надо их присвоить. Вот так:
foreach ($array as $var => $val) {
$array[$var] = trim($val);
}
Мы тут учимся вообще-то, а не просим решить за нас задачи!
Не делай так больше!
Тем более, что ни черта непонятно в твоем коде
Вроде были и бесплатные - стоит изучить несколько разных вариантов. Там конечно могут быть ограничения вроде "не больше N файлов", но для учебы их должно хватить.
Вот например тут https://c9.io/pricing/webide (взял первого попавшегося провайдера услуг) есть план free - единственный недостаток в нем это ограничение по памяти (1GB RAM, 5 GB HDD) и публичность всех выкладвааемых файлов. Для учебы - хватит.
Проверял в Хромиуме, выпущенном в этом, 2016 году, на ноутбуке с core2duo.
Можно логиниться через гитхаб, если тебя не напрягает что они могут за тобой и на гитхабе теперь следить.
PHP есть, версии 5.5 (увы): https://docs.c9.io/docs/supported-languages (обещают подсветку синтаксиса и отладчик). Есть полноценная (линуксовая) консоль без прав рута.
PHP7 доступен, но параллельно с его установкой придется поучиться консольной магии: https://community.c9.io/t/how-to-upgrade-to-php7/1379
MySQL версии 5.5.44-0ubuntu0.14.04.1, пользователь root без пароля.
Редактор примитивный, слабее Sublime, но может кому-то его возможностей хватит.
В углу физиономия основателя или разработчика,которая там появляется сама собой.
Можно запускать код в консоли, через встроенный в PHP сервер и через Апач. Во втором и третьем случае дают публичный адрес, где можно увидеть ваш проект.
Логи выводятся в вкладке Апача - удобно!
Ну, проектов у меня под рукой полно - взял первый попавшийся гитхаб ( https://github.com/V3N0m21/StudentList ) и не стал его устанавливать так как там нет папки public и инструкций по установке. Позор автору.
Вместо него взял https://github.com/V3N0m21/Uppu4
В ридми кстати не написано что надо править конфиг.
Композер есть (не то чтобы это было проблемой, но удобно).
Вот приложение: https://venom21-students-codedokode-1.c9users.io/
что-то не работает? Скажите спасибо V3N0m21, который не осилил настроить корректно файловый кеш и не добавил нужные папки в репозиторий.
Аноны, может кто-нибудь проверит на себе эту ИДЕ?
Правда, помните что это веб-приложение и вам нужен современный браузер и свободная память (я бы рассчитывал на 400-800 Мб только под вкладку с IDE, это не мерял, а интуитивно посчитал. Померял - вроде пишет 150 Мб, но я редактор почти не использовал, толкьо консоль).
Также, вам нужен большой экран - чем больше, тем лучше. На 1280x720 работать можно, но тесновато - приложение явно расчитано на огромные комьютерные мониторы.
Аватарка меняется через gravatar, если у вас есть на гитхабе то там будет такая же.
Вот команды которые пришлось сделать для установки приложения:
------
13 git clone 'https://github.com/V3N0m21/Uppu4' uppu
14 cd uppu
15 composer install
16 mysql -uroot -e 'CREATE DATABASE uppu CHARSET=utf8'
17 mysql -uroot -e < Uppu4.sql
18 mysql -uroot < Uppu4.sql
# наконец-то!
19 mysql -uroot uppu < Uppu4.sql
20 nano app/config.ini
# поменять документ рут в апаче
21 sudo nane /etc/apache2/sites-available/001-cloud9.conf
22 sudo nano /etc/apache2/sites-available/001-cloud9.conf
# поправить кривокод
23 nano app/bootstrap.php
24 mkdir public/upload
25 chmod 0777 public/upload
26 # почему папки нет в репозитории?
27 mkdir upload/resize
28 mkdir public/upload/resize
29 chmod 0777 public/upload/resize/
---------
В общем, в плане скорости работы облачная ИДЕ сильно зависит от браузера и процессора и проигрывает саблайму. Редактор слабый. В плане удобства - очень удобно, все уже установлено, настроено и "just works". Считайте что cloud9 это как хостинг, только бесплатно и без рекламы и почти все настроено.
Я советую тем, кто хочет опубликовать свое учебное приложение, попробовать. И тем кто не хочет - тоже попробуйте, очень интересная штука. Ну сами подумайте, насклоько ОПу удобнее когда ему дают не только ссылку на код, но и на работающее приложение. И другие анончики смогут протестировать ваше приложение. Сделайте файлообменник, выложите ссылку в /b - вам мигом найдут все баги и уязвимости.
Вроде были и бесплатные - стоит изучить несколько разных вариантов. Там конечно могут быть ограничения вроде "не больше N файлов", но для учебы их должно хватить.
Вот например тут https://c9.io/pricing/webide (взял первого попавшегося провайдера услуг) есть план free - единственный недостаток в нем это ограничение по памяти (1GB RAM, 5 GB HDD) и публичность всех выкладвааемых файлов. Для учебы - хватит.
Проверял в Хромиуме, выпущенном в этом, 2016 году, на ноутбуке с core2duo.
Можно логиниться через гитхаб, если тебя не напрягает что они могут за тобой и на гитхабе теперь следить.
PHP есть, версии 5.5 (увы): https://docs.c9.io/docs/supported-languages (обещают подсветку синтаксиса и отладчик). Есть полноценная (линуксовая) консоль без прав рута.
PHP7 доступен, но параллельно с его установкой придется поучиться консольной магии: https://community.c9.io/t/how-to-upgrade-to-php7/1379
MySQL версии 5.5.44-0ubuntu0.14.04.1, пользователь root без пароля.
Редактор примитивный, слабее Sublime, но может кому-то его возможностей хватит.
В углу физиономия основателя или разработчика,которая там появляется сама собой.
Можно запускать код в консоли, через встроенный в PHP сервер и через Апач. Во втором и третьем случае дают публичный адрес, где можно увидеть ваш проект.
Логи выводятся в вкладке Апача - удобно!
Ну, проектов у меня под рукой полно - взял первый попавшийся гитхаб ( https://github.com/V3N0m21/StudentList ) и не стал его устанавливать так как там нет папки public и инструкций по установке. Позор автору.
Вместо него взял https://github.com/V3N0m21/Uppu4
В ридми кстати не написано что надо править конфиг.
Композер есть (не то чтобы это было проблемой, но удобно).
Вот приложение: https://venom21-students-codedokode-1.c9users.io/
что-то не работает? Скажите спасибо V3N0m21, который не осилил настроить корректно файловый кеш и не добавил нужные папки в репозиторий.
Аноны, может кто-нибудь проверит на себе эту ИДЕ?
Правда, помните что это веб-приложение и вам нужен современный браузер и свободная память (я бы рассчитывал на 400-800 Мб только под вкладку с IDE, это не мерял, а интуитивно посчитал. Померял - вроде пишет 150 Мб, но я редактор почти не использовал, толкьо консоль).
Также, вам нужен большой экран - чем больше, тем лучше. На 1280x720 работать можно, но тесновато - приложение явно расчитано на огромные комьютерные мониторы.
Аватарка меняется через gravatar, если у вас есть на гитхабе то там будет такая же.
Вот команды которые пришлось сделать для установки приложения:
------
13 git clone 'https://github.com/V3N0m21/Uppu4' uppu
14 cd uppu
15 composer install
16 mysql -uroot -e 'CREATE DATABASE uppu CHARSET=utf8'
17 mysql -uroot -e < Uppu4.sql
18 mysql -uroot < Uppu4.sql
# наконец-то!
19 mysql -uroot uppu < Uppu4.sql
20 nano app/config.ini
# поменять документ рут в апаче
21 sudo nane /etc/apache2/sites-available/001-cloud9.conf
22 sudo nano /etc/apache2/sites-available/001-cloud9.conf
# поправить кривокод
23 nano app/bootstrap.php
24 mkdir public/upload
25 chmod 0777 public/upload
26 # почему папки нет в репозитории?
27 mkdir upload/resize
28 mkdir public/upload/resize
29 chmod 0777 public/upload/resize/
---------
В общем, в плане скорости работы облачная ИДЕ сильно зависит от браузера и процессора и проигрывает саблайму. Редактор слабый. В плане удобства - очень удобно, все уже установлено, настроено и "just works". Считайте что cloud9 это как хостинг, только бесплатно и без рекламы и почти все настроено.
Я советую тем, кто хочет опубликовать свое учебное приложение, попробовать. И тем кто не хочет - тоже попробуйте, очень интересная штука. Ну сами подумайте, насклоько ОПу удобнее когда ему дают не только ссылку на код, но и на работающее приложение. И другие анончики смогут протестировать ваше приложение. Сделайте файлообменник, выложите ссылку в /b - вам мигом найдут все баги и уязвимости.
Вот тебе задание - разберись.
Если ты не понимаешь, как работают красивые верные решения, ты так и будешь писать говнокод.
Всегда читай чужой код, разбирайся, как он работает.
Хоят вру - сервер работает не постоянно, а только пока открыта вкладка с IDE в браузере.
ну да ладно, кто хочет посмотреть файлообменник венома - сделайте аккаунт, склонируйте мой проект https://ide.c9.io/codedokode/venom21-students и запускайте сколько влезет.
Несмотря на все недостатки, технология очень интересная. Советую посмотреть хотя бы из любопытства.
Алсо, если кто-то может зайти с андроида/айпада - отпишитесь, как работает, не тормозит ли. 150 Мб памяти вроде для планшета приемлемо, а вот справится ли АРМ процессор - не знаю.
Алсо, файлы не скачиваются так как автор кода V3N0m21 не предусморел отдачу средствами PHP при отсутствии расширения, а ставить его мне лень.
Функция, предназначенная для вызова для другой функцией.
callback дословно - обратный звонок.
Там ведь даже скобка не закрыта, а всё работает.
>>667010
Интересно, схоронил.
Это скобка - литерал. Она заэкранирована, видишь?
Эта штука матчит ситуацию:
начало строки или .!? - (^|[.?!]), символы ?: говорят, что эту группировку не надо сохранять в памяти;
дальше закрывающая скобка (которой может не быть) - \)?
дальше пробельные символы (которых может не быть) - \s*
дальше граница слова, дальше первый символ слова.
>callback дословно - обратный звонок.
И какой смысл вкладывается во фразу "обратный вызов"? Она ничего не говорит интуиции. Зачем придумали эту фразу вместо "лямбда"?
Коллбэк не обязательно должен быть лямбдой (анонимной функцией).
Код из примера можно записать так:
function myStrtoupper($matches) {
return $matches[1] . ' ' . mb_strtoupper($matches[2]);
}
echo preg_replace_callback('#((?:^|[.?!])\)?)\s*\b(.)#su', 'myStrtoupper', $challengeText);
Коллбек - это функция, которая передается в качестве аргумента в другую функцию (а та ее вызывает). Коллбек значит "обратный звонок".
Вот пример:
$files = ['file.txt', 'file.jpg'];
$images = array_filter($files, function ($file) {
return preg_match('/\.(jpg|png)$/u', $file);
});
Здесь мы передаем коллбек в функцию фильтрации массива. Она вызывает ее для каждого файла и решает оставить его в массиве или нет. Таким образом, управление передается то функции array_filter, то обратно нашему коду.
Практика.
Напиши, например, граббер сообщений с сосача с помощью регэкспов.
Тебе сейчас скажут, что нельзя парсить html регулярками, но все так делают. И еще смеются над теми, у кого DOM-парсеры падают на невалидном html.
>>667069
Ну вот функция preg_replace_callback передает в твою функцию свои находки. Ты их обрабатываешь и возвращаешь preg_replace_callback.
>>667072
Я выше отмечался, я веб-макака без алгебры со стажем 7 лет.
Знаю JS.
>>667075
Модификатор u лишний. Здесь он не имеет значения.
Алсо, есть более элегантное решение
return in_array(pathinfo($file, PATHINFO_EXTENSION), array('jpg', 'png'));
#define обратные вызовы
>Ну вот функция preg_replace_callback передает в твою функцию свои находки. Ты их обрабатываешь и возвращаешь preg_replace_callback.
Так почему такие вызовы называются обратными?
Если ты передаешь одну функцию для исполнения как параметр для другой функции, такая функция называется callback.
Она тебе звонит обратно. В эту функцию.
Аналогия с реальным миром - ты оставляешь просьбу перезвонить по такому-то номеру.
Ты оставляешь функции просьбу вызвать такую функцию.
По-английски call - звонить и вызывать.
>Она тебе звонит обратно. В эту функцию
Ну так это стандартная процедура вызовов функций, когда после выполнения со стека снимается адрес возврата. Зачем давать этому процессу название, которое применимо только когда вызов похож на использование лямбд?
Адрес возврата у тебя будет находиться в стеке ниже исполняемой функции.
Ты неправильно понимаешь, что такое callback. Значит, тебе это пока не нужно.
>звонит
В смысле просто использует функциональный контекст вызывающей процедуры, и этому дали глупое название?
Я вопросов твоих не понимаю. Этот приём должен был остаться безымянным?
потому что названия придумывали гуманитарии. им понятия "перезвонить", "фабрика", "наблюдатель" и прочие абстрактные бобы понятней.
Что значит "использует функциональный контекст "? Нет, неверно, она вызвает функцию которую ты ей дал.
>>667120
Вы зря переходите к стекам. Стек - это всего лишь одна из возможных реализаций такой вещи, никто вам не гарантировал что интерпретатор PHP будет его использовать (например оптимизирующий компилятор может заменить вызов функции переходом или заинлайнить ее). Да и я не понимаю, какой смысл обсуждать реализацию когда нам важна общая идея как это работает.
>Что значит "использует функциональный контекст "?
Переданные аргументы и локальные переменные вызвавшей функции.
>Переданные аргументы
Это не функциональный контекст.
>локальные переменные вызвавшей функции
Какие? Из нативного C-кода?
Это не javascript, в PHP у функции только свой скоп.
Тебе объяснили. Однако ты пытаешься (вяло и безрезультатно) раздуть тут пустую дискуссию ни о чем. Это пхп тред, функциональные языки можно обсудить в других тредах, прокрути до 4-5 страницы и обсуждай.
..............00,,,,,,,0,,,,,,00
.............0,,,,,,,,,0,,,,,,,,,0
............0,,,,,,,,,,0,,,,,,,,,,0
...........0,,,,,,,,,,,0,,,,,,,,,,,0
...........0,,,,,,,,,,,,,,,,,,,,,,,,0
...........0,,,,,,,,,,,,,,,,,,,,,,,,0
...........0,,,,,,,,,,,,,,,,,,,,,,,,0
............0,,,,,,,,,,,,,,,,,,,,,0
.............000000000000000
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.........000,,,,,,,,,,,,,,,,,,,,,,000
.......00,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,00
......0,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
.....0,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
....0,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
...0,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
...0,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
...0,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
....0,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
.....0,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,0
..............00,,,,,,,0,,,,,,00
.............0,,,,,,,,,0,,,,,,,,,0
............0,,,,,,,,,,0,,,,,,,,,,0
...........0,,,,,,,,,,,0,,,,,,,,,,,0
...........0,,,,,,,,,,,,,,,,,,,,,,,,0
...........0,,,,,,,,,,,,,,,,,,,,,,,,0
...........0,,,,,,,,,,,,,,,,,,,,,,,,0
............0,,,,,,,,,,,,,,,,,,,,,0
.............000000000000000
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.............0,,,,,,,,,,,,,,,,,,,0
.........000,,,,,,,,,,,,,,,,,,,,,,000
.......00,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,00
......0,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
.....0,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
....0,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
...0,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
...0,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
...0,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
....0,,,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,0
.....0,,,,,,,,,,,,,,,,,0,,,,,,,,,,,,,,,0
Про айфон в кредит? На ней все спотыкаются.
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!)
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
Также, ты читал замечания под задачей?
> Подсказка: мало кому удается решить эту задачу с первого раза. Попробуй сделать так: для начала, поменяй сумму кредита на 4000, так как он выплачивается за 2 месяца и его легко посчитать вручную (всего выплачено 6123). Также, добавь в цикл if, выводящий значения всех переменных и попробуй понять, правильно ли они считаются. Разобравшись с этой суммой, можешь поставить назад число 40000.
Спасибо анончик, сейчас попробую.
Зайдите, попробуйте, кому интересно.
Но мне кажется, что я тут велосипедов нагородил.
Оцените, в общем.
https://ideone.com/AJaH1S
Есть дефолтный загрузчик изображений на сервер.
При попытки загрузить изображение с именем:
CuteLittleGirl проблем не возникает , но если написать на русском языке , он сохраняет его с таким именем: сиваятян , при этом , в бд отправляется нормальное имя тобишь КрасиваяТян.jpg , да конечно я понимаю что проблема в кодировке , но , как ее решить?..
https://ideone.com/3aFoEt
И еще , не подскажите как можно вытащить уже измененное mt_rand имя, что бы я мог его потом запихнуть в БД? ><
Вот код:
https://ideone.com/AJJ62O
разобрался с генерацией случайного имени.
Если ты пишешь по стандартам, твой код будет понятен в любом случае.
http://getjump.me/ru-php-the-right-way/
https://github.com/getjump/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
https://github.com/getjump/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
>>667284
>copy($_FILES['uploadfile']['tmp_name'], $uploadfile)
Нельзя так, используй move_uploaded_file(). Эта функция проверяет, действительно ли этот файл загружен через POST.
>он сохраняет его с таким именем: сиваятян
Дело происходит под Windows? Придется конвертить имя из utf-8 в win-1251.
$winFilename = iconv('utf-8', 'windows-1251', $filename);
Спасибо , но , опять уже со всем успел разобраться :D
не могу понять как это сделать
"проходим от края до середины посимвольно"
http://ideone.com/bpHlPB
> Лучше просто передавать в функцию 3 формы слова через аргументы, а у тебя зачем-то в нее уже заложено несколько вариантов
Не понял этот момент. То есть вместо функции inclineWord сделать тоже самое в функции smallNumberToText?
ОП, проверь, пожалуйста. Может на 3й раз получится.
http://ideone.com/f2IIDk
Подбираю второй монитор для веб-макакинга.
Первый: 20" квадрат, 1400 х 1050.
Кандидаты во второй:
22" 1980 х 1020
22" 1680 x 1050
20" 1600 x 900
19" 1366 x 768
Больше 22 ставить негде. Зрение так себе, боюсь что фулл хд буду рассматривать через лупу. И ваще как у вас все устроено где на каком мониторе иде, браузер, все дела?
FullHD и шрифты большие ставь и всё.
То что какие-то какеры себе ставят 9pt это их личная проблема, тебе нужно не весь код сразу видеть, а строк 30-40, больше мозгом всё равно не объять.
> 1400 х 1050.
А что это за странное разрешение? Оно родное? Если нет то пиксели будут размытые, вредно для зрения.
Родное, довольное редкое.
Взял себе DELL 24" 1920х1200, вроде норм
Дебажишь через расширение? С кукой он должен все видеть в пределах домена.
>>667432
Квадрат 17 1280 на 1024 в треде. Ну я сначала взял 22 TN. Потом поменял на 22 ips. Потом на 24. Теперь 2 по 24, я бы и 3-й взял, но цены в моих пердях и в долларах повырастали. Весь этот путь я прошел за месяц.
Относительно недавно я сделал все задания из шапки (по моему был сайт на народе) но по какой то причине забросил этот чудо язык кажется я ебался с настройками лампа, ксампа и вообще заебался с этими линуксами
Алсо. Хочу сразу сесть на хуй работать с базами MySQL.
Подскажите простейший пример чего нибудь, чтобы я просто начал, а потом уже ебался с остальным.
Там ведь всего лишь - соедениться, записать в базу, удалить базу, выполнить запрос MySQL, верно? Стало быть мне надо учить MySQL или продолжать ебаться с пхп?
Моя цель - написать элементарный сайт и пердолить его. ПРОСТО ДЛЯ ДУШИ. Мне все таки 20 ёбаных лет, а я не умею в пхп и БД. Это меня крайне унижает. Анон, поставь на путь истиный.
Мне 23, у меня диплом экономиста, и я только начинаю учить Пхп, чтобы перекатиться в пограминг
Покажи пожалуйста все свои настройки в PHPstorm связанные с дебаггом и если не сложно в виртуалке как ты сетевое соединение настраивал (я через мост сделал и на убунте поднял вебмин) Я вот счас ребутнул машину, всё запустил с нуля, и теперь у меня даже в первом скрипте шторм не видит дебаггер
в файле пхп.ини пропиши путь к дебаггеру и всё, в шторме не надо настраивать, оно само найдёт
[xdebug]
zend_extension="/usr/lib/php5/20121212/xdebug.so"
xdebug.default_enable = On
xdebug.var_display_max_depth=6
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9005
xdebug.remote_handler=dbgp
xdebug.idekey=PHPSTORM
xdebug.remote_mode = req
xdebug.remote_autostart=1
xdebug.remote_log=/tmp/xdebug.log
xdebug.profiler_enable_trigger=1
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/var/www/debugger/"
xdebug.profiler_output_name = "callgrind.%u.%H_%R"
xdebug.show_local_vars=1
xdebug.overload_var_dump=1
xdebug.max_nesting_level = 200
Вот настройки пхп.ини
меня смущает строчка xdebug.remote_host=127.0.0.1
что именно здесь должно быть?
Я думаю, он знает такое, что ему твоя пыха обоссаная нахуй не нужна.
Дык выше уже все что где то менял выложил. У убунты нужно 2 сетевых интерфейса что бы ты к ней мог приткнуться и она к тебе. Паста от ОПа:
Алсо, если ты ставишь линукс в виртуалке в Oracle Virtual Box, то наткнешься на проблемку: линукс может лезть в интернет, а ты к нему подсоединиться не можешь. Это по той причине, что Vbox подсоединяет сетевую карту твоей виртуалки к NAT. Чтобы в нее коннектиться, надо будет добавить вторую сетевую карту, выставить ей примерно такие настройки как на пикрелейтед (обрати внимание на слово host-only network).
Ну и потом в самом дебиане перенастроить эту карточку, естественно, сама она себя не настроит. Вот что надо дописать в /etc/network/interfaces:
auto eth1
iface eth1 inet static
address 192.168.56.2
netmask 255.255.255.0
gateway 192.168.56.1
metric 100
Ну надеюсь ты понимаешь, что тут указан Ip-адрес и шлюз.
После этого, перезапусти сеть через sudo service networking restart
Если все ок, то ты сможешь пинговать виртуалку с хоста через ping 192.168.56.2 .Если не ок — читай записи в /var/log/messages
Возможно, твой фаерволл или антивирус может заблокировать пинг или попытку соединиться с виртуалкой. Придется его перенастроить.
Чтобы обращаться к виртуалке через имя, пропиши его в файл hosts.
Работать через консоль виртуалки неудобно, так что включи ssh и коннекться через программу вроде putty. По ssh можно также передавать файлы (например программой WinSCP) так что все это тебе пригодится.
Проблемы? Смотри логи командой tail -30 /var/log/messages (понядобятся права админа).
Дык выше уже все что где то менял выложил. У убунты нужно 2 сетевых интерфейса что бы ты к ней мог приткнуться и она к тебе. Паста от ОПа:
Алсо, если ты ставишь линукс в виртуалке в Oracle Virtual Box, то наткнешься на проблемку: линукс может лезть в интернет, а ты к нему подсоединиться не можешь. Это по той причине, что Vbox подсоединяет сетевую карту твоей виртуалки к NAT. Чтобы в нее коннектиться, надо будет добавить вторую сетевую карту, выставить ей примерно такие настройки как на пикрелейтед (обрати внимание на слово host-only network).
Ну и потом в самом дебиане перенастроить эту карточку, естественно, сама она себя не настроит. Вот что надо дописать в /etc/network/interfaces:
auto eth1
iface eth1 inet static
address 192.168.56.2
netmask 255.255.255.0
gateway 192.168.56.1
metric 100
Ну надеюсь ты понимаешь, что тут указан Ip-адрес и шлюз.
После этого, перезапусти сеть через sudo service networking restart
Если все ок, то ты сможешь пинговать виртуалку с хоста через ping 192.168.56.2 .Если не ок — читай записи в /var/log/messages
Возможно, твой фаерволл или антивирус может заблокировать пинг или попытку соединиться с виртуалкой. Придется его перенастроить.
Чтобы обращаться к виртуалке через имя, пропиши его в файл hosts.
Работать через консоль виртуалки неудобно, так что включи ssh и коннекться через программу вроде putty. По ssh можно также передавать файлы (например программой WinSCP) так что все это тебе пригодится.
Проблемы? Смотри логи командой tail -30 /var/log/messages (понядобятся права админа).
Всем спасибо кто помогал, в общем всё работало ещё вчера, я не учел что у меня vqmod на сайте, и брейкпоинты в оригинальных файлах не влияли на работу сайта, он просто работал с закешированных файлов.
@media print {
Копирую сюда весь css код
}
При этом ничего не выравнивается по центру, когда выводишь документ на печать, выравнивается только если проставить вручную все выравнивания в самом HTML, но это само собой долго и неудобно.
<?foreach($arr as $key=>$val) {?>
<tr>
<td><?=$key?></td>
<td><?=$val?></td>
</tr>
<?}?>
Выдает Undefined variable val и key. Что за дела?
Попробуй так.
<?foreach($arr as $key=>$val) {
<tr>
<td><?=$key?></td>
<td><?=$val?></td>
</tr>
}?>
А ты сам массив $arr разве определил?
Откуда они у тебя возьмутся, из воздуха?
Или ты не весь код показал.
Я мимопроходил вообще.
Вот такое что-то тебе нужно было: http://ideone.com/wigFKJ ?
Или что? Я просто не работал с HTML в PHP пока, стало интересно.
А почему на фоне не члены и членики, большие и маленькие?
Кто-то очень не любит php и репостит вам из ньюфаг-треда.
В PHP есть функция htmlspecialchars.
И почитай урок про XSS.
https://github.com/codedokode/pasta/blob/master/security/xss.md
https://ideone.com/klAllR
Поставь $deposit *= 1.1 в тело цикла.
После каждой итерации проверяется условие в цикле, поэтому как только становится больше миллиона - всё обрывается, не срабатывает echo.
Ты дурак? Это пхп тред, ты постишь скомпилированный неизвестно каким компилятором код на Си и пытаешься что-то доказать.
Алсо чтобы увидеть ассемблерный листинг скопилированной функции, незачем запускать отладчик. Можно попросить компилятор сгенерировать ассесблер. Иди мануалы читай, а не демонстрируй свое невежество.
Ну главным плюсом считал скорость развертывания, имхо подразумевая то что на винде вообще не удобно работать.
Установить что либо на него можно.
Вагрант ставится из экзешника и ни с чем не конфликтует.
Хотя возможно из за того в нем уже все настроено, новичок упустит большой пласт знаний по настройке и пердолинге, но он обычно юзает всякие денверы, что то же не лучше
Алгоритм. Считаем сколько сейчас васян должен банку.
Если васян должен больше чем 5000 то платим 5000. Иначе платим сколько нужно.
Проверяем. Кредит баланс = 0 ? тогда выходим из цикла.
Обрати внимание: сначала считаем долг за текущий месяц. А потом платим сколько нужно/можем. А не в одну строчку как в исходном алгоритме.
Спасибо, я решил её. Не знаю, такое решение принимается? Или это не верно?
http://ideone.com/P8593d
Object not found!
The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.
В чём может быть дело?
Для человека достаточно важно формулировать свои проблемы в словах, а также быть услышанным, пусть это и мимокрокодилы в интернете.
Почему в этом http://ideone.com/xpUiVh случае в форыче строка склеивается как положено, а тут http://ideone.com/xpUiVh она дублирует сама себя, и получается 3 строки, вместо одной? Код один и тот же ведь. Ну как мне кажется.
К примеру, грубо говоря
function edit_the_title($title){
If (get_the_ID()=="69"){
return $title." Edited title";
}
return $title;
}
add_filter('wp_head','edit_the_title');
Работает, но в этом случае проверка происходит на каждой странице вообще, а это не есть хорошо, как по мне - так как этих проверок у меня несколько а вопдпресс и так лагает.
If (get_the_ID()=="69"){
add_filter('wp_head','edit_the_title');
}
И тому подобное не работает, я полагаю что станица еще не успевает получить ID на момент обработки основного уровня плагина. Вообще не могу найти в гугле примеров работы add_filter внутри других функций и хуков.
я это ты, братюня, ты это я
Какие ты веб приложение на пыхе пилишь? На жсе можно расширение браузерное сделать, игру, да что угодно. А на пыхе только сайтики.
Яндекс.толока.
Есть такое https://gist.github.com/codedokode/a455bde7d0748c0a351a
>>668547
Изучай CMS и конструкторы. Но они ориентированы на тех кто хочет делать сайты через админку мышкой или слегка доработать существующий код.
Так у тебя var_dump внутри foreach, вот он на каждой итерации тебе и показывает содержимое строки.
https://ideone.com/8unvtR
Чтобы не отбить желание кодить можешь пока писать на http://ideone.com/ и делать задачки из оп-поста.
Нет, там должна сумма выплат быть 61270.
Конкретно в этом твоём варианте вот что неверно: когда $creditBalance у тебя становится меньше $monthlyPayment, то у тебя следует вот это выражение: $creditBalance = ( $creditBalance х $percent ) + $servicePayment - $monthlyPayment;. И в какой-то момент это уходит в минус, от чего дальше всё идёт неверно.
Подсказка: попробуй ввести отдельную переменную для подсчёта $creditBalance = ( $creditBalance х $percent ) + $servicePayment, ведь именно когда этот момент становится меньше $monthlyPayment, нам и надо просто его выплатить и приплюсовать к $paymentTotal.
>>668331
Не всё сразу, бро.
Я вот уже третий месяц постепенно иду.
Есть братишки, которые одну за одной решали задачи, а потом слились на подступе к ООП.
У меня так-то тоже ПРИГОРАЕТ постоянно. Смотрю на "Кошки-мышки", "Сапёра" на JS, на "Вектор" - просто ПОЛЫХАЕТ, потому что пока ни черта не могу понять. Вот со следующей недели к ООП подступаю, только начал читать Зандстру и ОПа.
Вордпресс не станет больше тупить из-за одного-единственного if.
>>668547
Без базара, братиш.
Разрабатывай сайты на CMS, греби бабло лопатой.
>>668613
Купи себе хостинг за 12 рублей в месяц и забудь про все это. http://host-food.ru
Есть сайты, а есть веб-приложения
Сайты наполняются текстом и jquery при помощи мышки, веб-приложения — нет
Все зависит от задач
Если я большое число буду обрабатывать как строку т.е. для разбиения использовать substr, а уже выделенные сотни, тысячные обрабатывать как числа это нормально или так делают только быдлокодеры?
Лучше использовать вот такие конструкции:
if ($number >= 999 || $number <= 999999) {
}
if ($number > 999999 || $number <= 999999999) {
}
Это всё облегчит нахождение чисел для переработки "троек" (сотен, сотен тысяч и сотен миллионов).
Ой, то есть в первом варианте:
if ($number > 999 || $number <= 999999) {
}
А до этого нужен вариант:
if ($number <= 999) {
}
Там будет просто сама функция, которая раскладывает минимальное число, тройное.
>>668730
А если я хочу обрабатывать числа больше 999999999?
На моём комплюхтере с шиндовс echo PHP_INT_MAX выдаёт 2147483647 все что больше преобразуются в float.
Для работы с числами надо использовать математические методы.
В задаче не требуется обрабатывать суммы больше миллиарда, однако, если тебе хочется чуть усложнить задачу, то есть специальные библиотеки для работы с числами неограниченной разрядности:
http://php.net/manual/ru/book.gmp.php
http://php.net/manual/ru/book.bc.php
Тип float нельзя использовать для денег так как он имеет ограниченную точность http://php.net/manual/ru/language.types.float.php
(около 16 знаков)
http://pastebin.com/z2JZFxxz конфиг апача. В настройках в опенсервере слушает все ip, в hosts алиасы на оба(127.0.0.1 и 192.168.1.8) ведут на localhost. С локального компа могу зайти на сайт только через локалхост, тогда как по обоим ип выдает ошибку пикрил
отвалился
Конверти в строку, используй substr.
(Здесь можно, цифры занимают 1 байт.)
Проверить, что на вход тебе пришли сугубо цифры, можно при помощи ctype_digit(string $string);
> Типа такого: require_once(__DIR__ . '../src/init.php') ?
Да
>> По моему тут может быть ситуация когда переменная не определена. Как можно писать надежный код если неизвестно существует переменная или нет?
> Поясни, пожалуйста. isset($_GET['registered']) недостаточно?
Речь по $msg. Она у тебя создается внутри 2 ифов выше этой строки:
https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudent.php#L23
Следовательно если ифы не сработают, переменная не будет существовать.
Если ты создаешь переменную внутри ифа - ты должен только внутри его ее и использовать. То есть переменную надо использовать только в пределах того блока (области), в которой она создана.
> В UrlHelper есть смысл параметры ($sort, $dir и прочее) сделать членами класса и передавать в конструктор?
Это нелогично. Конструктор для тех параметров которые обязательны для создания объекта. С какой это стати нам нужно указывать сортировку чтобы создать класс генерации URL?
>> Однако тогда надо обеспечить инкапусуляцию, то есть чтобы никто другой напрямую к этой куке не обращался.
> Не очень понял, как это можно сделать.
В данном случае надо просто убрать обращения к этой куке (токену) из других мест кода если они там есть.
> unset($_COOKIE);
// используем функции хелперов, которые работают с $myCookie
> $_COOKIE = $myCookie;
Это вообще что-то странное, зачем уничтожать стандартный массив PHP?
>>> public static function fromRow($row)
>> Маппингом студента на строчку базы данных должен заниматься класс для работы с базой данных.
> Но это же по сути конструктор. В языке с перегрузкой методов, я бы их и использовал, а тут приходится так извращаться.
Перегрузка придумана не для того чтобы нарушать принципы разделения кода. Ты невнимательно прочел, то, чт я написал, давай я еще раз повторю:
- каждый класс должен заниматься своим делом. Взаимодействием с базой данных должен заниматься предназначеннный для этого класс. Модель студента не должна знать ничего о базе данных. Очевидно что статический конструктор нарушает это так как выносит знание о структуре базы данных из гейтвея в модель студента. Очевидно это неправильно.
> Я понимаю, но зачем нам здесь поддержка кириллицы?
Поддержка не нужна, но проще везде поступать единообразно и использовать mb-функции. Давай посмотрим с другой стороны. А какая выгода использовать здесь strlen? Чтобы сложнее было понять правильный код или нет?
strlen это не функция подсчета числа символов. Это функция подсчета числа байт, а в твоем коде очевидно считается число символов - следовательно ее использование тут не очень логично.
> Типа такого: require_once(__DIR__ . '../src/init.php') ?
Да
>> По моему тут может быть ситуация когда переменная не определена. Как можно писать надежный код если неизвестно существует переменная или нет?
> Поясни, пожалуйста. isset($_GET['registered']) недостаточно?
Речь по $msg. Она у тебя создается внутри 2 ифов выше этой строки:
https://github.com/disbeliever/php_training/blob/master/students/src/ControllerStudent.php#L23
Следовательно если ифы не сработают, переменная не будет существовать.
Если ты создаешь переменную внутри ифа - ты должен только внутри его ее и использовать. То есть переменную надо использовать только в пределах того блока (области), в которой она создана.
> В UrlHelper есть смысл параметры ($sort, $dir и прочее) сделать членами класса и передавать в конструктор?
Это нелогично. Конструктор для тех параметров которые обязательны для создания объекта. С какой это стати нам нужно указывать сортировку чтобы создать класс генерации URL?
>> Однако тогда надо обеспечить инкапусуляцию, то есть чтобы никто другой напрямую к этой куке не обращался.
> Не очень понял, как это можно сделать.
В данном случае надо просто убрать обращения к этой куке (токену) из других мест кода если они там есть.
> unset($_COOKIE);
// используем функции хелперов, которые работают с $myCookie
> $_COOKIE = $myCookie;
Это вообще что-то странное, зачем уничтожать стандартный массив PHP?
>>> public static function fromRow($row)
>> Маппингом студента на строчку базы данных должен заниматься класс для работы с базой данных.
> Но это же по сути конструктор. В языке с перегрузкой методов, я бы их и использовал, а тут приходится так извращаться.
Перегрузка придумана не для того чтобы нарушать принципы разделения кода. Ты невнимательно прочел, то, чт я написал, давай я еще раз повторю:
- каждый класс должен заниматься своим делом. Взаимодействием с базой данных должен заниматься предназначеннный для этого класс. Модель студента не должна знать ничего о базе данных. Очевидно что статический конструктор нарушает это так как выносит знание о структуре базы данных из гейтвея в модель студента. Очевидно это неправильно.
> Я понимаю, но зачем нам здесь поддержка кириллицы?
Поддержка не нужна, но проще везде поступать единообразно и использовать mb-функции. Давай посмотрим с другой стороны. А какая выгода использовать здесь strlen? Чтобы сложнее было понять правильный код или нет?
strlen это не функция подсчета числа символов. Это функция подсчета числа байт, а в твоем коде очевидно считается число символов - следовательно ее использование тут не очень логично.
Все верно
Тут тоже все правильно.
> echo $string = "Я {$wor
Присваивание (=) и echo это 2 отдельных команды и они должны быть на 2 отдельных строках. Но в данном случае вообще непонятно зачем тут переменная и что мешает сразу вывести строку.
в остальном верно
все правильно.
>>665126
Попробуй прикинуть какие фичи тебе понадобятся, а какие нет. Например если ты не используешь "хлебные крошки" (breadcrumbs) то можно их не включать.
Вообще я думаю, тебе не понадобится большинство фич.
Я не разбираюсь в опенсервере, так как он накручивает там что-то свое для конфигурирования Апача.
Ну, напрямую я не мог конфиги править, после перезапуска он их стирал. Нужно править только через настройки самого опенсервера, но а сами параметры доступа вроде верны. Я везде поставил Allow All, в чем проблема?
Обычно в Апаче в блоке VirtualHost указывается основное имя и алиасы, для которых применим данный блок, и иногда IP (но это не требуется указывать)
https://httpd.apache.org/docs/2.4/ru/mod/core.html#virtualhost
Соответственно если он иногда работает а иногда нет, что-то не так настроено. Надо смотреть какой там конфиш и сравнивать с докуентацией.
Не понимаю какая выгода мучаться с настройками опенсервера и разбираться что он делает с конфигами когда можно не ставить сборки, а ставить чистый Апач который работает как описано в документации.
Нет, всё сделал. Только причем тут эти задачи? Разбивать регулярками? Так суть вопроса не в том, как разбивать, а можно ли с числом в данной задаче работать на этапе разбиения как с строкой.
http://ideone.com/jwSIEZ
Ничего не понимаю. В туториале команда ucfirst, кажется, не упоминалась, но почему она не работает? Если вставляю простую строку - делает первую букву заглавной, если строка из массива - игнорирует.
Да ни при чем. Просто я думал, что я тут один такой тупой сижу и не могу решить задачу с регуляркой, а вы все их тупо пропускаете.
Wordpress/drupal/joomla
id - название страницы - количество нажатий
Стоит ли создавать для этого новую таблицу в вордпресс или постараться как-то обойтись существующими?
$a = -12;
$b = 1;
$c = 1;
$discr=$b$b-4$a$c;
$dva_a = $a 2;
$x1=(-$b+sqrt($discr))/$dva_a; //ответ -0.25(правильный)
$x1=(-$b+sqrt($discr))/$a * 2; //ответ -1(неправильно)
ЧЯДНТ?
там должно быть /($a2) а не /$a2 это разные выражения
>Вордпресс не станет больше тупить из-за одного-единственного if.
Бля, точняк, протер глаза - это у меня ORDER BY RAND() в таблицах по несколько десятков тыщ записей отжирает время.
>>668894
Шорткод со скриптом счетчика - так себе решение, лучше подключи JS файл со скриптом (через wp_enqueue_script() или как его там), который будет смотреть, та ли категория у страницы (я давно не делал ничего с JS на WP, но кажется там есть JS объект какой-то с информацией о посте) и навешивать действия на твои кнопки со счетчиком.
Хранить данные лучше в таблице вордпресса - кажется, wp_postmeta тебе должна подойти идейно.
.main{
Background: url(images/1.jpg);
Height: 300px;
Weight: 100%;
Background-size: cover ;
}
</div>
Не получается вставить фон в css.
Далее вставляю его в html
<link rel="stylesheet" type="text/css" href="style3.css">
Что я делаю не так?
Шапка для кого написана?
Файлообменник смотри, это следующая задача от ОПа. Так же можешь попробовать написать свою борду или блог, но это уже посложнее будет.
кстати, интересно, неужели все треды в борде хранятся в бд? или есть какой-нибудь механизм автоочищения таблиц? как думаете?
Конечно есть механизм автоочищения. То же самое происходит и с файлами в этих тредах, если тред тонет, то все картинки которые были туда загружены будут доступны на сервере какое-то время (в /b/ это обычно пару часов, за тематику не знаю).
Ты уверен, что путь правильно прописал? Судя по картинке, у тебя в папке с файлом .css есть папка, где лежит искомый фон, так?
Ой, судя по коду, то есть.
Открой код страницы в хроме (я надеюсь у тебя хром) выбери body в колонке стилей справа смотри на ссылку со стилем, где прописан background-image и пройди по ссылке.
Почему не переходит? Полную ссылку в студию и местоположение картинки относительно корня сайта.
Да хоть 9999999999999999999999999999999.
Просто соответствующее количество if'ов для этого будет нужно.
Ты же будешь в строку переводить, а не математически.
Про математически анон тебе подсказал уже.
Алсо, тут вроде бы тоже все чисто
<link rel="stylesheet" type="text/css" href="style.css">
<link rel="stylesheet" type="text/css" href="style3.css">
<meta charset="utf-8"/>
>>669141
https://github.com/codedokode/pasta/blob/master/network/urls.md
У ОПа есть урок про абсолютные и относительные ссылки, рекомендую почитать.
Решал задачку по генератору имён. Ну скопировал код, а про название ф-ции что берёт рандомный индекс массива и не увидел. Решил всё способом, когда был
$random = rand(count($letters)-count($letters),count($letters));
http://ideone.com/P526Ry -5.4(рост)
http://ideone.com/6F7GME -5.5(ответ на вопрос)
http://ideone.com/gU18qG -5.6(генератор имени)
Что-то не пойму, в чём стоит задача - нужно допилить для всех букв шифрующие символы или как?
>Что-то не пойму, в чём стоит задача - нужно допилить для всех букв шифрующие символы или как?
Да.
Как в echo складывать две переменные?
echo "$a+$b" выводит 1+1, а не 2. Нужно создавать третью переменную для результата?
>>668956
Я думаю, проще всего в шаблоне вывода записи сделать условие:
если (категория == нужной категории):
<скрипт>запуститьСчетчик()</скрипт>
endif
>>668943
/ $a * 2 значит поделить на a и умножить на 2, надо скобки ставить
>>668956
> Хранить данные лучше в таблице вордпресса - кажется, wp_postmeta тебе должна подойти идейно.
Да, если надо только хранить число нажатий и не надо хранить каждое нажатие отдельно
>>669015
<div class="main">
.main{
Это вообще что? Смесь CSS и HTML в одном файле?
>>669158
Залей свой HTMl и CSS код на jsfiddle.net
>>669198
> count($letters)-count($letters)
Это такой хитрый способ записать число 0?
Алсо, используй mt_rand - она надежнее и случайнее. Алсо тут ошибка, в массиве нет элемента с индексом равным count(...)
>>668956
Я думаю, проще всего в шаблоне вывода записи сделать условие:
если (категория == нужной категории):
<скрипт>запуститьСчетчик()</скрипт>
endif
>>668943
/ $a * 2 значит поделить на a и умножить на 2, надо скобки ставить
>>668956
> Хранить данные лучше в таблице вордпресса - кажется, wp_postmeta тебе должна подойти идейно.
Да, если надо только хранить число нажатий и не надо хранить каждое нажатие отдельно
>>669015
<div class="main">
.main{
Это вообще что? Смесь CSS и HTML в одном файле?
>>669158
Залей свой HTMl и CSS код на jsfiddle.net
>>669198
> count($letters)-count($letters)
Это такой хитрый способ записать число 0?
Алсо, используй mt_rand - она надежнее и случайнее. Алсо тут ошибка, в массиве нет элемента с индексом равным count(...)
<div class="form-group required">
<label class="control-label" for="input-payment-lastname"><?php echo $entry_lastname; ?></label>
<input type="text" name="lastname" value="<?php echo $lastname; ?>" placeholder="<?php echo $entry_lastname; ?>" id="input-payment-lastname" class="form-control" />
</div>
есть форма, как отправить в ластнейм готовое значени и скрыть элемент формы удалить? json жалуется
Изучить HTML, в частности скрытые поля форм. Если ты не знаешь HTML то надо читать учебники, а не копипастить куски кода из интернета.
Есть скрипт входа на сайт с сессиями , все вроде бы ОК , но , при попытки извлечь из БД что-то кроме поля username я получаю..нихуя. просто пустое поле , можете пожалуйста ткнуть на ошибку? Там немного , всего 5 файлов.
https://dropmefiles.com/p7XUK
>Это нелогично. Конструктор для тех параметров которые обязательны для создания объекта. С какой это стати нам нужно указывать сортировку чтобы создать класс генерации URL?
ОК. У нас есть класс, в котором нет данных, и методы которого зависят только от своих аргументов. Почему я не могу сделать эти методы статическими?
У тебя модель active record? Ну хуево тебе значит.
Если выделить слой сервисов то будет намного проще и тестить и мокать.
В правильных контроллерах логики быть не может поэтому и тестить там нечего.
Хотя конечно можно написать интеграционные тесты чтобы проверить те же роуты и что все заводится в продакшен-конфигурации.
SELECT `ID`, `NAME`, `CITY` FROM `TABLE` ORDER BY RAND() LIMIT 20
ID- авто инкремент праймери ки.
Поковырял это чуть-чуть, понял что это дохуя медленный запрос.
В качестве промежуточного варианта решил следующее:
1. Отдельным запросом узнать минимальный и максимальный ID
2. Нагенерить с mt_rand 20 случайных чисел между мин и макс ID
3. SELECT `ID`, `NAME`, `CITY` FROM `TABLE` WHERE `ID` IN ($random_range_string)
Эта ебота получилась у меня, ясен хрен, быстрее первой раз в 8.
Но существует вероятность что некоторые ID будут удалены, что делает эту конструкцию какой-то ненадежной. Подумал, что в качестве костыля можно добавить еще один автоинкремент столбец в таблицу, который будет пересчитываться при каждой вставке/изменении/удалении значений. Происходят эти операции довольно редко, поэтому производительность этих запросов не так важна.
Короче, это разумный подход? Или существует какой-нибудь простой чудо-запрос, который сделает все красиво без этой еботы?
Написать хранимку которая будет дергать N раз
SELECT FROM table WHERE key >= FLOOR(RAND()MAX(id)) LIMIT 1
Вопрос: есть инструменты, которые помогут мне в тестировании функционала без пользовательского интерфейса?
Десктопную на пхп? Мсье знает толк.
Во-первых оформляешь свою либу в пакет, пишешь юнит-тесты.
Потом можешь написать CLI как отдельный проект из которого дергаешь либу.
Потом делаешь свою гуйню, опять подтягиваешь либу, ибо нехуй держать яйца в одной корзине.
>Десктопную на пхп?
Нет, это будет веб-приложение. Гуями я назвал html-шаблоны и js, и там тоже будет потом достаточно работы. Не хочу распыляться, хочу сначала сервер сделать, потом клиент.
Т.е. SPA но сервер на пхп?
Но зачем если есть более приспособленные под это языки?
Ну в любом случае начинать надо со спецификаций, см. BDD или TDD что тебе больше вкатит.
>Т.е. SPA но сервер на пхп?
Да, наверное SPA. Гуи буду пилить на этом: https://www.sencha.com/products/extjs/
>Но зачем если есть более приспособленные под это языки?
Потому что я изучаю пхп.
Снова вбрасываю исправленную версию Grammar Nazi
вот из этого поста >>653722
Поправил некоторые моменты, как вывести только часть строки с ошибкой я так и не уловил.
http://ideone.com/SHG6hF
Всё плохо.
Ты собери свой текст, сделай его без абзацев - увидишь, что именно там плохо.
http://ideone.com/yAVftj
Объясняли же ведь уже этот момент тебе.
И да, надо выводить не с помощью var_damp, а с помощью переменной. Для этого надо доставать из массива $match соответствующие значения (ошибки, которые туда набиваются).
>как вывести только часть строки с ошибкой я так и не уловил.
Надо захватывать соседние слова, только и всего.
Регулярка вида: "слово, пробел есть или нет, ошибка, пробел есть или нет, слово".
Ты не понял, как найти слово? Там же объясняется это несколько раз: [а-яё] - а дальше знак, который при следующем пробеле оборвёт это вырезание. В итоге регулярка захватит только соседнее слово.
С опытом должно прийти.
Пока проверяй все задачи анонов, которые сам уже решал, пытайся исправить и помочь.
Мне лень проверять.
Я ещё прежде работу проверял, всё переводило правильно. Толкового посоветовать ничего не могу.
Жди ОПа и его разбора.
http://ideone.com/fVLFtB
1. В функцию можно подставлять непосредственное значение переменной: countMoney($creditSum,7777, $percent, 0, 0, $payout); - все те переменные, которые одинаковые, вставляются переменными. А те, которые отличаются, - вставляются числами.
2. В СофтоБанке должно получиться 61270 с копейками - как в задаче про Айфон. Здесь ошибка в расчётах. В последнем банке должно получиться 53 тысячи с чем-то. Ну это и естественно, что ошибки будут, раз контрольный средний банк считает неверно.
3. $creditSum х $percent / 100 + $comission - повторяется несколько раз. Лучше заведи отдельную переменную для этого.
4. $payment = $i х $payout; - неожиданное выражение, впервые в этих задачах встречаю такое. Вроде бы всё нормально в этом случае. Обычно просто плюсуют $payout к $payment.
Вот например - на гитаре когда учился, то я точно знал, что щас задрачу эту мелодию, а потом покажу друзьям/семье и они меня похвалят. Тут же, непонятно. Можете расписать, примерно, что будет происходить с моей жизнью, через месяц-три-полгода етц, если я продолжу обучение? В планах php->html,css->js->mysql.
Заставлю то я себя в любом случае, но если вы меня поддержите, то будет легче :3
>Можете расписать, примерно, что будет происходить с моей жизнью, через месяц-три-полгода етц, если я продолжу обучение
Ты инфантил и надеешься, что программирование преобразит твою жалкую жизнь. Но это не так, и ты просто будешь сосать хуй, не понимая, что происходит.
да хули ее преображать? она и так прекрасна. Просто скоро придется деньги зарабатывать, а я не хочу утром вставать и идти выполнять приказы левых людей. Просто пример приведи.
Гитара: первую неделю пытаешься попасть пальцами в струны, постоянно сбиваешься с ритма, не можешь играть больше получаса изза болей в пальцах; месяц - умеешь играть одну песню, сыграл ее уже - 1000 раз, но все равно стесняешься показать людям, пытаешься что-то напевать при игре; 3месяца - умеешь играть несколько песен, готов тренироваться днями на пролет, горланишь на всю хату пока никого нету дома, аноны с сосача обоссали за кривой вокал; пол года - играешь 10+ песен, ни слушаешь никаких советов и уверен в том, что сам все знаешь, аноны пару раз похвалили пение, показал пацанам со двора - разцеловали; год - начинаешь изучать супер сложные композиции сам незная зачем ИТД.
Вот так нельзя?
>Вот так нельзя?
Один раз можно.
Извэни тора гой но йА не готов засирать своим нытьём ещё и этот тред.
чат же все таки
Научившись всему из гайдов в оп посте ты сможешь устроиться джуниором за почти нихуя в неприхотливую веб контору. Потусовавшись там с годик сможешь перекатиться во фриланс и работать из старбакса, попивая тыквенный латте и бугуртя на индусов.
Нет. Пробежался по статье, там написано как хранить древовидные структуры в бд, у меня по сути в таком же виде организована таблица (кроме глубины). Мне нужно именно отображение этих данных.
Всё можно. Сначала разберись во всех задачах ОПа, никуда не торопись, помогай новичкам, которые появляются и пропадают. Месяца за 3-4 натренируешься в задачах до высокого уровня, сможешь не глядя их решать, будешь читать чужой код и предчувствовать даже по описанию задачи, в чём человек ошибся.
Дальше - переходишь дальше.
Всё возможно, если изучаешь для удовольствия.
Ты же гитарой зарабатывать не собирался, наверное.
Хм, в какой-то момент у тебя $creditSum уходит в минус.
Например, в какой-то момент $creditSum становится равен 260 рублей. Тут же происходит следующее: $creditSum = $creditSum х $percent / 100 + $comission - $payout;. Это всё становится отрицательным значением.
А далее у тебя if ($creditSum х $percent / 100 + $comission < 5000), то есть эта отрицательная $creditSum в этом условии даёт положительное и нужное число.
Это не вполне верно. Поэтому и не получится выделить отдельную переменную выражению $creditSum х $percent / 100 + $comission.
ОП не будет доволен, он всё это видит насквозь.
Расчёты не должны нырять в минус в этой задаче.
*равен 260-ти рублям
Человек попросил накидать мотивации, ему и накидали.
какая разница правда это или нет, главное замотивировать
Если начнешь хуярить, то через 4-8 месяцев найдешь работу (если ты не из пердей каких-нибудь).
Если не найдешь, значит плохо хуярил.
Ты просто опыта набрался или книжки какие-то читал?
Короче, просто хуярь, и будет тебе счастье.
Отныне день, когда ты не напишешь ни строчки кода, не прочитаешь ни одной статьи про теме, будет прожит для тебя зря.
Уделять обучению надо не менее четырех часов в день.
Помни: главное - хуярить. Ты же не работаешь, верно? Значит времени и возможностей до хера.
Проверьте задачку на правильные мобильные номера, пожалуста.
https://ideone.com/8fJqR0
Многие в этом тебе много чего не знают. Новички же совсем.
Зато многие претенденты на позицию джуна знают.
Вот это несколько раз скопировано: "\ ?".
Попробуй использовать квадратные скобки, которые означают "любой указанные символ в любом порядке", а также кое-какой символ после них - чтобы дать понять, что скобок, минусов и пробелов там может быть неограниченное количество.
https://ideone.com/2c6hDp - такого номера нет у ОПа (первый в правильных), но он вполне реален. Сможешь ли ты совладать с ним, не разрушив правильности проверки других номеров?
Также к чему обратные слэши ставишь перед любым символом в квадратных скобках? Они там не выполняют свои функции, меняют своё значение. Символ пробела надо указывать символом.
Воистину так, сука мля, ебаныврот.
Согласен, но если мы принимаем что
>'8 ( 495 ) 1 - 2 - 3 - 4 - 5 - 6 - 7'
правильный, то почему
>'8 911 415 (16) (13)'
нет? Да и я на подсказку ОПа ориентировался
>сначала идет +7 или 8, за ними ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов.
Но тем не менее я пофиксил(старая ссылка - актуальна) и сразу в догонку то-же только с заменой проверь, пожалуйста.
https://ideone.com/AG9xvk
Одно пофиксил, другое сломал.
У тебя там два некорректных номера прошло проверку.
Вот мое решение, а то я сам не решал еще.
http://ideone.com/b2tQKa
checkPhoneNumber - это с выебонами, скобки могут быть только у кода города (код 3-5 цифр), дефисы не могут соседствовать со скобками (кроме дефиса после закрывающей скобки, чтобы пройти тест ОПа)
checkPhoneNumberIRL - как будет в настоящем проекте, тесты ОПа тоже проходит. Разница в первой строке массива incorrectNumbers, добавленной мной.
Алсо, кто сможет прочитать мою регулярку - тот герой.
>+7-(812)-567-55-67 неверный кафир
>+7-(812)1234567 неверный кафир
С какого такого перепугу? Это верные номера.
Забыл четвертую букву к.
Не экранируй пробелы.
Алсо, вместо пробела можно использовать символьный класс \s - любой пробельный символ (почти любой).
Алсо-2. Здесь тебе не нужна группировка в скобках - [дД] идентично (д|Д) для одного символа. Но здесь уже обязательно надо поставить модификатор u - utf-8.
Алсо-3. Если ты группируешь что-то в скобках, но запоминать результат тебе не нужно - пиши так: (?:раз|два). ?: - не делать ссылку, не запоминать эту группировку.
>>670728
А для меня - нет.
Это я их туда добавил. У ОПа в тестах их не было.
Энивей, базара нет - http://ideone.com/7xEGiD
>4ая к
Нет, англ к выглядит по другому поэтому я её и не писал, наказал так сказать.
>Алсо-3
Не понил если честно.
Все, что группируется в круглых скобках, автомат регулярных выражений запоминает. Ты можешь потом использовать ссылку на этот результат в этой же регулярке или в строке для замены.
Например, /<(div|span)>.*?</\1>/ найдет только <div></div> или <span></span>, но не <div></span>. \1 - ссылка на первую сохраненную группу.
Если тебе не надо ничего сохранять - ты ставишь ?: после скобки. Так экономится память, а также не засирается итоговый массив с результатами, например.
Спасибо
Посоны, каким-то блядь расчудесным образом надо вникнуть в jquery и научиться хуярить в бутстрапе за месяц.
Есть где-нибудь такая хуйня, чтоб я прочитал и охуел от пиздатости материала?
На codeacademy пробани для начала, вдруг охуеешь. Не от пиздатости, так от чего другого.
Да, нормально. Учитывая гомоеблю с разной поддержкой стандарта в разных браузерах
Точно так же все и будет, твои навыки будут развиваться если ты будешь прикладывать усилия. Только вот работа и хобби это разные вещи, представь например что тебе надо каждый день по 8 часов играть одни и те же песни. Ну, никто и не обещал что будет легко.
> а я не хочу утром вставать и идти выполнять приказы левых людей.
Это никого не волнует. Не хочешь выполнять приказы - сиди дома гордый и свободный, питайся дошираком. Впрочем, мир на программировании клином не сошелся - есть и другие коммерчески востребованные навыки, но в любом случае быстро ты их не освоишь. А работа не требующая особых навыков, обычно плохо оплачивается и еще менее интересна чем программирование. Хочешь залезть повыше - докажи, что ты лучше других.
Ну и на гитаре каждый может научиться играть, а попробуй теперь клавиши освой.
Ну и вообще это тред про программирование, давайте ближе к теме держаться.
>>670312
Метод в классе TableGateway возвращает отсортированный массив комментариев. Шаблон приходится по ним циклом и выводит.
Вообще тут есть 2 варианта прелставления:
- плоский список: верстка такого списка будет представлять собой просто список дивов, у которых отступ слева пропорционален глубине комментария. При этом древовидная структура не отражена в HTML коде - в коде это просто идущий последовательно список дивов
- дерево: каждый комментарий содержит список своих детей, те содержат списки своих детей и тд. Вывод дерева делается рекурсивной функцией, а верстка отражает структуру дерева: дочерние комментарии в HTML находятся внутри родительских.
Второй способ семантичнее и имеет некоторые преимущества (скрыв один див можно скрыть комментарий со всеми потомками), но первый намного проще в реализации и предпочтительнее тут.
Я думаю, тебе надо больше изучать и практиковаться со структурами данных и рекурсией, ты их плохо знаешь. Для этого можно попросить у меня задачи, и одну я придумаю сразу.
Для решения этой задачи надо изучить что такое деревья. Почитай про них в википедии или где-то еще, изучи термины (корень, ребенок, потомок, предок, родитель, брат), изучи алгоритмы обхода дерева (в ширину, в глубину), оценки их сложности. Реши задачу:
Есть некое дерево. Реализуй это дерево средствами ООП. Узел дерева должен быть представлен объектом, поддерживающим такие методы:
- определение числа непосредственных детей
- определение общего числа потомков
- определение является ли узел корнем дерева
- определение глубины узла от корня дерева
- получение списка детей
- получение родителя
- добавление, удаление ребенка
- проверка, является ли данный узел потомком другого, проверка, является ли он его предком
- получение следующего и предыдущего брата (брат = узел имеющий того же родителя)
- перенос узла, чтобы он был N-м по очереди среди братьев
- перенос узла со всем содержимым к другому родителю
Сделав это дерево, реализуй на нем дерево кателога товаров. Сделай его вывод в таком виде, указывая в скобках число категорий-потомков:
Бытовая техника (5)
....утюги
....пылесосы
....телевизоры (3)
........LCD телевизоры
И еще там выше пишут про задачу "перевернуть бинарное дерево". Реши ее, сделав класс для бинарного дерева. "перевернуть бинарное дерево" значит поменять местами всех левых и правых детей. Также, ответь, можно ли наследовать бинарное дерево от обычного? Обычное от бинарного? Почему?
Также, почитай в википедии про красно-черные деревья и зачем они нужны. Так как я добрый, то не буду предлагать тебе самому написать алгоритм балансировки двоичного дерева.
Вот кстати я помню, тут кто-то ныл что алгоритмы и структуры данных не нужно знать, задачки из раздела "повторим" не надо решать. Вот видишь, без этого у тебя сложности с выводом комментариев - вполне практической задачей. Так что давай изучать деревья.
>>670320
Повеселил. Вообще, аноны, подумайте чуть чуть своей головой. Если какая-то работа простая и любой может ее делать, на такую вакансию выстраивается очередь кандидатов, и работодатель может устроить среди них обратный аукцион (кто меньше попросит). Подумайте сами, какая будет зарплата и условия труда на работе не требующей никаких навыков. Вы точно хотите участвовать в таком аукционе?
>>670361
Сохранить логи и вывести на картинку с помощью какой-нибудь графической библиотеки.
Точно так же все и будет, твои навыки будут развиваться если ты будешь прикладывать усилия. Только вот работа и хобби это разные вещи, представь например что тебе надо каждый день по 8 часов играть одни и те же песни. Ну, никто и не обещал что будет легко.
> а я не хочу утром вставать и идти выполнять приказы левых людей.
Это никого не волнует. Не хочешь выполнять приказы - сиди дома гордый и свободный, питайся дошираком. Впрочем, мир на программировании клином не сошелся - есть и другие коммерчески востребованные навыки, но в любом случае быстро ты их не освоишь. А работа не требующая особых навыков, обычно плохо оплачивается и еще менее интересна чем программирование. Хочешь залезть повыше - докажи, что ты лучше других.
Ну и на гитаре каждый может научиться играть, а попробуй теперь клавиши освой.
Ну и вообще это тред про программирование, давайте ближе к теме держаться.
>>670312
Метод в классе TableGateway возвращает отсортированный массив комментариев. Шаблон приходится по ним циклом и выводит.
Вообще тут есть 2 варианта прелставления:
- плоский список: верстка такого списка будет представлять собой просто список дивов, у которых отступ слева пропорционален глубине комментария. При этом древовидная структура не отражена в HTML коде - в коде это просто идущий последовательно список дивов
- дерево: каждый комментарий содержит список своих детей, те содержат списки своих детей и тд. Вывод дерева делается рекурсивной функцией, а верстка отражает структуру дерева: дочерние комментарии в HTML находятся внутри родительских.
Второй способ семантичнее и имеет некоторые преимущества (скрыв один див можно скрыть комментарий со всеми потомками), но первый намного проще в реализации и предпочтительнее тут.
Я думаю, тебе надо больше изучать и практиковаться со структурами данных и рекурсией, ты их плохо знаешь. Для этого можно попросить у меня задачи, и одну я придумаю сразу.
Для решения этой задачи надо изучить что такое деревья. Почитай про них в википедии или где-то еще, изучи термины (корень, ребенок, потомок, предок, родитель, брат), изучи алгоритмы обхода дерева (в ширину, в глубину), оценки их сложности. Реши задачу:
Есть некое дерево. Реализуй это дерево средствами ООП. Узел дерева должен быть представлен объектом, поддерживающим такие методы:
- определение числа непосредственных детей
- определение общего числа потомков
- определение является ли узел корнем дерева
- определение глубины узла от корня дерева
- получение списка детей
- получение родителя
- добавление, удаление ребенка
- проверка, является ли данный узел потомком другого, проверка, является ли он его предком
- получение следующего и предыдущего брата (брат = узел имеющий того же родителя)
- перенос узла, чтобы он был N-м по очереди среди братьев
- перенос узла со всем содержимым к другому родителю
Сделав это дерево, реализуй на нем дерево кателога товаров. Сделай его вывод в таком виде, указывая в скобках число категорий-потомков:
Бытовая техника (5)
....утюги
....пылесосы
....телевизоры (3)
........LCD телевизоры
И еще там выше пишут про задачу "перевернуть бинарное дерево". Реши ее, сделав класс для бинарного дерева. "перевернуть бинарное дерево" значит поменять местами всех левых и правых детей. Также, ответь, можно ли наследовать бинарное дерево от обычного? Обычное от бинарного? Почему?
Также, почитай в википедии про красно-черные деревья и зачем они нужны. Так как я добрый, то не буду предлагать тебе самому написать алгоритм балансировки двоичного дерева.
Вот кстати я помню, тут кто-то ныл что алгоритмы и структуры данных не нужно знать, задачки из раздела "повторим" не надо решать. Вот видишь, без этого у тебя сложности с выводом комментариев - вполне практической задачей. Так что давай изучать деревья.
>>670320
Повеселил. Вообще, аноны, подумайте чуть чуть своей головой. Если какая-то работа простая и любой может ее делать, на такую вакансию выстраивается очередь кандидатов, и работодатель может устроить среди них обратный аукцион (кто меньше попросит). Подумайте сами, какая будет зарплата и условия труда на работе не требующей никаких навыков. Вы точно хотите участвовать в таком аукционе?
>>670361
Сохранить логи и вывести на картинку с помощью какой-нибудь графической библиотеки.
Вот ты тут пытаешься намекнуть что знание "теории" (алгоритмов и структур данных) не нужно в реальной работе и требуется только на собеседовании. Но вот выше анон не может разобраться с вполне реальной задаче - выводом комментариев. Значит, все-таки это знание нужно? Видимо нужно.
>>670467
Посмотри что пишет твоя программа:
> + 849512345678
Это неправильный номер - тут 12 цифр
> - 8 911 415 (16) (13)
А это правильный.
Надо исправить ошибки в регулярке. Сейчас там у тебя она состоит из 2 частей (в первой 3-4 цифры, во второй 6-7). Это неправильно так как ты не можешь гарантировать что после 8 будет ровно 10 цифр - у тебя их может быть от 9 до 11.
>>670655
> 8 911 415 (16) (13)
Это правильный номер.
>>670725
> Алсо, кто сможет прочитать мою регулярку - тот герой.
Это как раз неправильно. Вот смотри, твою регулярку не разобрать - а как проверить что она правильная? Тесты ведь не покрывают все возможные варианты (да и не должны). А если окажется что у тебя там баг - как его исправить, не сломав регулярку?
Код должен быть понятен без необходимости разбирать твою регулярку на кусочки и анализировать все возможные сочетания символов. Код в фукнции checkPhoneNumber потому надо переделать.
Если ты хочешь добавить дополнительные ограничения (например разрешить ставить скобки только в коде города и соблдать их баланс) - ты должен сделать это не переусложняя регулярку, а каким-то понятным кодом. Ну например как-то разбить номер на части (со скобками и без) и анализировать их.
Потому твой вариант регулярки - не годится.
Код в checkPhoneNumberIRL в общем годится после улучшения оформеления кода. str_replace я бы заменил на preg_match ради краткости, и вынес бы ее на отдельную строку.
Вывод результатов по моему сделан не очень удачно - трудно понять пройдены тесты или нет. Я бы сделал так:
(крестик или галочка показывающие правильно ли определен ответ) (номер) (текст результата проверки)
Тогда бросив взгляд на левый край можно увидеть все ли ок.
Вот ты тут пытаешься намекнуть что знание "теории" (алгоритмов и структур данных) не нужно в реальной работе и требуется только на собеседовании. Но вот выше анон не может разобраться с вполне реальной задаче - выводом комментариев. Значит, все-таки это знание нужно? Видимо нужно.
>>670467
Посмотри что пишет твоя программа:
> + 849512345678
Это неправильный номер - тут 12 цифр
> - 8 911 415 (16) (13)
А это правильный.
Надо исправить ошибки в регулярке. Сейчас там у тебя она состоит из 2 частей (в первой 3-4 цифры, во второй 6-7). Это неправильно так как ты не можешь гарантировать что после 8 будет ровно 10 цифр - у тебя их может быть от 9 до 11.
>>670655
> 8 911 415 (16) (13)
Это правильный номер.
>>670725
> Алсо, кто сможет прочитать мою регулярку - тот герой.
Это как раз неправильно. Вот смотри, твою регулярку не разобрать - а как проверить что она правильная? Тесты ведь не покрывают все возможные варианты (да и не должны). А если окажется что у тебя там баг - как его исправить, не сломав регулярку?
Код должен быть понятен без необходимости разбирать твою регулярку на кусочки и анализировать все возможные сочетания символов. Код в фукнции checkPhoneNumber потому надо переделать.
Если ты хочешь добавить дополнительные ограничения (например разрешить ставить скобки только в коде города и соблдать их баланс) - ты должен сделать это не переусложняя регулярку, а каким-то понятным кодом. Ну например как-то разбить номер на части (со скобками и без) и анализировать их.
Потому твой вариант регулярки - не годится.
Код в checkPhoneNumberIRL в общем годится после улучшения оформеления кода. str_replace я бы заменил на preg_match ради краткости, и вынес бы ее на отдельную строку.
Вывод результатов по моему сделан не очень удачно - трудно понять пройдены тесты или нет. Я бы сделал так:
(крестик или галочка показывающие правильно ли определен ответ) (номер) (текст результата проверки)
Тогда бросив взгляд на левый край можно увидеть все ли ок.
Модификатор u надо ставить всегда (конечно еще лучше было бы если PHP это делал сам - в PHP6 это должно было быть, но не осилили). А то потом люди приходят в тред и спрашивают почему у них регулярка не работает.
>>666493
Там ударения надо знать и учитывать произношение: например чёлен-волн или "и горний ангелов полет, и гад земных подземный ход" (я мог пару слов перепутать конечно, вряд ли в оригинале было земных и подземных рядом). У Маяковского по моему есть рифма "блюда" - "буду". А если брать более поздние произведения - там еще более сложные рифмы могут быть. Также, в стихах по моему допускается переставлять ударение ради рифмы. Если тут есть гуманитарий-куны, они наверно лучше знают.
>>670784
> ты ставишь ?: после скобки. Так экономится память, а также не засирается итоговый массив с результатами, например.
Но удлиняется и зашумляется регулярка, так что лучше все же не ставить без надобности.
>>670793
Бутстрап какое отношение имеет к jQuery? Это разные вещи. Алсо, то что тебе нужно выучить это JS/DOM, HTMl/CSS. В ОП посте есть задачи, но за месяц ты вряд ли справишься. Но это потому что верстка и яваскрипт не такие простые вещи как некоторым кажется.
>>670794
Кодеакадеми это ознакомительный уровень. Годится чтоб понять, хочешь ты это изучать или нет, но верстальщиком ты вряд ли хорошим станешь с их курсов.
>>670796
Возможно разработчики вконтакте не очень сильны в верстке. Возможно, там есть практические соображения - display: table и многие вещи из CSS2.1 и CSS3 не работают IE6, 7, 8, а они долгое время поддерживались.
В современных браузерах дивы можно заставить вести себя как таблицу с помощью display table, если требуется такая раскладка блоков.
Я могу сказать что старая страница гугла, которую он показывает не новым браузерам тоже сделана на таблицах.
Однако является ли факт использования таблиц гуглом и вконтакте причиной не изучать современные семантичные методы верстки? Наверно лучше всего знать и новые и старые подходы и уметь выбирать оптимальный.
Ну и помни что таблицы очень плохо дружат с адаптивностью. Таблицу из 3 колонок нельзя превратить в высокую тонкую ленту.
Модификатор u надо ставить всегда (конечно еще лучше было бы если PHP это делал сам - в PHP6 это должно было быть, но не осилили). А то потом люди приходят в тред и спрашивают почему у них регулярка не работает.
>>666493
Там ударения надо знать и учитывать произношение: например чёлен-волн или "и горний ангелов полет, и гад земных подземный ход" (я мог пару слов перепутать конечно, вряд ли в оригинале было земных и подземных рядом). У Маяковского по моему есть рифма "блюда" - "буду". А если брать более поздние произведения - там еще более сложные рифмы могут быть. Также, в стихах по моему допускается переставлять ударение ради рифмы. Если тут есть гуманитарий-куны, они наверно лучше знают.
>>670784
> ты ставишь ?: после скобки. Так экономится память, а также не засирается итоговый массив с результатами, например.
Но удлиняется и зашумляется регулярка, так что лучше все же не ставить без надобности.
>>670793
Бутстрап какое отношение имеет к jQuery? Это разные вещи. Алсо, то что тебе нужно выучить это JS/DOM, HTMl/CSS. В ОП посте есть задачи, но за месяц ты вряд ли справишься. Но это потому что верстка и яваскрипт не такие простые вещи как некоторым кажется.
>>670794
Кодеакадеми это ознакомительный уровень. Годится чтоб понять, хочешь ты это изучать или нет, но верстальщиком ты вряд ли хорошим станешь с их курсов.
>>670796
Возможно разработчики вконтакте не очень сильны в верстке. Возможно, там есть практические соображения - display: table и многие вещи из CSS2.1 и CSS3 не работают IE6, 7, 8, а они долгое время поддерживались.
В современных браузерах дивы можно заставить вести себя как таблицу с помощью display table, если требуется такая раскладка блоков.
Я могу сказать что старая страница гугла, которую он показывает не новым браузерам тоже сделана на таблицах.
Однако является ли факт использования таблиц гуглом и вконтакте причиной не изучать современные семантичные методы верстки? Наверно лучше всего знать и новые и старые подходы и уметь выбирать оптимальный.
Ну и помни что таблицы очень плохо дружат с адаптивностью. Таблицу из 3 колонок нельзя превратить в высокую тонкую ленту.
> Бутстрап какое отношение имеет к jQuery? Это разные вещи.
Библиотека js и фреймворк разные вещи? Серьёзно? Не ожидал.
> Алсо, то что тебе нужно выучить это JS/DOM, HTMl/CSS.
хтмл/ксс уже более-менее, нативный JS придется осиливать по пути.
В оп-посте дохуя задач на пхп, а мне кроме того, что это такое в общих чертах и как оно работает знать пока что не особенно нужно, ибо я тупо не успею выучить пхп за месяц.
Пока что думаю пройти курсы кодакадеми js, jqeury, потом с помощью аллаха связывать всю эту хуйню пока что где-нибудь в иде, далее уже конкретно изучать бутстрап, чтоб иметь общее представление и оттуда уже комплексно углубляться в less, js и дрочить ксс сколько успею.
Зачем нужна CNAME запись, если итак дохуя способов редиректа?
>твою регулярку не разобрать
Не разобрать регулярку e-mail из RFC.
Есть волшебный модификатор /x, который позволит записать это весьма удобно и понятно.
Например, так:
http://ideone.com/7xEGiD
>str_replace я бы заменил на preg_match
Вредные советы поехали. PCRE всегда медленнее любой строковой функции.
>>670860
>Модификатор u надо ставить всегда
Григорий Остер, вам пора залогиниться.
Пикрелейтед, специально для вас.
Совет: если вы понимаете, что вы делаете (только если понимаете), - не используйте модификатор u. Грубо говоря, он нужен лишь тогда, когда:
- в символьном классе вы используете не-ASCII символы,
- когда вам важно заматчить именно символ, который выходит за рамки ASCII.
Проще говоря, в выражении типа #<title>(.+?)</title># модификатор u не нужен. Вам не важны символы внутри title, вам важен сам текст, набор байтов.
А вот в выражении #<title>[^>]+</title>#u модификатор нужен, так как [^>] может наткнуться на байт, который является частью другого символа, но сам по себе равен >.
Нововкатившийся, если тебе непонятно, что тут написано - забей. Это немного запутанная магия.
> домен куплен у оффициального селлера, перенаправлен на сторонний днс, а оттуда уже на нужный сайт? На офф-селлере NS запись, на стороннем - А?
Да. "Покупка домена" если я не путаю, значит что ты получаешь право указать NS для него. Покупка домена не подразумевает DNS-хостинг, хотя реселлеры могут предлагать такую услугу.
> Зачем нужна CNAME запись
Погугли:
> A Canonical Name record (abbreviated as CNAME record) is a type of resource record in the Domain Name System (DNS) used to specify that a domain name is an alias for another domain, the "canonical" domain. All information, including subdomains, IP addresses, etc., are defined by the canonical domain.
> This can prove convenient when running multiple services (like an FTP server and a webserver; each running on different ports) from a single IP address. One can, for example, point ftp.example.com and www.example.com to the DNS A record for example.com, which in turn points to the IP-address. Then, if the IP-address ever changes, one only has to record the change in one place within the network: in the DNS A record.
> CNAME records must always point to another domain name, never directly to an IP-address.
Чтобы упростить конфигурирование когда у сервера много имен, как я понял. Если меняется IP достаточно поменять одну запись. Плюс, ты фиксируешь что этот домен является синонимом другого.
> если итак дохуя способов редиректа?
Интернет не ограничивается протоколом HTTP, а в других протоколах редиректов нет. Правда, можно прописать дляобоих доменов один и тот же IP.
Также, редирект и алиасы - разная вещь. В первом случае у тебя один сервер редиректит на другой, во втором у тебя один и тот же контент доступен на 2 доменах (что обычно плохо).
Ну и такие вещи лучше проверять на практике. Бери линукс и утилиту dig (если нет то поищи онлайн утилиты), и делай например такой запрос:
....
продолжение поста: http://pastebin.ru/gLpkVrdP
И еще про точку в конце адреса. Она значит что имя домена окончательное. Без нее в случае неудачи клиент будет приписывать к нему "суффикс DNS" который задается в настройках сетевого интерфейса. То есть если в настройках прописан домен example.com и ты пытаешься разрешить имя server то сначала он будет искать домен server., а при неудаче - server.example.com.
Точка позволяет отключить этот механизм.
> домен куплен у оффициального селлера, перенаправлен на сторонний днс, а оттуда уже на нужный сайт? На офф-селлере NS запись, на стороннем - А?
Да. "Покупка домена" если я не путаю, значит что ты получаешь право указать NS для него. Покупка домена не подразумевает DNS-хостинг, хотя реселлеры могут предлагать такую услугу.
> Зачем нужна CNAME запись
Погугли:
> A Canonical Name record (abbreviated as CNAME record) is a type of resource record in the Domain Name System (DNS) used to specify that a domain name is an alias for another domain, the "canonical" domain. All information, including subdomains, IP addresses, etc., are defined by the canonical domain.
> This can prove convenient when running multiple services (like an FTP server and a webserver; each running on different ports) from a single IP address. One can, for example, point ftp.example.com and www.example.com to the DNS A record for example.com, which in turn points to the IP-address. Then, if the IP-address ever changes, one only has to record the change in one place within the network: in the DNS A record.
> CNAME records must always point to another domain name, never directly to an IP-address.
Чтобы упростить конфигурирование когда у сервера много имен, как я понял. Если меняется IP достаточно поменять одну запись. Плюс, ты фиксируешь что этот домен является синонимом другого.
> если итак дохуя способов редиректа?
Интернет не ограничивается протоколом HTTP, а в других протоколах редиректов нет. Правда, можно прописать дляобоих доменов один и тот же IP.
Также, редирект и алиасы - разная вещь. В первом случае у тебя один сервер редиректит на другой, во втором у тебя один и тот же контент доступен на 2 доменах (что обычно плохо).
Ну и такие вещи лучше проверять на практике. Бери линукс и утилиту dig (если нет то поищи онлайн утилиты), и делай например такой запрос:
....
продолжение поста: http://pastebin.ru/gLpkVrdP
И еще про точку в конце адреса. Она значит что имя домена окончательное. Без нее в случае неудачи клиент будет приписывать к нему "суффикс DNS" который задается в настройках сетевого интерфейса. То есть если в настройках прописан домен example.com и ты пытаешься разрешить имя server то сначала он будет искать домен server., а при неудаче - server.example.com.
Точка позволяет отключить этот механизм.
> PCRE всегда медленнее любой строковой функции.
как насчет пруфов? как работает pcre внутри?
> Пикрелейтед, специально для вас.
разница с/без u = 20 микросекунд против 14? То есть ради 6 микросекунд ты предлагаешь исплоьзовать не-юникодный режим в котором сам черт ногу сломит и с которым разработчик будет тратить часы на поиски ответа "почему регулярка странно работает"? А вредные советы даю я?
Тебе бы не помешало вместо изучения всяких си и ассемблеров немного почитать про экономику, менджмент там.
Что касается 206 микросекунд при добавлении флага i - я думаю, такую проблему надо решать оптимизацией этого случая в pcre. А не превращением кода в нечитаемое месиво из скобочек.
А как насчет такого выражения:
/кот+собака/
Оно сработает без модификатора u? А такое:
/кот\b/
А как насчет такого?
/кот/i
Твои советы это закладывание мин в код, ждущих новичка. Может это хорошая идея если ты увольняешься и хочешь насолить злодеям не признающим гения.
> Есть волшебный модификатор /x, который позволит записать это весьма удобно и понятно.
> Например, так:
Комментарии это хорошо, но понятный без них код лучше. Ну и поддерживать выражение будет не очень удобно. Вот например это:
> (?(1)
Имеет тот недостаток что при добавлении новых скобок нумерация меняется.
В данном случае правильнее вынести часть проверки из регулярки в код. А такие регулярки пишут те, кто хочет похвастаться что они прочитали мануал по pcre. Но подумай сам:
а что если в команде с тобой окажется такой умник, который прочел мануал по какой-то другой библиотеке которую ты плохо знаешь, тебе понравится разбирать то что он там зашифровал? Я думаю, гораздо приятнее работать с человеком который пишет простой код, а рабочее время тратит на решение рабочих задач а не чтение мануалов.
Ну и я регулярки и посложнее видел: https://habrahabr.ru/post/171667/
Вдохновленный этой статьей, я тоже пытался сделать парсер чего-то, не помню уже чего, помню только что потратил много времени, скачал отдельно утилиту из pcre для отладки регулярки, но она в итоге так и не заработала - н езнаю, из-за моей ошибки или бага в pcre.
>>670963
Их и не надо писать. Их пишут только неграмотные авторы не понимающие как работают исключения. Исключения автоматически сами вылетают наверх. Они как раз и придуманы чтобы не надо было результат каждой функции проверять на ошибку.
> PCRE всегда медленнее любой строковой функции.
как насчет пруфов? как работает pcre внутри?
> Пикрелейтед, специально для вас.
разница с/без u = 20 микросекунд против 14? То есть ради 6 микросекунд ты предлагаешь исплоьзовать не-юникодный режим в котором сам черт ногу сломит и с которым разработчик будет тратить часы на поиски ответа "почему регулярка странно работает"? А вредные советы даю я?
Тебе бы не помешало вместо изучения всяких си и ассемблеров немного почитать про экономику, менджмент там.
Что касается 206 микросекунд при добавлении флага i - я думаю, такую проблему надо решать оптимизацией этого случая в pcre. А не превращением кода в нечитаемое месиво из скобочек.
А как насчет такого выражения:
/кот+собака/
Оно сработает без модификатора u? А такое:
/кот\b/
А как насчет такого?
/кот/i
Твои советы это закладывание мин в код, ждущих новичка. Может это хорошая идея если ты увольняешься и хочешь насолить злодеям не признающим гения.
> Есть волшебный модификатор /x, который позволит записать это весьма удобно и понятно.
> Например, так:
Комментарии это хорошо, но понятный без них код лучше. Ну и поддерживать выражение будет не очень удобно. Вот например это:
> (?(1)
Имеет тот недостаток что при добавлении новых скобок нумерация меняется.
В данном случае правильнее вынести часть проверки из регулярки в код. А такие регулярки пишут те, кто хочет похвастаться что они прочитали мануал по pcre. Но подумай сам:
а что если в команде с тобой окажется такой умник, который прочел мануал по какой-то другой библиотеке которую ты плохо знаешь, тебе понравится разбирать то что он там зашифровал? Я думаю, гораздо приятнее работать с человеком который пишет простой код, а рабочее время тратит на решение рабочих задач а не чтение мануалов.
Ну и я регулярки и посложнее видел: https://habrahabr.ru/post/171667/
Вдохновленный этой статьей, я тоже пытался сделать парсер чего-то, не помню уже чего, помню только что потратил много времени, скачал отдельно утилиту из pcre для отладки регулярки, но она в итоге так и не заработала - н езнаю, из-за моей ошибки или бага в pcre.
>>670963
Их и не надо писать. Их пишут только неграмотные авторы не понимающие как работают исключения. Исключения автоматически сами вылетают наверх. Они как раз и придуманы чтобы не надо было результат каждой функции проверять на ошибку.
Насчет замены str_replace на регулярку - я исходил из того что она будет компактнее и позволяет писать более сложное выражение. Разумеется, это не обязательно, и str_replace тут тоже годится. Насчет производительности - не уверен так как не помню как именно работает pcre, а лезть в документацию лень.
tusend tak
>как насчет пруфов?
Пикрелейтед.
preg_replace в 5,5 раз медленнее str_replace.
>как работает pcre внутри?
Например, хотя бы парсит шаблон, чего не делает str_replace.
>разница с/без u = 20 микросекунд против 14? То есть ради 6 микросекунд
В программировании нет микросекунд, есть производительность, возрастающая или падающая в разы. Если производительность падает в 1,5 раза, это значит, тебе нужно 4 сервера, а не 3. На те же объемы работы.
Действительно, мне стоит почитать про экономику и менеджмент.
> /кот+собака/
> /кот\b/
> /кот/i
Не сработает ни одно.
>Твои советы это закладывание мин в код, ждущих новичка.
>новичка
>если вы понимаете, что вы делаете (только если понимаете), - не используйте модификатор u
Тем не менее, новичку это тоже полезно узнать. В школе никто не учит, что зыбиться и зиждиться - глаголы первого спряжения, однако, узнать об этом как минимум интересно, думаю, ты со мной согласишься.
Я не призываю ньюфага использовать столь хардкорные оптимизации. Просто неплохо бы знать - u может в разы замедлить регулярное выражение, что и есть ответ на твой вопрос, почему же php не ставит этот модификатор автоматически.
>А вот в выражении #<title>[^>]+</title>#u модификатор нужен, так как [^>] может наткнуться на байт, который является частью другого символа, но сам по себе равен >.
Кстати, я обосрался, в чем спешу признаться. utf-8 устроен так, что у любого байта не-ASCII символа старший бит - 1. У ASCII - 0.
Приведенная мной ситуация невозможна.
>public function getNextSibling(){
>$parent = $this->parentNode;
>$previous = NULL;
>foreach ($parent->getChildNodes() as $child) {
>getPreviousSibling
Что будет, если $this->parentNode = null?
> public function __construct($nodeName,$parent = NULL){
> $this->nodeName = $nodeName;
> $this->parentNode = $parent;
> }
> public function moveNode($parent){
> $this->parentNode->removeChild($this->nodeName);
> $this->parentNode = $parent;
> $this->parentNode->addChild($this);
> }
Не кажется ли тебе, что назнание родителя - неотъемлемое действие для метода addChild?
Не кажется ли тебе, что свойство parent в конструкторе - лишнее, а его должен задавать родитель в методе addChild?
> Если производительность падает в 1,5 раза, это значит, тебе нужно 4 сервера, а не 3. На те же объемы работы.
Только если основная функция твоего приложения это обработка текста регуляркой.
> Просто неплохо бы знать - u может в разы замедлить регулярное выражение, что и есть ответ на твой вопрос, почему же php не ставит этот модификатор автоматически.
Не поэтому, а потому что PHP "агностичен" по отношению к кодировкам, что в итоге приводит к куче неудобств и сложностей для новичков. Потому что для человека строка это цепочка символов, а не байт, и потому что когда человек хочет найти букву а с двумя точками, он хочет найти ее как бы она не была закодирована.
Ну и если подумать, в большинстве случаев нам нужны не только ascii. Мы ведь не в США живем.
У него parent сделан опциональным, его можно не указывать, но мне тоже больше нравится идея разделить создание узла и прикрепление его к родителю.
>Потому что для человека строка это цепочка символов, а не байт
А для программиста это должны быть байты.
>когда человек хочет найти букву а с двумя точками, он хочет найти ее как бы она не была закодирована
Это извечная борьба высокоуровневости с низкоуровневостью.
Хочешь меньше думать? Готовься выложить больше процессорного времени и памяти.
Я согласен с тем, что для такого простого языка, как PHP, мудрености с модификаторами - это лишнее. Но в то же время, не давай PHP спуститься на уровень ниже, это был бы громоздкий фреймворк для лоу-лоада (имплаинг, что php может в хайлоад).
Так ведь когда мы создаем объект, он так и так не имеет родителя.
Корректно добавлять объекту родителя лишь через метод addChild родителя.
А нужно ли имя? Если делать абстрактное дерево то оно должно быть просто абстрактным деревом, от которого наследуется уже например класс "дерево категорий"
С другой стороны, с именем проще отлаживать код конечно.
> public function addChild(TreeElement $child){
Нет проверки не является ли добавляемый элемент частью этого или другого дерева
> public function removeChild($node){
> if($child == $node){
Почитай про разницу == и === для объектов. == не ищет тот же самый объект, а лишь похожий на него.
> public function setChildNodes($newNodes){
Не выставляются корректные значения parent для старых и новых детей
> public function isDescendant($node){
> if($node->findDescendant($this->nodeName)){
Ты опираешься на предположение что у узлов есть имена и они уникальны. Это не так. Идентичностью объекта является сам объект.
> public function getNextSibling(){
> $parent = $this->parentNode;
А если там null?
> for($i = 0; $i<count($parent->getChildNodes()); $i++){
> if($n===$i){
> $newArray[] = $this;
Сложновато.А нельзя ли использовать array_splice? Аналогично, в удалении можно использовать array_search.
> public function moveNode($parent){
> $this->parentNode->removeChild($this->nodeName);
А если parentNode = NULL?
> public function displayAsCatalog(){
Это не должно быть в классе дерева. Дерево лишь хранит информацию, а не выводит.
А нужно ли имя? Если делать абстрактное дерево то оно должно быть просто абстрактным деревом, от которого наследуется уже например класс "дерево категорий"
С другой стороны, с именем проще отлаживать код конечно.
> public function addChild(TreeElement $child){
Нет проверки не является ли добавляемый элемент частью этого или другого дерева
> public function removeChild($node){
> if($child == $node){
Почитай про разницу == и === для объектов. == не ищет тот же самый объект, а лишь похожий на него.
> public function setChildNodes($newNodes){
Не выставляются корректные значения parent для старых и новых детей
> public function isDescendant($node){
> if($node->findDescendant($this->nodeName)){
Ты опираешься на предположение что у узлов есть имена и они уникальны. Это не так. Идентичностью объекта является сам объект.
> public function getNextSibling(){
> $parent = $this->parentNode;
А если там null?
> for($i = 0; $i<count($parent->getChildNodes()); $i++){
> if($n===$i){
> $newArray[] = $this;
Сложновато.А нельзя ли использовать array_splice? Аналогично, в удалении можно использовать array_search.
> public function moveNode($parent){
> $this->parentNode->removeChild($this->nodeName);
А если parentNode = NULL?
> public function displayAsCatalog(){
Это не должно быть в классе дерева. Дерево лишь хранит информацию, а не выводит.
>Не выставляются корректные значения parent для старых и новых детей
Не понял. Свойства у детей не меняются, они только меняют свой порядок в массиве.
>Сложновато.А нельзя ли использовать array_splice?
Хотел сначала так сделать, но потом перестал понимать что вообще происходит и переписал без него. В пхп не хватает джаваскриптовского сплайса, чтобы просто засунуть нужный элемент в середину массива.
Функция setChildNodes позволяет ведь в нее любые объекты передать, не обязательно детей того же родителя. И она публичная, а из названия следует что она позволяет заменить всех детей на узлы из переданного массива.
> Хотел сначала так сделать, но потом перестал понимать что вообще происходит и переписал без него. В пхп не хватает джаваскриптовского сплайса, чтобы просто засунуть нужный элемент в середину массива.
Вообще-то есть. Надо разобраться в этой функции, почитай мануал.
http://ideone.com/Nt2kce
Ага, переменные можно вообще не инициализировать, а объявлять непосредственно по ходу кода, но за такую хуйню тебе твои коллеги голову оторвут.
Копипаста много.
И должно быть так:
> слово1 слово2 слово3
> слово1 слово2 слово3
> Я слово4 слово5
А не так, как у тебя - под каждое слово своя переменная..
Чтобы добиться верного решения, можно пропустить всё через цикл.
Первые два раза выводится строка "слово1 слово2 слово3", а во время третьего прохождения цикла выводится строка "Я слово4 слово5" и цикл обрывается.
Цикл с $i, делает три круга. В первом и втором круге изменяются randomText1, $randomText2, $randomText3 и выводится echo "$randomText1 $randomText2 $randomText3\n";. А в третьем круге выводится echo "Я $randomText4 $randomText5.\n"; (а изменяться они могли и раньше, допустим).
$this указывает на текущий объект, а self на текущий класс.
>Их и не надо писать. Их пишут только неграмотные авторы не понимающие как работают исключения. Исключения автоматически сами вылетают наверх. Они как раз и придуманы чтобы не надо было результат каждой функции проверять на ошибку.
У ОПа приведены две ссылки на изучение PDO - официальный мануал и статья на хабре. В обоих сказано, что необходимо писать всегда трай-кеч.
Почти две недели постепенно делаю задачи ОПа, осталось две штуки, а ещё вот отсюда: https://dash.generalassemb.ly - сделал три больших урока (все эти шаблоны и робота на CSS+jQuery, который чому-то не заработал).
Так-то интересно, вникаю, но как-то жалко времени именно на это, чувствую, что не так это всё важно лично для меня.
Скорее бы уже к ООП перейти, шаловливые ручонки трясутся и так и чешутся.
https://ideone.com/qTl9u2
ОП хотел, чтобы я запилил функцию, которая будет висеть в коде отдельно. Я понимаю, что в каком-то более серьезном коде нужно будет такие часто используемые функции выводить в одну отдельную, но в такой чисто академической задачке не считается ли моветоном мой метод решения? Или все же нужно именно с пеленок себя приучать к такому стилю?
Имею ввиду функцию, которая делает первую букву большой, заглавной.
>в этом задании нельзя использовать свойство overflow и position
Да едрить же твою мать...........
display: inline-block - сразу нахожу ответ, стоит только гряяяязно выругаться.
>materialized path
Сколько времени ты потратил, что перенести огромную смердящую кучу наваленных друг на друга небольших пакетиков с говном из mysql на mongodb?
Ccылка на переменную (как и сама переменная) не читается в двойных кавычках. Чтобы ее прочитал эхо, переменную нужно взять в фигурные скобки.
Ой, что-то я попутал. Естественно, в одинарных кавычках не читаются переменные. Просто некоторые люди любят писать в одинарных, и для этого придумали фигурные скобки в эхе.
Здесь они не обязательны.
Вот здесь есть про разные варианты подстановки переменных в строки:
http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
Нет. В одинарных не происходит подстановки переменных (и escape-последовательности выводятся как есть)
php > $a = "test";
php > echo '$a';
$a
php > echo '{$a}';
{$a}
Ну тогда я понятия не имею.
Тебе вроде бы уже ответили, нет? Десктоп на пыхе писать - долбоебизм, имхо.
Если тебе что-то очень хочется написать, то учи что-нибудь другое. У тебя времени нет что-то новое учить? Или ты просто неосилятор?
Чому не запилят? Такой распространённый язык - и нет интерпретатора.
Тебе же сказали в прошлом треде - вбей несколько известных значений и интерполируй линией.
Путаешь меня с другим аноном. Не я тут один решаю список студентов. Можешь подробней объяснить?
Алсо я конечно могу покопаться в том треде, но боюсь заспойлерю себе многие моменты из правильного решения.
> например - ничего не происходит, потому что данный емэйл существует, я так понял.
У тебя не выводятся причины ошибок? Тогда тебе надо разобраться с этим.
https://www.youtube.com/watch?v=R-yQux1S63w
Вроде даже новичкам понятно.
Фоном послушай, специально не трать время.
Для начала должно быть нормально.
Отключить можно - гугли атрибут autocomplete. А что если юзер не будет ничего выбирать, а руками введет вариант? Ты бы мог просто использовать не кривую самоделку, а специально написанный виджет вроде chosen или select2. Если
Не дописал. То что тебе нужно - не инпут с автокомплитом (как у тебя), а селект с фильтром. Выкинь свою кривую поделку и прикрути нормальный виджет.
Спасибо, я предложил заказчку перепилить всё в селекты с фильтрацией но сказали что и так норм и нет объективных причин якобы, хотя я вижу что селект бы решил объективно все частные моменты для которых я изобретал и ещё буду изобретать велосипеды.
как костыль можно попробовать сделать дополнительные проверки вроде того, что если юзер ввел текст и покинул инпут не выбрав вариант то искать этот текст в имеющемся списке - но это может работать не очень надежно. Ну и тогда надо сделать индикацию, того что город успешно выбран или что такого города в базе нет.
Главная проблема которая у тебя сейчас - как я понимаю, отствие обратной связи, то есть пользователь не видит скрытое поле с id, и не понимает реальное состояние программы - какой город там выбран. И то что написанный в инпуте текст может отличаться от выбранного города в скрытом поле.
>>672319
Главная проблема в том, что события типа отображение двух других инпутов с автокомплитом которые скрыты по умолчанию, привязаны к автокомплиту: при селекте показывает следующее окно, записывает в сессию выбор и тл, просто тупой юзвер может ввести руками до конца и сидеть тупить, или ввести с ошибками - если не будет лень допишу потом валидацию поля при нажатии enter/tab и отображении следующего поля,
> что события типа отображение двух других инпутов с автокомплитом которые скрыты по умолчанию, привязаны к автокомплиту:
значит это была не лучшая идея
> просто тупой юзвер может ввести руками до конца и сидеть тупить
Это не пользователь тупой, а программист тупой
> потом валидацию поля при нажатии enter/tab
Там есть событие потери фокуса. Лучше изучить теорию прежде чем браться за практику.
Бамп вопросу. Я вот-вот напишу самый уродливый велосипед в своей жизни, если не узнаю ответ.
У ОПа пинг иногда и 5 дней может быть.
пох, а друг тут бамплимит в косарь.
slack, jabber, skype конфа изучающих есть какая нибудь?
на канале пхп в 2chpr.slack.com тухло
Нет, мы нормальные люди а не пидорасы какие-нибудь.
В общем верно, но если ввести число больше чем число городов, вылетает с ошибкой Uncaught TypeError: Cannot read property 'country' of undefined
>>665327
> $answers["$random"]
Хотя ошибки тут нет, но писать кавычки тут не надо так как они лишние.
>>665338
> почему random лишь один раз рандомит и остаётся таким навсегда,
Потому что ты сохраняешь в переменную значение, а не превращаешь ее в генератор случайных чисел. Чтобы получить новое случайное число надо вызвать функцию mt_rand() еще раз.
> {$randomText1 = $word1[$randomWord1];
Скобка тут лишняя. Она ничего не делает, значит ее тут не должно быть.
Также, в массиве не обязательно писать все индексы, достаточно первого:
1 => ...,
....,
....
А то у тебя если менять массивы надо руками индексы пересчитывать.
Ну и да, код можно было бы чуть сократить, использовав цикл для первых 2 строк, так как они генерируются по одному и тому же принципу.
>>665358
> ведь нельзя было делать такие штуки
> 1 => 'блабла',
Делать-то можно, но наверно проще не указывть индексы, а использовать автоматически проставленные с нуля.
В общем верно, но если ввести число больше чем число городов, вылетает с ошибкой Uncaught TypeError: Cannot read property 'country' of undefined
>>665327
> $answers["$random"]
Хотя ошибки тут нет, но писать кавычки тут не надо так как они лишние.
>>665338
> почему random лишь один раз рандомит и остаётся таким навсегда,
Потому что ты сохраняешь в переменную значение, а не превращаешь ее в генератор случайных чисел. Чтобы получить новое случайное число надо вызвать функцию mt_rand() еще раз.
> {$randomText1 = $word1[$randomWord1];
Скобка тут лишняя. Она ничего не делает, значит ее тут не должно быть.
Также, в массиве не обязательно писать все индексы, достаточно первого:
1 => ...,
....,
....
А то у тебя если менять массивы надо руками индексы пересчитывать.
Ну и да, код можно было бы чуть сократить, использовав цикл для первых 2 строк, так как они генерируются по одному и тому же принципу.
>>665358
> ведь нельзя было делать такие штуки
> 1 => 'блабла',
Делать-то можно, но наверно проще не указывть индексы, а использовать автоматически проставленные с нуля.
Верно
Верно
правильно
> W4.1 https://ideone.com/Yikc7R
Не учтен случай когда число очков одинаковое, а числа на кубиках разные, должна быть ничья: https://ideone.com/N9JmkW
> W4.2 https://ideone.com/gipbSX
Тут все верно
> W5.1 https://ideone.com/MwfLmz
Ответ неправильный, должно получиться 61270. Код также запутанный, например код в ифе зачем-то повторяет код который написан перед ифом.
> W5.2 https://ideone.com/cVgjxu
Ответ вроде будет 49 лет, а не 50. Также, зачем там второй раз $y++? Также, зачем делать переменную $y если у нас уже есть счетчик в цикле $i?
> if ($sum > 1000000) {
А если ровно миллион?
> W5.3 https://ideone.com/iFv71d
Верно
> W5.4 https://ideone.com/jMJLFM
тут тоже верно
> W5.5 https://ideone.com/kVp3j3
Правильно
> W5.6 https://ideone.com/QcFU0m
> $random = mt_rand(1, count($letters));
> $randomText = $letters[$random];
Ошибка, в массиве индексы начинаются с нуля, а не единицы
> W5.7 https://ideone.com/Eh48abC
Ссылка не открывается
>>666128
> if ($creditSum < $payout) {
Это кстати можно заменить на min/max
А так, верно
>>666473
Оп тоже виноват, забыл что в школе абсолютное значение числа называют "модуль".
>>666479
Он прав, возьмешь кредит и не сможешь понять сколько ты переплатишь.
Верно
Верно
правильно
> W4.1 https://ideone.com/Yikc7R
Не учтен случай когда число очков одинаковое, а числа на кубиках разные, должна быть ничья: https://ideone.com/N9JmkW
> W4.2 https://ideone.com/gipbSX
Тут все верно
> W5.1 https://ideone.com/MwfLmz
Ответ неправильный, должно получиться 61270. Код также запутанный, например код в ифе зачем-то повторяет код который написан перед ифом.
> W5.2 https://ideone.com/cVgjxu
Ответ вроде будет 49 лет, а не 50. Также, зачем там второй раз $y++? Также, зачем делать переменную $y если у нас уже есть счетчик в цикле $i?
> if ($sum > 1000000) {
А если ровно миллион?
> W5.3 https://ideone.com/iFv71d
Верно
> W5.4 https://ideone.com/jMJLFM
тут тоже верно
> W5.5 https://ideone.com/kVp3j3
Правильно
> W5.6 https://ideone.com/QcFU0m
> $random = mt_rand(1, count($letters));
> $randomText = $letters[$random];
Ошибка, в массиве индексы начинаются с нуля, а не единицы
> W5.7 https://ideone.com/Eh48abC
Ссылка не открывается
>>666128
> if ($creditSum < $payout) {
Это кстати можно заменить на min/max
А так, верно
>>666473
Оп тоже виноват, забыл что в школе абсолютное значение числа называют "модуль".
>>666479
Он прав, возьмешь кредит и не сможешь понять сколько ты переплатишь.
Чтобы понять почему медленно работает, изучай индексы в базе данных, ну и вообще разберись как выполняется запрос. EXPLAIN сделай. Из твоего кода понять как выглядит SQL запрос невозможно. Вот ты дал кусок кода от какого-то велосипеда, а как понять какой запрос он генерирует? Ты думаешь тут телепаты сидят?
> В sql не особо понимаю.
Это значит что ты не квалифицирован для той работы которой занимаешься. Изучай SQL пока тебя не выгнали.
И еще. Это не имеет отношения к сути вопроса, но вот этот вот код - это ад, и от него надо избавляться. Почитай что ли про Query Builder, посмотри фреймворки Юи 2 и Симфони 2. Увы, в нашей сфере многие не хотят учиться, а хотят сразу бежать что-то делать при том, что у них нет достаточноых знаний. Алсо, набор условий для поиска надо делать не массивом, а объектом-моделью.
> Общий запрос:
> $args['meta_query'][] = array(
> 'relation' => 'OR',
> array(
> 'key' => 'building_area_min',
>>666576
В случае с публичным полем оно доступно из любой точки кода. В случае с закрытым - только из одного класса. Меньше кода надо прочесть чтобы разобраться. Плюс, использование мтетодов нам поменять внутреннюю реализацию не меняя весь остальной код.
Ты всегда должен стараться ставить минимальную область доступности переменной. Может в некоторых случаях тебе вообще поле не нужно, а хватит обычной локальной переменной.
Ну и паста:
----
Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными и сами данные, а наружу выставляет методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, ему достаточно вызвать нужный метод чтобы получить результат.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название метода (и может быть комментарий к нему). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
Если проводить аналогии, то можно представить кофе-машину. Ты нажимаешь кнопку (=вызываешь публичный метод) и получаешь кофе (=результат вызова этого метода), при этом ты не видишь что происходит внутри нее и тебе не надо в этом разбираться.
----
Чтобы понять почему медленно работает, изучай индексы в базе данных, ну и вообще разберись как выполняется запрос. EXPLAIN сделай. Из твоего кода понять как выглядит SQL запрос невозможно. Вот ты дал кусок кода от какого-то велосипеда, а как понять какой запрос он генерирует? Ты думаешь тут телепаты сидят?
> В sql не особо понимаю.
Это значит что ты не квалифицирован для той работы которой занимаешься. Изучай SQL пока тебя не выгнали.
И еще. Это не имеет отношения к сути вопроса, но вот этот вот код - это ад, и от него надо избавляться. Почитай что ли про Query Builder, посмотри фреймворки Юи 2 и Симфони 2. Увы, в нашей сфере многие не хотят учиться, а хотят сразу бежать что-то делать при том, что у них нет достаточноых знаний. Алсо, набор условий для поиска надо делать не массивом, а объектом-моделью.
> Общий запрос:
> $args['meta_query'][] = array(
> 'relation' => 'OR',
> array(
> 'key' => 'building_area_min',
>>666576
В случае с публичным полем оно доступно из любой точки кода. В случае с закрытым - только из одного класса. Меньше кода надо прочесть чтобы разобраться. Плюс, использование мтетодов нам поменять внутреннюю реализацию не меняя весь остальной код.
Ты всегда должен стараться ставить минимальную область доступности переменной. Может в некоторых случаях тебе вообще поле не нужно, а хватит обычной локальной переменной.
Ну и паста:
----
Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными и сами данные, а наружу выставляет методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, ему достаточно вызвать нужный метод чтобы получить результат.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название метода (и может быть комментарий к нему). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
Если проводить аналогии, то можно представить кофе-машину. Ты нажимаешь кнопку (=вызываешь публичный метод) и получаешь кофе (=результат вызова этого метода), при этом ты не видишь что происходит внутри нее и тебе не надо в этом разбираться.
----
У тебя в коде тоже есть ошибки, смотри:
> if (!$this->no_u_cant)
> return $age;
А если нельзя, то что вернется? В чем смысл функции которая иногда вернет правильный результат, а иногда неправильный? Это получился неудачный пример. Лучше было бы сделать пример, где у нас сначала было поле $age и метод getAge() { return $this->age; }, а после мы решили вместо хранения возраста сделать поле $birthday и вычислять возраст из текущей даты и дня рождения. Благодаря инкапсуляции нам было достаточно лишь один класс, не трогая весь остальной код. А что если бы инкапсуляции не было? То-то.
> public function set_age($age) {
> if ($age >= 18 && $age <= 99 && !$this->no_u_cant)
> $this->age = $age;
Это тоже плохой пример. У тебя на вход функции дается неправильное значение и ты ничего не делаешь, а молча его игнорируешь. Отлично, а как программист узнает о том что он сделал ошибку? Если функции дают неправильные параметры, надо не молчать а выбрасывать исключение, иначе ошибку придется искать намного дольше.
>>666619
Магических методов лучше избегать. Они для всяких фреймворков и библиотек, а в обычном коде их использовать не надо. Явное лучше неявного - с магическими методами код разбирать гораздо дольше.
>>666625
Вряд ли бы я стал так специально делать. Может опечатался.
>>666655
Неудачный пример кода. strip_tags зачем-то внутри модели (зачем он вообще нужен? почему я не могу в тексте новости угловые скобки использовать?), какие-то сеттеры-геттеры. В твоем случае нужны нормальные сеттеры вместо switch.
Вообще не логично, ставишь в новость один текст, а там оказывается другой. Отлично, долго придется искать почему так происходит.
Я тут подумал и так и не смог вспомнить нормальные примеры с методами get/set. Может в каких-то очень абстрактных штуках, когда мы не знаем заранее какие поля у нас будут в объекте- ну например в базовом классе формы, от которого наследуются конкретные классы, мы можем сделать с помощью get доступными элементы формы:
$form = new LoginForm;
$form->login->setValue('Ivan');
....
И то я не уверен что это такой уж хороший пример - что мешает просто нормальные поля тут использовать?
То есть они нужны только для создания абстракций, когда мы заранее не знаем список полей. В обычном коде они почти никогда не нужны.
У тебя в коде тоже есть ошибки, смотри:
> if (!$this->no_u_cant)
> return $age;
А если нельзя, то что вернется? В чем смысл функции которая иногда вернет правильный результат, а иногда неправильный? Это получился неудачный пример. Лучше было бы сделать пример, где у нас сначала было поле $age и метод getAge() { return $this->age; }, а после мы решили вместо хранения возраста сделать поле $birthday и вычислять возраст из текущей даты и дня рождения. Благодаря инкапсуляции нам было достаточно лишь один класс, не трогая весь остальной код. А что если бы инкапсуляции не было? То-то.
> public function set_age($age) {
> if ($age >= 18 && $age <= 99 && !$this->no_u_cant)
> $this->age = $age;
Это тоже плохой пример. У тебя на вход функции дается неправильное значение и ты ничего не делаешь, а молча его игнорируешь. Отлично, а как программист узнает о том что он сделал ошибку? Если функции дают неправильные параметры, надо не молчать а выбрасывать исключение, иначе ошибку придется искать намного дольше.
>>666619
Магических методов лучше избегать. Они для всяких фреймворков и библиотек, а в обычном коде их использовать не надо. Явное лучше неявного - с магическими методами код разбирать гораздо дольше.
>>666625
Вряд ли бы я стал так специально делать. Может опечатался.
>>666655
Неудачный пример кода. strip_tags зачем-то внутри модели (зачем он вообще нужен? почему я не могу в тексте новости угловые скобки использовать?), какие-то сеттеры-геттеры. В твоем случае нужны нормальные сеттеры вместо switch.
Вообще не логично, ставишь в новость один текст, а там оказывается другой. Отлично, долго придется искать почему так происходит.
Я тут подумал и так и не смог вспомнить нормальные примеры с методами get/set. Может в каких-то очень абстрактных штуках, когда мы не знаем заранее какие поля у нас будут в объекте- ну например в базовом классе формы, от которого наследуются конкретные классы, мы можем сделать с помощью get доступными элементы формы:
$form = new LoginForm;
$form->login->setValue('Ivan');
....
И то я не уверен что это такой уж хороший пример - что мешает просто нормальные поля тут использовать?
То есть они нужны только для создания абстракций, когда мы заранее не знаем список полей. В обычном коде они почти никогда не нужны.
Неправда.
>>666744
Попросил бы у нас задачи. Алгоритмы и структуры данных надо изучать начиная с простых вещей, а не браться сразу за сложное.
>>666755
> W5.1 https://ideone.com/94782z
Хотя ответ верный, код дублируется. Одни и те же вещи написаны 2 раза. Почему бы не упростить его?
> W5.2 https://ideone.com/MCoNPH
> if ($sum > 1000000) {
А если равно? Алсо можно перенести условие в шапку цикла.
> W5.6 https://ideone.com/qhdVJ8
> $random = mt_rand(1, $massiveCount);
Неверно, нумерация с нуля начинается а не с единицы
> W5.7 https://ideone.com/Eh48ab
Хорошо сделано
> W5.8 https://ideone.com/WNN6jp
Хотя программа работает верно, ее можно было бы упростиь за счет цикла, убрав повторы
> W5.9 https://ideone.com/QNB4l9
> $length--;
Название неудачное. Если это длина строки, почему она уменьшается? Ну попробуй сам это прости: "уменьшить длину на один". Можно вообще убрать переменную и выислять позицию из значения $i
> if ($palindrome = false) {
Ты перепутал = и ==. У тебя всегда будет срабатывать else.
>>666779
Вот видишь какая у нас хорошая в стране система образования!
Неправда.
>>666744
Попросил бы у нас задачи. Алгоритмы и структуры данных надо изучать начиная с простых вещей, а не браться сразу за сложное.
>>666755
> W5.1 https://ideone.com/94782z
Хотя ответ верный, код дублируется. Одни и те же вещи написаны 2 раза. Почему бы не упростить его?
> W5.2 https://ideone.com/MCoNPH
> if ($sum > 1000000) {
А если равно? Алсо можно перенести условие в шапку цикла.
> W5.6 https://ideone.com/qhdVJ8
> $random = mt_rand(1, $massiveCount);
Неверно, нумерация с нуля начинается а не с единицы
> W5.7 https://ideone.com/Eh48ab
Хорошо сделано
> W5.8 https://ideone.com/WNN6jp
Хотя программа работает верно, ее можно было бы упростиь за счет цикла, убрав повторы
> W5.9 https://ideone.com/QNB4l9
> $length--;
Название неудачное. Если это длина строки, почему она уменьшается? Ну попробуй сам это прости: "уменьшить длину на один". Можно вообще убрать переменную и выислять позицию из значения $i
> if ($palindrome = false) {
Ты перепутал = и ==. У тебя всегда будет срабатывать else.
>>666779
Вот видишь какая у нас хорошая в стране система образования!
> function inclineWord($number) {
> function declensionMillion($millions) {
Это однотипная копипаста. Копипаста - зло. Надо сделать универсальную функцию склонения любых слов, работающую например так:
echo declense(4, '%d кот', '%d кота', 'аж %d котов', 'ни одного кота')
Универсальные функции почти всегда лучше и дают более чистый код. Так как мы разделяем сущности и отделяем выбор формы слова от списка самих слов.
Более того, ты при копипасте забыл дописать проверку на 11-19 для тысяч и миллионов, я же говорю что копипаст зло и ведет к ошибкам.
> if($number%100 <= 20){
Это условие проще переписать как "если число заканчивается на 11-19 то вернуть нужную форму слова"
> if(isset($spelling[$number])){
А стоит ли это выносить как особый случай?
> fmod(floor($number/1000), 1000);
Можно использовать знак процента для получения остатка
> trim(preg_replace('/\s{2,}/u',
Чтобы не мучаться с пробелами, лучше сделать массив в который складвать слова, а в конце объединить его в строку.
>>666855
Да, при условии что это utf-8 (то есть только с ней, а не с UTF-16 например).
>>666860
Ты никуда не сохранил результат функции trim. Она не меняет переданную ей переменную.
> function inclineWord($number) {
> function declensionMillion($millions) {
Это однотипная копипаста. Копипаста - зло. Надо сделать универсальную функцию склонения любых слов, работающую например так:
echo declense(4, '%d кот', '%d кота', 'аж %d котов', 'ни одного кота')
Универсальные функции почти всегда лучше и дают более чистый код. Так как мы разделяем сущности и отделяем выбор формы слова от списка самих слов.
Более того, ты при копипасте забыл дописать проверку на 11-19 для тысяч и миллионов, я же говорю что копипаст зло и ведет к ошибкам.
> if($number%100 <= 20){
Это условие проще переписать как "если число заканчивается на 11-19 то вернуть нужную форму слова"
> if(isset($spelling[$number])){
А стоит ли это выносить как особый случай?
> fmod(floor($number/1000), 1000);
Можно использовать знак процента для получения остатка
> trim(preg_replace('/\s{2,}/u',
Чтобы не мучаться с пробелами, лучше сделать массив в который складвать слова, а в конце объединить его в строку.
>>666855
Да, при условии что это utf-8 (то есть только с ней, а не с UTF-16 например).
>>666860
Ты никуда не сохранил результат функции trim. Она не меняет переданную ей переменную.
> \b(.)
Короче будет написать \w
> \)?
А что за странное условие? Разве можно предложение с точкой на конце в скобки прятать?
> echo preg_replace_callback('#((?:^|[.?!])\)?)\s*\b(.)#su', function ($matches) {
Тут хватило бы preg_replace с $1 и $2
>>667066
Например решая задачи на регулярки из учебника в Оп посте, а потом еще дополнительных попросить.
>>667045
Гугли что нового - там много интересного.
>>667088
> что нельзя парсить html регулярками, но все так делают.
> но все так делают
А если все с крыши прыгать будут - ты тоже прыгнешь?
> И еще смеются над теми, у кого DOM-парсеры падают на невалидном html.
Потому что надо использовать HTML-совместимый парсер а не XML. Потому что то что там матчится простым Xpath или CSS выражением, ты на регулярках вообще не реализуешь (ну или замучаешься реализовывать, я подзабыл теорию, могут ли регулярки распарсить HTML).
>>667088
> Модификатор u лишний. Здесь он не имеет значения.
Он имеет значение и позволяет не бескопоиться о юникоде. Потому что другим программистам надо работать а не шарады в твоем коде решать.
> Алсо, есть более элегантное решение
> return in_array(pathinfo($file, PATHINFO_EXTENSION), array('jpg', 'png'));
Согласен, так наверно даже лучше, но ради этой функции надо было лезть в мануал, чтобы вспомнить название константы. Алсо строка длинная, я бы разбил на 2 действия.
> \b(.)
Короче будет написать \w
> \)?
А что за странное условие? Разве можно предложение с точкой на конце в скобки прятать?
> echo preg_replace_callback('#((?:^|[.?!])\)?)\s*\b(.)#su', function ($matches) {
Тут хватило бы preg_replace с $1 и $2
>>667066
Например решая задачи на регулярки из учебника в Оп посте, а потом еще дополнительных попросить.
>>667045
Гугли что нового - там много интересного.
>>667088
> что нельзя парсить html регулярками, но все так делают.
> но все так делают
А если все с крыши прыгать будут - ты тоже прыгнешь?
> И еще смеются над теми, у кого DOM-парсеры падают на невалидном html.
Потому что надо использовать HTML-совместимый парсер а не XML. Потому что то что там матчится простым Xpath или CSS выражением, ты на регулярках вообще не реализуешь (ну или замучаешься реализовывать, я подзабыл теорию, могут ли регулярки распарсить HTML).
>>667088
> Модификатор u лишний. Здесь он не имеет значения.
Он имеет значение и позволяет не бескопоиться о юникоде. Потому что другим программистам надо работать а не шарады в твоем коде решать.
> Алсо, есть более элегантное решение
> return in_array(pathinfo($file, PATHINFO_EXTENSION), array('jpg', 'png'));
Согласен, так наверно даже лучше, но ради этой функции надо было лезть в мануал, чтобы вспомнить название константы. Алсо строка длинная, я бы разбил на 2 действия.
"боб" же вполне хорошее слово - этакий кирпичик, хранящий какие-то данные, моделька. AbstractFactoryBean = базовый класс для создания фабрик по произодству бобов. Если кто-то спотыкается на таких названиях, это значит что у них маловато знаний ООП и всяких там SOLID и паттернов. Отличный тест.
>>667188
Погугли "самодокументируемый код". Это код который понятен даже без комментариев: хорошие имена функций и переменных, аккуратное оформление, никаких подвохов и неожиданных вещей вроде пропущенного флага u у регулярки.
Cloud IDE
Пропиарю хороший проект еще раз: бесплатная IDE в браузере >>667010 - не требует установки, просто регистрируешься и получаешь уже настроенную систему с линуксом, PHP, Апачом, MySQL. Никаких SSH, все работает из коробки включая HTTPS. У меня вот тут есть ссылка - можете туда зайти, там уже настроен и развернут проект файлообменника >>667019
>>667247
Нет, ко мне никакого отношения, я просто зашел и удивлся до чего прогресс дошел.
Почему неправда? Ты же писал выше что без знания "теории" будут возникать проблемы, как у того анона с древовидными комментариями.
Знание алгоритмов и структур данных, хотя бы минимальное - полезно. Вузовская "математика" (линейный анализ и прочая ерунда) мало где нужна, разве что немного геометрии в 3D графике. Ну и может еще нахождение минимумов/максимумов, но это уже в машинном обучении наверно нужно.
Ну все равно я замечал что люди без знаний алгоритмов затрудняются решить задачи на собеседованиях, из-за этого им часто не перезванивают.
Делай по шаблону на каждую страницу. Потом в контроллере эти шаблоны подключай через include.
>index.php
$a = 1;
$b = 2;
include("index.html");
>index.html
a is: <?= $a ?><br> <!-- Выведет 1 -->
b is: <?= $b ?><br> <!-- Выведет 2 -->
Если не хочешь строить таких велосипедов в приложениях покрупнее, посмотри на шаблонизатор Twig, он небольшой, бесплатный и позволяет удобно создавать простые и не очень простые шаблоны.
Неправильно считает, должно быть 61270 с копейками.
Конкретно в этом твоём варианте вот что неверно: когда $creditBalance у тебя становится меньше $monthlyPayment, то у тебя следует вот это выражение: $creditBalance = ( $creditBalance х $percent ) + $servicePayment - $monthlyPayment;. И в какой-то момент это уходит в минус, от чего дальше всё идёт неверно.
Подсказка: попробуй ввести отдельную переменную для подсчёта $creditBalance = ( $creditBalance х $percent ) + $servicePayment, ведь именно когда этот момент становится меньше $monthlyPayment, нам и надо просто его выплатить и приплюсовать к $paymentTotal.
Почему в вакансиях PHP зп указана в 58%, а в других вакансиях строго < 50% ? Что бы это могло значить?
Может быть рынок перенасыщен спецами PHP? Или наоборот?
Алсо кресты sosnooley.
Ruby Найдено 190 вакансий
Указана 72
от 80 000 руб. 60
от 115 000 руб. 34
от 155 000 руб. 12
от 195 000 руб. 5
от 230 000 руб. 4
Php Найдено 1 314 вакансий
Указана 762
от 45 000 руб. 641
от 75 000 руб. 418
от 105 000 руб. 192
от 140 000 руб. 96
от 170 000 руб. 54
Java Найдено 1 393 вакансии
Указана 353
от 65 000 руб. 303
от 130 000 руб. 145
от 195 000 руб. 70
от 260 000 руб. 39
от 325 000 руб. 19
Javascript Найдено 497 вакансий
Указана 206
от 55 000 руб. 181
от 100 000 руб. 119
от 145 000 руб. 34
от 185 000 руб. 17
от 230 000 руб. 12
Python Найдено 362 вакансии
Указана 109
от 85 000 руб. 76
от 140 000 руб. 37
от 190 000 руб. 27
от 245 000 руб. 21
от 300 000 руб. 20
C# Найдено 684 вакансии
Указана 279
от 30 000 руб. 277
от 65 000 руб. 218
от 95 000 руб. 128
от 130 000 руб. 58
от 160 000 руб. 21
.net Найдена 1 021 вакансия
Указана 388
от 45 000 руб. 361
от 80 000 руб. 306
от 120 000 руб. 206
от 155 000 руб. 53
от 195 000 руб. 18
c++ Найдено 729 вакансий
Указана 331
от 70 000 руб. 269
от 140 000 руб. 151
от 205 000 руб. 113
от 270 000 руб. 27
от 340 000 руб. 25
Почему в вакансиях PHP зп указана в 58%, а в других вакансиях строго < 50% ? Что бы это могло значить?
Может быть рынок перенасыщен спецами PHP? Или наоборот?
Алсо кресты sosnooley.
Ruby Найдено 190 вакансий
Указана 72
от 80 000 руб. 60
от 115 000 руб. 34
от 155 000 руб. 12
от 195 000 руб. 5
от 230 000 руб. 4
Php Найдено 1 314 вакансий
Указана 762
от 45 000 руб. 641
от 75 000 руб. 418
от 105 000 руб. 192
от 140 000 руб. 96
от 170 000 руб. 54
Java Найдено 1 393 вакансии
Указана 353
от 65 000 руб. 303
от 130 000 руб. 145
от 195 000 руб. 70
от 260 000 руб. 39
от 325 000 руб. 19
Javascript Найдено 497 вакансий
Указана 206
от 55 000 руб. 181
от 100 000 руб. 119
от 145 000 руб. 34
от 185 000 руб. 17
от 230 000 руб. 12
Python Найдено 362 вакансии
Указана 109
от 85 000 руб. 76
от 140 000 руб. 37
от 190 000 руб. 27
от 245 000 руб. 21
от 300 000 руб. 20
C# Найдено 684 вакансии
Указана 279
от 30 000 руб. 277
от 65 000 руб. 218
от 95 000 руб. 128
от 130 000 руб. 58
от 160 000 руб. 21
.net Найдена 1 021 вакансия
Указана 388
от 45 000 руб. 361
от 80 000 руб. 306
от 120 000 руб. 206
от 155 000 руб. 53
от 195 000 руб. 18
c++ Найдено 729 вакансий
Указана 331
от 70 000 руб. 269
от 140 000 руб. 151
от 205 000 руб. 113
от 270 000 руб. 27
от 340 000 руб. 25
>Может быть рынок перенасыщен спецами PHP?
Спецов PHP как раз не хватает, как и в других областях. На PHP много джуниоров или просто девелоперов-макак, из-за того что пхп как продукт доступнее и порог вхождения в него ниже чем в джаву или кресты.
Чем отличается "спец" от "макаки"? Есть ли жесткие критерии? А что если таких критериев просто не существует, как и прослойки спецов среди php-программистов, а работодатели сами не знают чего хотят?
А ты еще посмотри для интереса, что именно за вакансии на Питон (к примеру) с макс. з/п
http://hh.ru/search/vacancy?text=python&clusters=true&enable_snippets=true&salary=310000&only_with_salary=true&from=cluster_compensation
http://hh.ru/vacancy/16016299?query=python
> Big Data Engineer/ Python&Hadoop (Tokyo, Japan)
> Experience with at least three of the following technologies: Hadoop, Hive, Pig, Zookeeper, Cassandra, Spark, Kafka
> Good understanding of software and hardware performance as well as familiarity with the Linux kernel
> Java programming experience
Это не совсем Питон вакансия
http://hh.ru/vacancy/15969455?query=python
> от 1 500 до 5 000 USD
> In an interesting project (New application for an active lifestyle) required Engineering Manager.
> Ruby-on-rails is the most important skill,
> Exceptional coding skills in two or more general purpose programming languages including but not limited to: Java, C/C++, C#, Objective C, Python, JavaScript, .Net skills in Go, Swift - interest and ability to learn other coding languages as needed
Это не Питон вакансия. Причем диапазон з/п подозрительно широкий.
http://hh.ru/vacancy/16162999?query=python
> Java&Python Software Engineer
> Strong mathematical background;
> Expertise in Machine Learning;
> Advanced knowledge of Java.
Это не совсем ПИтон вакансия
Далее
> C++ & Scala Software Engineer (Apache Mesos project)
> от 250 000 руб.
> C/C++ developer
> 2 000-5 000 USD
(вакансия продублирована 14 раз)
Ну и так далее. По моему данные изначально неправильные, там просто попадаются все вакансии где упомянуто слово, а не вгде язык является основным. Ну и ты ленив, даже не глянул результаты.
> Алсо кресты sosnooley.
Только в списке высокооплачиваемых вакансий на Питоне 14 вакансий Си++ программиста.
И что с рынком случилось? До кризиса вроде з/п в 300к для программистов не было даже у аутсорсеров.
А ты еще посмотри для интереса, что именно за вакансии на Питон (к примеру) с макс. з/п
http://hh.ru/search/vacancy?text=python&clusters=true&enable_snippets=true&salary=310000&only_with_salary=true&from=cluster_compensation
http://hh.ru/vacancy/16016299?query=python
> Big Data Engineer/ Python&Hadoop (Tokyo, Japan)
> Experience with at least three of the following technologies: Hadoop, Hive, Pig, Zookeeper, Cassandra, Spark, Kafka
> Good understanding of software and hardware performance as well as familiarity with the Linux kernel
> Java programming experience
Это не совсем Питон вакансия
http://hh.ru/vacancy/15969455?query=python
> от 1 500 до 5 000 USD
> In an interesting project (New application for an active lifestyle) required Engineering Manager.
> Ruby-on-rails is the most important skill,
> Exceptional coding skills in two or more general purpose programming languages including but not limited to: Java, C/C++, C#, Objective C, Python, JavaScript, .Net skills in Go, Swift - interest and ability to learn other coding languages as needed
Это не Питон вакансия. Причем диапазон з/п подозрительно широкий.
http://hh.ru/vacancy/16162999?query=python
> Java&Python Software Engineer
> Strong mathematical background;
> Expertise in Machine Learning;
> Advanced knowledge of Java.
Это не совсем ПИтон вакансия
Далее
> C++ & Scala Software Engineer (Apache Mesos project)
> от 250 000 руб.
> C/C++ developer
> 2 000-5 000 USD
(вакансия продублирована 14 раз)
Ну и так далее. По моему данные изначально неправильные, там просто попадаются все вакансии где упомянуто слово, а не вгде язык является основным. Ну и ты ленив, даже не глянул результаты.
> Алсо кресты sosnooley.
Только в списке высокооплачиваемых вакансий на Питоне 14 вакансий Си++ программиста.
И что с рынком случилось? До кризиса вроде з/п в 300к для программистов не было даже у аутсорсеров.
lol
Алсо, попалось интересное задание на апворке, не хотите совместно сделать? Короче делаются скриншоты с гугл мапс, а потом сортиурются по категориям.
Согласен с той заменой последовательности уроков, когда ОП вперёд пустил ООП, а HTML+CSS поместил после.
Потому что ужасно жалко потраченного на это всё времени, что ты будешь делать. Понимаю, что потом что-то в шаблонах править будет удобнее, потому что понимание многого пришло. При этом многое, чувствую, там не вполне верно решил.
Макет отличный, мне нравится, потом сам смогу сверстать подобную landing page для своего проекта, это неплохо.
Но сколь далече уже продвинулись те, кто не стал решать бонусные задачи, кто не стал решать вот эти задачи на HTML+CSS.
Жалко времени, душа требует ООП уже, БД и фреймворков.
Постараюсь держать вас в курсе.
зашел в консоль ctrl+shift+j, там выполнил код. Не понятно, почему в первый раз у меня из строки выполнилось, а потом перестало. Алсо, котаны, кто по специалисту учил джаваскрипт. Саму контору эту тут не очень любят, но мб кто-нибудь даст рецензию на их работу? Сам курс пхп у них просматриваю, ставя скорость видео х1,5, а то это же пиздец 4 часа аутировать и пытаться все запомнить
Норм книга для новичка?
Хочу перейти к мускулю как-нибудь плавно.
Какой смысл в таких курсах без обратной связи?
Сужу по учебнику ОПа и новичкам, который на 2-3 элементарной задаче начинают спотыкаться.
Не знаю, как тебе, но там есть неплохие истории от самого автора. Вроде как первых байтов в кодировки УТФ-8, которые только в пхп не работаю и прочих историй. ты взлольнешь, но мне страшно вообще что-то писать, а простота и юмор автора расслабляют и страх уходит
>мне страшно вообще что-то писать
Ты - это я.
Мне иногда не по себе от того, что я уже достаточно далеко продвинулся, а иногда смотрю на чужие решения предыдущих задач - и не могу ничего понять. Потом разбираюсь, конечно, когда всматриваюсь или изменяю код.
Надеюсь, с опытом пройдёт, когда багаж знаний пополнится. Как с задачами про Айфон, Айпад и многими другими: сначала рвал и метал, а сейчас не глядя могу записать решение.
Ruby 190 6638 2,86
Php 1314 1491820,88
Java 1393 756901,84
Javascript497 952350,52
Front-end1654 1230113,44
Python 362 24 0741,50 //анон сказал, что данные не корректы
C# 684 62 1471,10
.net 1 021 128 5020,79
c++ 729 124 259 0,58
678028 резюме - 7844 вакансий = 670184 причин бросить айти
Это патологическое неосиляторство, которое наблюдается у 95%двощеров в той или иной степени. В сфере погромистов есть отдельное название ХЕЛЛОУВОРЛДЩИКИ Вкатился в ваш ламповый чат под ником NEOSEELYATOR228 Странно, почему тут не неймфажат. Наверняка меня обоссут мамкины ононимы
Почему не меняется переменная currentPosition?
Как её вывести из области видимости функции?
Перепробовал через return и так далее, но почему-то не прокатило.
Читал в учебнике, что должно работать так:
a = 1
function go() {
a = 6
}
go()
alert(a) // => 6
но бля, почему не работает?
http://ideone.com/6S1BI7
W1 - http://ideone.com/PaOLUG
W2 - http://ideone.com/sAZs0A
W3 - http://ideone.com/7FUXeB
W4.1 - http://ideone.com/xN81k7
W4.2 - http://ideone.com/hDB9f4
W5.2 - http://ideone.com/b46oYS
W5.1 - http://ideone.com/isOeeQ
ты меня раскусил
Используй всё-таки возврат значения:
function getCurrentPosition() {
var currentPosition;
// тут твой код
return currentPosition;
}
var currentPosition = getCurrentPosition();
console.log(currentPosition);
Так не работает?
Всё отлично, но W5.1 решена неправильно:
>if ($creditBalance < 0)
Такого никогда не должно быть в правильном решении, чтобы $creditBalance был меньше нуля. Ведь так ты допускаешь, что в какой-то момент банк становится должен Анончику, чего быть не должно.
>$creditBalance = 0;
А вот тут надо просто отнимать от $creditBalance оставшуюся выплату. Имей в виду, что $creditBalance к этому моменту уже должен быть помножен на процент и с прибавленной комиссией за кредит.
Сам буду студентом 4 курса, предлагает мне местная контора перекатиться в РНР, хотя я сам занимаюсь явой.
Стоит ли бежать учить этот ваш РНР, при условии что живу в мухосранске 100к, и при этом везде нужны пхпшники, а заводить трактор в ДС я поку не буду?
>W5.1 решена неправильно
Готов с тобой поспорить.
>Такого никогда не должно быть в правильном решении
Ты неправ. И смотри почему: школьник пришёл в последний месяц отдавать 5000р. Он их отдал банку. Банк смотрит на купюру и даёт школьнику сдачу.
Это самая изощрённая отмазка, чтобы не переделывать задачу, из тех, что бывали! Браво!
Так ведь там есть условие, если оставшаяся сумма кредита следующего месяца меньше 5000. Прости, если я чего-то не понимаю и за задержку с ответом.
У тебя $creditBalance в последнем действии механически приводится к нулю, что тоже можно посчитать дурным тоном.
Вот ОП приедет, он тебе всё скажет. Хотя к этому времени ты уже уйдёшь дальше и не захочешь возвращаться к этой задаче.
Так или иначе, ты сейчас заложил мину в своё обучение программированию, которая однажды сработает.
С одним. Я по ошибке сказал, что в коде ошибка. На самом деле ничего такого я там не увидел. Я подумал там действительно в минус уходит долг и так и остаётся до следующего месяца: распространенная ошибка для этой задачи, но тут такого нет.
>Что сделать, я недопонял?
Предоставить начальные условия, при которых моя программа неправильно рассчитывает то, что она должна рассчитывать.
Из постановки задачи есть ограничения на начальные условия:
$creditBalance > 0
$monthlyPayment > 0
$rate > 1
$servicePayment >= 0
$payed total = 0
К тому же, исходя из постановки задачи(небольшой кредит с быстрой выплатой), эти переменные точно не выйдут из допустимого для данного типа переменных диапазона значений.
Если на перечисленных выше начальных условиях программа выдаёт правильный ответ - она работает правильно.
А теперь предоставь такие начальные условия, при которых она работает неправильно.
>Так или иначе, ты сейчас заложил мину в своё обучение программированию, которая однажды сработает.
Не понимаю, о какой мине идёт речь. Выражайся яснее, пожалуйста.
дай бог здоровья
Для каждого сайта запись в hosts и виртуалхост в хттпд.конф.
Пытаюсь зайти на один сайт - заходит нормально (на него же заходит при попытке зайти просто на 127.0.0.1, а не по имени)
Пытаюсь зайти на другие - хтассес этого первого сайта перехватывает запросы и отправляет меня нахуй.
Удаляю этот файл хтассесс, пытаюсь зайти на эти вот другие сайты - нот фаунд (даже при попытке открыть конкретную html страницу, хотя она-то уж точно "фаунд"). Все это пытаюсь пердолить на сборочке вертриго сервер. До этого говно вертелось на ксампе, там не было никаких хтассесов и вирт хостов и все работало (например, 127.0.0.1/макаба - заходило на www/макаба/индекс.пхп). Что я сделал не так, где перепердолил, как исправить и можно ли, на будущее, как-то попроще? А то я уже заебался - удалять хтассесы при переходе с реального сервера на локалхост, иметь две разные версии хтассесов, записывать каждый новый проект в хостс и httpd.conf... Можно все это попроще как-то? Инбифо, написать скрипт Сорян за сумбурность, уже руки трясутся.
Ах да, при всем при этом, например, 127.0.0.1/phpmyadmin вполне себе работает, а вот сайты - нихуя. И раз уж я такой мудак, посоветуй, мб, годную книжку (рашн) по админству, ну, все эти хттпд.конфы, хтассесы, май.ини, настройки-настроечки...
Судя по всему, ты что-то изучал и раньше.
Но если ты сейчас взялся за изучение РНР, то, скорее всего, прежде не всё у тебя было гладко в программировании. Либо в нём ты не продвинулся далеко, раз сейчас начал с лёгких задач из учебника ОПа.
Ничего личного, просто обозначаю своё вИдение ситуации.
Ты не задавался вопросом, почему именно всё не было гладко?
>Если на перечисленных выше начальных условиях программа выдаёт правильный ответ - она работает правильно.
Вот именно, что уверенность в этом закладывает мины в твоё обучение программированию. Представь, что реальная программа по расчёту кредита в реальном банке сделает допущение, что банк в какой-то момент оказывается должен что-то заёмщику, - думаешь, кто-то на такое согласится?
У нас есть чёткая формулировка задачи: прибавлять к сумме кредита процент и комиссию, отнимать месячную выплату и прибавлять результат к общим выплатам. Когда сумма кредита с прибавленными процентами и комиссией становится меньше месячной выплаты - выплачиваем её и заканчиваем цикл выплат.
Из недочётов в твоём решении:
1. $creditBalance в последнем условии механически приводится к нулю, желательно по-иному всё сделать. И без излишнего копирования.
2. Не выводится в конце "С меня хватит!". Таково было условие.
3. Нельзя будет в любой момент работы скрипта утверждать, что все переменные можно с одинаковым успехом вывести в echo. Например, попробуй сделать вывод реального $creditBalance до прибавления процентов и комиссии - не будет верного решения в этой ситуации, в какой-то момент будет отрицательное число в суме кредита, это нонсенс.
Можно жутким говнокодом решить эту задачу, с кучей копирования и прочим - и программа тоже работала бы правильно. Только не к такому надо стремиться.
>>673506
Ну ты и есть второй.
Долг уходит в минус, а потом отрицательное число умножается на положительное число, а к этому прибавляется ещё одно положительное число (умножается на 1.03 с прибавлением процентов к долгу и затем прибавляется 1000 комиссии). Это неправильный подход.
Судя по всему, ты что-то изучал и раньше.
Но если ты сейчас взялся за изучение РНР, то, скорее всего, прежде не всё у тебя было гладко в программировании. Либо в нём ты не продвинулся далеко, раз сейчас начал с лёгких задач из учебника ОПа.
Ничего личного, просто обозначаю своё вИдение ситуации.
Ты не задавался вопросом, почему именно всё не было гладко?
>Если на перечисленных выше начальных условиях программа выдаёт правильный ответ - она работает правильно.
Вот именно, что уверенность в этом закладывает мины в твоё обучение программированию. Представь, что реальная программа по расчёту кредита в реальном банке сделает допущение, что банк в какой-то момент оказывается должен что-то заёмщику, - думаешь, кто-то на такое согласится?
У нас есть чёткая формулировка задачи: прибавлять к сумме кредита процент и комиссию, отнимать месячную выплату и прибавлять результат к общим выплатам. Когда сумма кредита с прибавленными процентами и комиссией становится меньше месячной выплаты - выплачиваем её и заканчиваем цикл выплат.
Из недочётов в твоём решении:
1. $creditBalance в последнем условии механически приводится к нулю, желательно по-иному всё сделать. И без излишнего копирования.
2. Не выводится в конце "С меня хватит!". Таково было условие.
3. Нельзя будет в любой момент работы скрипта утверждать, что все переменные можно с одинаковым успехом вывести в echo. Например, попробуй сделать вывод реального $creditBalance до прибавления процентов и комиссии - не будет верного решения в этой ситуации, в какой-то момент будет отрицательное число в суме кредита, это нонсенс.
Можно жутким говнокодом решить эту задачу, с кучей копирования и прочим - и программа тоже работала бы правильно. Только не к такому надо стремиться.
>>673506
Ну ты и есть второй.
Долг уходит в минус, а потом отрицательное число умножается на положительное число, а к этому прибавляется ещё одно положительное число (умножается на 1.03 с прибавлением процентов к долгу и затем прибавляется 1000 комиссии). Это неправильный подход.
* в сумме кредита
>потом отрицательное число умножается на положительное число, а к этому прибавляется ещё одно положительное число (умножается на 1.03 с прибавлением процентов к долгу и затем прибавляется 1000 комиссии).
Нет, у тебя там другое.
У тебя в какой-то момент Анон платит больше, чем должен, банк становится должен Анону:
$payedTotal += $monthlyPayment; Если вывести в этом месте $payedTotal, то там будет тысяч 65.
А далее уже отрицательный $creditBalance отнимается от этих 65 заплаченных Аноном тысяч, получается верная цифра.
Вот это всё лишнее и вообще представляет собой нонсенс. Неверный подход.
W5.3 - http://ideone.com/jWpMfH
W5.4 - https://ideone.com/hZNNWf
W5.5 - https://ideone.com/kwBJKl НИКОГДА
>>673600
>Судя по всему, ты что-то изучал и раньше.
Математику и физику изучал и продолжаю изучать. Захотелось научиться программировать в вебе. Всё-таки в России не самые лучшие времена, а в случае чего хочу, чтобы на хлеб с маслом хватало. Уезжать не хочу.
>в какой-то момент
Отрицательный баланс там виртуальный и нужен для удобства расчёта и чтения кода.
>Представь, что реальная программа по расчёту кредита в реальном банке сделает допущение, что банк в какой-то момент оказывается должен что-то заёмщику, - думаешь, кто-то на такое согласится?
Про black box ни разу не слышал?
>У нас есть чёткая формулировка задачи: прибавлять к сумме кредита процент и комиссию, отнимать месячную выплату и прибавлять результат к общим выплатам. Когда сумма кредита с прибавленными процентами и комиссией становится меньше месячной выплаты - выплачиваем её и заканчиваем цикл выплат.
Ничто не мешает смоделировать этот процесс так, как я сделал выше. На данных начальных условиях(которые гарантируются условиями задачи) модель соответствует действительности.
>>673616
>Вот это всё лишнее и вообще представляет собой нонсенс. Неверный подход.
Ну охуеть теперь.
>Отрицательный баланс там виртуальный и нужен для удобства расчёта и чтения кода.
Стремиться надо к такому, чтобы в любой момент можно было вывести правильное значение переменной, которое соответствует действительности - как минимум. Твой скрипт не позволит этого.
>Про black box ни разу не слышал?
Слышал, конечно, сам практикую.
Но и довольно часто встречались фрилансеры с таким же, как у тебя, упорством в оправдании своего желания работать меньше, не переделывать детали в соответствии с элементарным ТЗ - и прочее. Всегда не особо приятные ощущения от такого.
>в любой момент
У меня момент времени - месяц. Внутри него никаких делений на нуль и подобного непотребства не происходит. Все вычисления корректны. На выходе из месяца все переменные содержат то, что и должны содержать.
>с элементарным ТЗ
В задании ни слова не сказано про то, какими должны быть переменные во время выполнения.
>упорством в оправдании своего желания работать меньше
Краткость - сестра таланта.
Важно не только "что", но и "как".
>В задании ни слова не сказано про то, какими должны быть переменные во время выполнения.
ОП об этом говорил неоднократно просто так.
Поскольку неправильное решение у многих сразу получается, а с правильным приходится сидеть дольше.
>Краткость - сестра таланта.
Тот самый случай, когда с точки зрения грамматики или культуры речи всё абсолютно правильно. А впечатление производит не самое приятное, согласен. Вот так и в твоём варианте той задачи: за вроде бы правильным решением скрывается нечто такое, чего допускать ни в коем случае нельзя.
Да там нет ничего неправильного, нету такой ситуации после которой функция вернет ложный результат.
> нечто такое, чего допускать ни в коем случае нельзя.
Что конкретно? Мне уже надоело это хождение вокруг и около.
>вроде бы правильным решением
Дай определение правильного решения. Мы с тобой говорим на разных языках, походу.
>>673666
Так надо стремиться к универсальности. Чтобы не было таких отмазок и условий: когда месяц закрывается, то переменная правильная, а когда он ещё не закрылся, то она становится неправильной. Несмотря на то, что конкретно в этом решении этого и не произойдёт.
Стремиться-то надо к правильному пути, когда переменные в любой момент не противоречат логике и реальности.
>Что конкретно? Мне уже надоело это хождение вокруг и около.
Требования к себе не вполне верны в этой ситуации. Подобные решения не приветствуются, у задачи может быть несколько правильных решений без ухода в минус. И лучше попробовать именно их отыскать, чем тратить время.
>Дай определение правильного решения.
Ну вот, например:
>прибавлять к сумме кредита процент и комиссию, отнимать месячную выплату и прибавлять результат к общим выплатам. Когда сумма кредита с прибавленными процентами и комиссией становится меньше месячной выплаты - выплачиваем её и заканчиваем цикл выплат.
Это самой прямой и логичный алгоритм решения задачи.
По твоему определению получается, что все решения, которые отличаюстя от твоего - неверные. Извини, но тут уж ты неправ.
Да ты поехавший какой-то. Вот тебе задача: написать функцию, которая переворачивает строку. Ты берешь аргумент-строку разбиваешь на массив символов, делаешь array_reverse и склеиваешь обратно в строку и возвращаешь. Задача решена. И тут я такой "НЕ УНИВИРСАЛЬНА, А ВОТ НА ЭТОЙ СТРОЧКЕ ПЕРЕМЕННАЯ СТАНОВИТСЯ МАССИВОМ А ДООЛЖНА БЫТЬ ВСЕГДА СТРОКОЙ ТУТ ОНА ПРАВИЛЬНАЯ А ЗДЕСЬ НИПРАВИЛЬНАЯ", хотя по факту нужно смотреть лишь результат функции, то, что она возвращает, а какие метаморфозы она претерпевает на пути к этому результату не так важно.
Вот этого двачую.
Чому? Все решения, в которых логика выплат сохраняется, - правильные. А когда в какой-то момент анон выплачивает банку ~65к, а потом банк ему возвращает около 4к, - не вполне правильные. Мне кажется это естественным.
>>673685
>Да ты поехавший какой-то.
Yep, и уже довольно давно.
>по факту нужно смотреть лишь результат функции, то, что она возвращает, а какие метаморфозы она претерпевает на пути к этому результату не так важно.
Если логике не противоречит - всё нормально.
Есть обязательные шаги, а есть такие, которые неверны либо не обязательны.
Представь, что кассир или менеджер в банке ручками всё рассчитывает для Анона. Логика в этом случае обязательно будет нормальной, а не такой, при которой менеджер скажет или укажет что-то такое: "Вот тут проценты и коммиссия на каждый месяц и твои выплаты. А вот тут в последний месяц ты нам платишь свои прежние 5к рублей, банк становится должен тебе, а потом отдаёт тебе часть долга". Это-то и неверно.
Послушаем, что скажет ОП через пару дней.
>Все решения, в которых логика выплат сохраняется
Смоделируй мне большие(миллиарды) частицы из первых принципов. Ой, а ты не можешь.
Хочу оставить свой отзыв о фрилансере под ником >>673704
>>673704 обещал сделать работу в срок и по ТЗ, сдал всё довольно быстро, но результат, мягко говоря, не соответствовал ожиданиям.
Что неприятно поразило: не хотел признавать свою неправоту, пытался оправдать свою работу, которая не выдерживает никакой критики.
Работали по Безопасной сделке, в итоге по решению арбитража мне вернули сумму полностью.
Но есть и положительные стороны у >>673704: берётся за работу с воодушевлением, делает всё достаточно быстро, код на выходе вполне аккуратный.
В общем, если вам нужны какие-то несложные вещи типа натягивания шаблона на вротперс или поправить вёрстку, то >>673704 вполне подойдёт. Только перед началом работы убедитесь, что он понял важные пункты из ТЗ.
Если же нужно чёткое следование логике и техническому заданию, то не советую вам связываться с ним. Потратите только зря деньги, нервы и силы, а в результате получите не то, на что рассчитывали.
Работайте с ним только по Безопасной сделке на коротких сроках, если не найдёте других вариантов.
Для себя я выводы сделал: работать с >>673704 больше не буду.
Почти копипаст с одной биржи фриланса
>>673715
Тогда там надо предусмотреть такие переменные, а пока там такого нет.
"Почти" там только номер поста, поставленный на место ника.
>>673726
Как так? А кому я только что оставил отрицательный отзыв?
Ситуация узнаваемая, вполне.
>>673728
Бугурт приобретает отчётливые очертания.
>Как так? А кому я только что оставил отрицательный отзыв?
Анониму, который учится программировать и не собирается делать вещи так, как хочешь ты, но так, как правильно. Не выдержав критики этого анонима, ты придумал какие-то отношения фрилансер-работодатель, коих между вами нет, для перехода в другую плоскость спора, где ты уже был прав.
Но он не фрилансер. А ты не работодатель.
Да вы, батенька, ещё более поехавший, чем я, если всё это всерьёз.
>не собирается делать вещи так, как хочешь ты, но так, как правильно.
ОП рассудит, я гарантирую, подскажет, как правильнее.
>Но он не фрилансер. А ты не работодатель.
Просто знакомая ситуация, характерная для фриланса. Когда исполнитель находит кучу нелепых отмазок, чтобы просто от него отстали и приняли работу. Специально для подобных случаев есть БС и арбитраж.
Ребятки, двойной(!) бамп.
Для разнообразия можно.
Это ещё не всё сделано, кстати.
Хорошая задумка с количеством слогов.
Числа прописью:
https://ideone.com/UMDGcw
http://ideone.com/sR4Qhz
Немного допиленная версия.
Не впилил правило с маленькой っ, как-нибудь потом доделаю.
Да, вот еще что: скажем, на http://сайт заходит (это пака www/сайт), а вот на http://localhost/сайт - нет. Или так и должно быть?
//main.php
$a = include('kek.php');
echo "Hello, {$a}!"; //output: Hello, Yoba!
//kek.php
/.../
return 'Yoba';
>>673402
По поводу решения задачи про кредит. Вот анон говорит что программа всегда выдает правильный результат. Но ведь мало чтобы программа давала правильный результат, надо чтобы еще ее легко было прочесть и понять как она работает. Потому что если код не понятен, то нужно больше времени чтобы в нем разобраться и проще сделать ошибку.
Вот попробуем прочитать алгоритм, который заложен в коде:
Каждый месяц пока долг больше нуля:
- прибавить к долгу проценты и комиссию и вычесть 5000 (макс. ежемесячную выплату)
- прибавить к общей сумме выплаченного 5000
- если долг стал меньше нуля, то прибавить к общей сумме выплат остаток долга (?) и сделать долг равным нулю
Вот этот вот последний кусочек - он по моему не очень логичный. Причем в коде никаких пояснений, почему сделано так хитро и запутанно, нету. Непонятно - то ли автор тут закладывает какую-то логику, то ли он ошибся и что-то перепутал.
Если бы код просто не переплачивал и не уходил ниже нуля, то алгоритм выглядел бы так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Кстати, если использовать min/max, то задача решается без использования if, решение получается простое и короткое.
Это конечно простая задача и тут разобраться можно в любом случае. Но реальные задачи - они все намного сложнее и там запутаться в коде очень просто. Потому важно уметь писать код наиболее прямолинейно, пусть даже это учебная задача на 5 строк.
Ну и собственно хотелось бы узнать у автора кода, а какие преимущества дает изменение алгоритма, когда мы сначала платим больше чем надо, а потом компенсируем уход долга в минус?
И аноны, давайте обсуждать исключительно код и способ решения и не добавлять эмоций в спор, только аргументы почему один способ лучше или хуже. И уж тем более давайте не будем никого ни в чем обвинять.
>>673681
Конечно, такого нет, что есть какой-то стандартный ответ и надо написать код с точностью до запятой так же. Но с другой стороны, в данном случае для начала хочется понимать почему тут написано так, а не иначе.
>>673685
> Ты берешь аргумент-строку разбиваешь на массив символов, делаешь array_reverse и склеиваешь обратно в строку и возвращаешь.
По моему ты перегибаешь палку. Я никогда не говорил что нельзя так решать, и были люди которые делали такие решения. Но если ты решил как-то все усложнить, ну к примеру, разбил слово на массив символов, пересортировал его хитрым образом и берешь каждый второй символ, то конечно возникает вопрос, а с какой это целью это сделано?
>>673722
Вот ты тоже перегибаешь палку. Один анон решает задачи, другой помогает найти ошибки, не надо пытаться тут искать виноватых. Даже если кто-то сделал ошибку в задаче (или сделал ошибку при проверке задачи), в этом нет ничего плохого. Давайте спокойно и без лишних эмоций приведем свои аргументы.
Я в принципе настаивать на той или иной точке зрения не буду. Я привел свои аргументы по поводу решения, а возражать или нет, исправлять или нет, или это уже личное дело анона. Мы тут только даем советы, а воспользуются ими или нет, это уже не наше дело.
>>673402
По поводу решения задачи про кредит. Вот анон говорит что программа всегда выдает правильный результат. Но ведь мало чтобы программа давала правильный результат, надо чтобы еще ее легко было прочесть и понять как она работает. Потому что если код не понятен, то нужно больше времени чтобы в нем разобраться и проще сделать ошибку.
Вот попробуем прочитать алгоритм, который заложен в коде:
Каждый месяц пока долг больше нуля:
- прибавить к долгу проценты и комиссию и вычесть 5000 (макс. ежемесячную выплату)
- прибавить к общей сумме выплаченного 5000
- если долг стал меньше нуля, то прибавить к общей сумме выплат остаток долга (?) и сделать долг равным нулю
Вот этот вот последний кусочек - он по моему не очень логичный. Причем в коде никаких пояснений, почему сделано так хитро и запутанно, нету. Непонятно - то ли автор тут закладывает какую-то логику, то ли он ошибся и что-то перепутал.
Если бы код просто не переплачивал и не уходил ниже нуля, то алгоритм выглядел бы так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Кстати, если использовать min/max, то задача решается без использования if, решение получается простое и короткое.
Это конечно простая задача и тут разобраться можно в любом случае. Но реальные задачи - они все намного сложнее и там запутаться в коде очень просто. Потому важно уметь писать код наиболее прямолинейно, пусть даже это учебная задача на 5 строк.
Ну и собственно хотелось бы узнать у автора кода, а какие преимущества дает изменение алгоритма, когда мы сначала платим больше чем надо, а потом компенсируем уход долга в минус?
И аноны, давайте обсуждать исключительно код и способ решения и не добавлять эмоций в спор, только аргументы почему один способ лучше или хуже. И уж тем более давайте не будем никого ни в чем обвинять.
>>673681
Конечно, такого нет, что есть какой-то стандартный ответ и надо написать код с точностью до запятой так же. Но с другой стороны, в данном случае для начала хочется понимать почему тут написано так, а не иначе.
>>673685
> Ты берешь аргумент-строку разбиваешь на массив символов, делаешь array_reverse и склеиваешь обратно в строку и возвращаешь.
По моему ты перегибаешь палку. Я никогда не говорил что нельзя так решать, и были люди которые делали такие решения. Но если ты решил как-то все усложнить, ну к примеру, разбил слово на массив символов, пересортировал его хитрым образом и берешь каждый второй символ, то конечно возникает вопрос, а с какой это целью это сделано?
>>673722
Вот ты тоже перегибаешь палку. Один анон решает задачи, другой помогает найти ошибки, не надо пытаться тут искать виноватых. Даже если кто-то сделал ошибку в задаче (или сделал ошибку при проверке задачи), в этом нет ничего плохого. Давайте спокойно и без лишних эмоций приведем свои аргументы.
Я в принципе настаивать на той или иной точке зрения не буду. Я привел свои аргументы по поводу решения, а возражать или нет, исправлять или нет, или это уже личное дело анона. Мы тут только даем советы, а воспользуются ими или нет, это уже не наше дело.
Если ты хочешь добавить в программу моделирование процесса выдачи сдачи (говоря по-умному), то хорошо бы пояснить, какие это преимущества добавит программе.
>>673746
Фриланс наверно не лучший ориентир. Там много профессионализма присутствует с обоих сторон. Не особо советую в этом участвовать.
>>669753
Это называется юнит-тесты. Почитай урок https://gist.github.com/codedokode/a455bde7d0748c0a351a
Преимущество юнит-тестов в том, что их можно использовать многократно. Вот сделал ты год назад какой-то класс, предоставляющий какието полезные методы, написал тесты для этих методов - и эти тесты защищают полезный функционал. Если ты при правке кода что-то сломаешь, тесты тебе скажут хотя может к тому времени ты уже сам забудешь что такой функионал был.
Спасибо за пояснения.
>Вот этот вот последний кусочек - он по моему не очень логичный. Причем в коде никаких пояснений, почему сделано так хитро и запутанно, нету. Непонятно - то ли автор тут закладывает какую-то логику, то ли он ошибся и что-то перепутал.
Я как-то даже и не задумался, что этот момент будет неясен. Спасибо, в следующий раз оставлю комментарии к возможно неясным местам.
>Ну и собственно хотелось бы узнать у автора кода, а какие преимущества дает изменение алгоритма, когда мы сначала платим больше чем надо, а потом компенсируем уход долга в минус?
А я не менял алгоритм. Немного подумал и написал то, что написал.
>если использовать min/max
Что-то типа такого? http://ideone.com/rfef0Q
>давайте обсуждать исключительно код и способ решения и не добавлять эмоций в спор, только аргументы почему один способ лучше или хуже. И уж тем более давайте не будем никого ни в чем обвинять.
Извиняюсь.
> $letters = array(
>1=>'а',
>2=>'и',
>3=>'у',
Не стоит проставлять нумерацию вручную - неудобно будет править список (и неудобно проверять что у тебя все номера стоят правильно). Достаточно поставить только первый индекс
1 => '...',
'...',
'...'
А еще можно вообще не ставить индексы - PHP их сам расставит начиная с нуля.
>>673843
Тот же совет про индексы.
> правило с маленькой っ
Там придется учесть что она перед некоторыми буквами не ставится (ну то есть поставить то можно но выглядеть будет странно).
И еще составные символы вроде ぎゃ можно конечно было оптимизировать как-то, чтобы при выпадении ぎ с определенной вероятностью добавлялась бы маленькая буква.
И ゞ тоже не после каждого символа логично ставить.
Вот это вот не очень хорошая идея:
> ($random >= 46)&&($random <= 101))
Представь мы захотим поменять символы в массиве - все эти цифры придется пересчитывать. Поддерживать такой код неудобно. Проверить его тоже не очень легко.
Более того, сокуон っ например не должен идти в конце слова (ну то есть иногда там его пишут, но для того чтобы указать на особенности произношения слова). У тебя вроде нет такой проверки.
Мне кажется, надо как-то написать код так, чтобы потребности пересчитывать вручную индексы не было. Ну например, можно сделать несколько массивов: массив гласных, массив составных слогов, массив слогов с звонкими согласными, массив специальных символов. Имея их, мы всегда можем с помощью in_array проверить к какой категории относится символ, не мучаясь с номерами.
Также, можно сделать переменные, показывающие может ли сейчас выпасть специальный символ или нет, и написать их в таком виде, чтобы условия были легко понятны:
// сокуон разрешен только если текущий символ начинется с согласной
$isSokuonAllowed = !in_array($character, $specialCharacters);
$isDuplicatorAllowed = ....;
Это облегчит написание условий:
if ($isSokuonAllowed && $random < $sokuonProbability) {
$text .= $sokuon;
}
Возможно, что спецсимволы имеет смысл генерировать не отдельно сами по себе, а в добавление к обычному символу.
В общем, давай, подумай сам, как сделать код более простым, чтобы правила было легко читать и легко менять.
> $letters = array(
>1=>'а',
>2=>'и',
>3=>'у',
Не стоит проставлять нумерацию вручную - неудобно будет править список (и неудобно проверять что у тебя все номера стоят правильно). Достаточно поставить только первый индекс
1 => '...',
'...',
'...'
А еще можно вообще не ставить индексы - PHP их сам расставит начиная с нуля.
>>673843
Тот же совет про индексы.
> правило с маленькой っ
Там придется учесть что она перед некоторыми буквами не ставится (ну то есть поставить то можно но выглядеть будет странно).
И еще составные символы вроде ぎゃ можно конечно было оптимизировать как-то, чтобы при выпадении ぎ с определенной вероятностью добавлялась бы маленькая буква.
И ゞ тоже не после каждого символа логично ставить.
Вот это вот не очень хорошая идея:
> ($random >= 46)&&($random <= 101))
Представь мы захотим поменять символы в массиве - все эти цифры придется пересчитывать. Поддерживать такой код неудобно. Проверить его тоже не очень легко.
Более того, сокуон っ например не должен идти в конце слова (ну то есть иногда там его пишут, но для того чтобы указать на особенности произношения слова). У тебя вроде нет такой проверки.
Мне кажется, надо как-то написать код так, чтобы потребности пересчитывать вручную индексы не было. Ну например, можно сделать несколько массивов: массив гласных, массив составных слогов, массив слогов с звонкими согласными, массив специальных символов. Имея их, мы всегда можем с помощью in_array проверить к какой категории относится символ, не мучаясь с номерами.
Также, можно сделать переменные, показывающие может ли сейчас выпасть специальный символ или нет, и написать их в таком виде, чтобы условия были легко понятны:
// сокуон разрешен только если текущий символ начинется с согласной
$isSokuonAllowed = !in_array($character, $specialCharacters);
$isDuplicatorAllowed = ....;
Это облегчит написание условий:
if ($isSokuonAllowed && $random < $sokuonProbability) {
$text .= $sokuon;
}
Возможно, что спецсимволы имеет смысл генерировать не отдельно сами по себе, а в добавление к обычному символу.
В общем, давай, подумай сам, как сделать код более простым, чтобы правила было легко читать и легко менять.
Не знаю как в PHP, но обычно возвращается указатель на первый элемент массива.
> Что-то типа такого? http://ideone.com/rfef0Q
Да. Использование min тут имеет то преимущество что код чуть компактнее получается и мы обходимся без ветвлений.
В PHP переменные могут хранить массивы. Если ты хочешь намекнуть на Си то там такое решение - большая проблема, так как в 99% случаев нам нужен не указатель на массив в памяти, а еще и длина (чтобы избежать переполнения). Удивительно, что хотя проблема с переполнениями буфера известна уже 30 лет, программисты на Си все езе их допускают. Это происходит из-за нежелания борьбы с проблемой системно - например, используя определенные правила или абстракции.
>Тот же совет про индексы.
Индексы я оставил для того, чтобы было удобнее смотреть, где начинаются "звонкие" символы, символы, с которыми маленькая цу не работает и всё в этом духе. Не думаю, что это что-то криминальное.
За советы по программе с хираганой - большое спасибо, допилю.
> // сокуон разрешен только если текущий символ начинется с согласной
> $isSokuonAllowed = !in_array($character, $specialCharacters);
Ой, тут комментарий не соответствует коду, но надеюсь мысль понятна. Условия лучше писать в таком виде, потому что условие вида
if ($random > 46)
читается хуже- надо лезть в список и пытаться понять что хотел сказать автор.
Индексы имеют тот недостаток что их надо поддерживать при изменениях. Это лишняя ручная работа. Лучше будет сделать несколько отдельных массивов для разных категорий символов. А в коде ты потом можешь объединить их в один общий массив если надо.
То есть простановку индексов все же лучше оставить компьютеру - у него это получается лучше.
Создаешь текстовый файл и записываешь туда двумерный массив, тебе необходимо поменять минимальный и максимальный элемент в этом массиве В ФАЙЛЕ!
Нет же!
Файл, например, обрабатывает данные формы, после чего редиректит на главную админки с определенным месседжем и статусом.
Опять же, если инициатор - главная - да. Смотри
Форма использует обработчик.пхп. По завершению своей работы обработчик.пхп должен редиректить на главная.пхп и передавать последней некоторые параметры.
array_merge - вроде же было в уроке про массивы? Если нет, информация есть в мануале.
>>673965
Почитай про MVC. Как сделать обработку формы - давно уже известно. Тебе надо не изобретать велосипеды, а изучить накопленный опыт.
Хотя я подумал, если ты сейчас пойдешь гуглить про MVC, то наверняка найдешь не то или запутаешься. По хорошему тут надо изучить какой-нибудь фреймворк вроде Юи 2 или Симфони 2, или например решать нашу задачу про студентов, в общем быстро это не объяснить.
Обычно все, что функции нужно, передается ей явно через аргументы.
> А то вот делаю войдовую функцию по рисовке тайлов из массива, хочу её отдельно вынести чтоб использовать когда хочу как собстна функцию,
Ну давай подумаем, что нужно такой функции для выполнения работы? Очевидно, надо дать ей какой-то "холст", на который она должна нарисовать изображение, исходную картинку и может какие-то дополнительные параметры, показывающие какую часть картинки взять и какие преобразования сделать.
> а там чтоб нарисовать что-то нужно делать команду окнонейм.draw(спрайт), которая работает только в мейне (потому что там определено окно, спрайт, вот это всё).
При чем тут "окно нейм"? Какой это язык? По моему твое окнонейм - это обычный объект, который можно передавать.
Извиняюсь, нашел папку api в бинарниках для win32. И почему нельзя было сделать ссылку на api отдельно для других ОС?
> mb_strtoupper(mb_substr(trim($value),0,1)) . mb_substr(trim($value),1)
Вот эту сложную конструкцию стоит вынести в отдельную функцию.
> foreach($text as $key => $value){
value лучше переменовать в sentence, а text хранящий массив - в sentences
> \\s*?
Квантификаторы нельзя применят друг к другу напрямую. Квантификатор можно писать только после символа или круглых/квадратных скобок. Нельзя написать a+? - можно писать (a+)? но это довольно бессмысленно (какой смысл задавать число повторений дважды?) и проще заменить на звездочку. Знак вопроса после звездочки управляет жадностью звездочки (мануал http://php.net/manual/ru/regexp.reference.repetition.php ) и это вряд ли то, что ты имел в виду.
Вместо var_dump надо возвращаеть результат с помощью return и далее выводить его через echo.
>>667284
Если речь о Windows - в функции работы с файлами в нем надо передавать имена в win1251.
>>667361
Берем 1-й символ с начала и с конца и сравнвиаем. Не равны - не палиндром. Равны - продолжаем сравнение.
Берем 2-й символ с начала и с конца и сравниваем. Не равны - не палиндром. Равны - продолжаем сравнение.
....
В твоем коде ты всегда берешь только первый и последний символ. А номер символа дложен меняться на каждом шаге цикла.
> function inclineWord($key, $word) {
Неудачно спроектирована функция. Вот я допустим хочу ее использовать - что такое key? что такое word? Почему word хранит число, хотя переводится как "слово"? Ну и ты зачем-то заложил в нее список слов, лучше убрать его из функции и передавать формы слова снаружи. Эту функцию надо переписать целиком.
Вот пример хорошей функции:
echo declense(4, '%d кот', '%d кота', 'аж %d котов', 'ни одного кота');
> function parts($number) {
Имя функции должно начинаться с глагола, сделатьЧтоТо, напримр splitToParts
> $score = mb_strlen($number);
> $thousand = mb_substr($number, -6, 3);
Для работы с числами надо использовать математические операции (деление, остаток от деления). Более того, ты в этой функции скопипастил 3 почти одинаковых блока. Это плохо, но если перейти на математические методы, эти ифы будут не нужны, потому оптимизировать их не надо.
> function smallNumberToText($number) {
> if ($number == 0) {
> echo "На вашем счету ноль рублей\n";
> exit;
Плохо спроектирована функция. Почему она самовольно выводит что-то на экран, да еще и завершает всю программу? А если я хочу вызвать ее несколько раз? При этом если число не равно нулю, то она ничего не выводит. Тут нет логики.
> if (mb_strlen($discharge) == 3) {
Используй математические методы
В функции smallNumberToText слишком глубокая вложенность кода. Вот я вижу 5 уровней вложенности: foreach -> if ($discharge > 0) -> else -> for. Как минимум ту можно избавиться от одного уровня, переделав if ($discharge > 0). Когда у тебя весь код заключен в один if - это плохо и надо переворачивать такой иф.
> .$spelling[mb_substr($discharge, 0, 1) * 100];
слишком сложное выражение в скобках - выноси в переменную с понятным именем.
> $regexp = array('/один тысяча/', '/два тысячи/', '/ ноль/', '/^[ ]/');
> $replacements = array('одна тысяча', 'две тысячи', '', '');
Это костыли. Надо изначально выбирать правильную форму слова.
В общем, убирай все mb_strlen и mb_substr.
>if ($number % 1000 == 000) {
000 это то же самое что просто 0. Подумай в чем разница между 0, "0", 000, "000".
> function inclineWord($key, $word) {
Неудачно спроектирована функция. Вот я допустим хочу ее использовать - что такое key? что такое word? Почему word хранит число, хотя переводится как "слово"? Ну и ты зачем-то заложил в нее список слов, лучше убрать его из функции и передавать формы слова снаружи. Эту функцию надо переписать целиком.
Вот пример хорошей функции:
echo declense(4, '%d кот', '%d кота', 'аж %d котов', 'ни одного кота');
> function parts($number) {
Имя функции должно начинаться с глагола, сделатьЧтоТо, напримр splitToParts
> $score = mb_strlen($number);
> $thousand = mb_substr($number, -6, 3);
Для работы с числами надо использовать математические операции (деление, остаток от деления). Более того, ты в этой функции скопипастил 3 почти одинаковых блока. Это плохо, но если перейти на математические методы, эти ифы будут не нужны, потому оптимизировать их не надо.
> function smallNumberToText($number) {
> if ($number == 0) {
> echo "На вашем счету ноль рублей\n";
> exit;
Плохо спроектирована функция. Почему она самовольно выводит что-то на экран, да еще и завершает всю программу? А если я хочу вызвать ее несколько раз? При этом если число не равно нулю, то она ничего не выводит. Тут нет логики.
> if (mb_strlen($discharge) == 3) {
Используй математические методы
В функции smallNumberToText слишком глубокая вложенность кода. Вот я вижу 5 уровней вложенности: foreach -> if ($discharge > 0) -> else -> for. Как минимум ту можно избавиться от одного уровня, переделав if ($discharge > 0). Когда у тебя весь код заключен в один if - это плохо и надо переворачивать такой иф.
> .$spelling[mb_substr($discharge, 0, 1) * 100];
слишком сложное выражение в скобках - выноси в переменную с понятным именем.
> $regexp = array('/один тысяча/', '/два тысячи/', '/ ноль/', '/^[ ]/');
> $replacements = array('одна тысяча', 'две тысячи', '', '');
Это костыли. Надо изначально выбирать правильную форму слова.
В общем, убирай все mb_strlen и mb_substr.
>if ($number % 1000 == 000) {
000 это то же самое что просто 0. Подумай в чем разница между 0, "0", 000, "000".
Это не очень хорошее решение. Ощущение что ты не пытался написать простой и понятный код, а пытался его запутать. Почему ты думаешь что это хорошо? Как ты думаешь, что хочется другим людям - быстро понять как работает код, или разгадывать шарады и проверять по мануалу особенности языка?
Вот например:
> while($symbols > 0) {
> $reversed .= mb_substr($string, --$symbols, 1);
Это закамуфлированный цикл со счетчиком, то есть for. Почему ты пытаешься его замаскировать?
> $reversed .= mb_substr($string, --$symbols, 1);
Это 2 отдельных действия и должно писаться так:
$reversed .= mb_substr($string, $symbols, 1);
$symbols--;
Если ты хочешь сказать что видел такое в Си коде, я тебе сразу отвечу что именно у любителей запутывать код потом находят уязвимости вроде переполнения буфера. Работа со строками в Си сделана отвратительно, и поощряет написание тяжелочитаемого кода с ошибками. В PHP она гораздо лучше, тут строка является полноценной сущностью, а не указателем в произвольную точку памяти.
Перевернуть строку проще, разбив ее на массив символов ($letters = preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY);)
> return mb_substr($text, 0, ceil($textLength / 2)) == reverseString(mb_substr($text, floor($textLength / 2)));
Не очень понятно зачем эти странные манипуляции с делением на 2? Что тебе мешает перевернуть строку целиком? И что еще хуже, почему там стоит ceil и float? Не лучше ли справа писать то же число что и слева, только со знаком минус?
>>667374
Он наверно еще функции не изучал.
Это не очень хорошее решение. Ощущение что ты не пытался написать простой и понятный код, а пытался его запутать. Почему ты думаешь что это хорошо? Как ты думаешь, что хочется другим людям - быстро понять как работает код, или разгадывать шарады и проверять по мануалу особенности языка?
Вот например:
> while($symbols > 0) {
> $reversed .= mb_substr($string, --$symbols, 1);
Это закамуфлированный цикл со счетчиком, то есть for. Почему ты пытаешься его замаскировать?
> $reversed .= mb_substr($string, --$symbols, 1);
Это 2 отдельных действия и должно писаться так:
$reversed .= mb_substr($string, $symbols, 1);
$symbols--;
Если ты хочешь сказать что видел такое в Си коде, я тебе сразу отвечу что именно у любителей запутывать код потом находят уязвимости вроде переполнения буфера. Работа со строками в Си сделана отвратительно, и поощряет написание тяжелочитаемого кода с ошибками. В PHP она гораздо лучше, тут строка является полноценной сущностью, а не указателем в произвольную точку памяти.
Перевернуть строку проще, разбив ее на массив символов ($letters = preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY);)
> return mb_substr($text, 0, ceil($textLength / 2)) == reverseString(mb_substr($text, floor($textLength / 2)));
Не очень понятно зачем эти странные манипуляции с делением на 2? Что тебе мешает перевернуть строку целиком? И что еще хуже, почему там стоит ceil и float? Не лучше ли справа писать то же число что и слева, только со знаком минус?
>>667374
Он наверно еще функции не изучал.
В ОП посте есть ссылка на задачи по SQL и там же ссылка на туториал для начинающих.
Для отправки запросов к базе из PHP удобно использовать встроенное расширение PDO.
Чтобы писать сайты, мало знать PHP и SQL. Надо еще изучать HTML/CSS (в ОП посте есть задания), архитектуру веб-приложений, работу с формами, MVC (ее изучают например в задаче про студентов). Без этого ты можешь сделать сайт, но код скорее всего будет очень плохим и уродливым - так что для себя можно сделать, но на собеседовании показывать не стоит.
Алсо если тебе хочется побыстрее что-то написать на PHP и запустить в браузере, поставь Апач с PHP (инструкции в Оп посте) и следуй туториалу http://php.net/manual/ru/tutorial.php
Линукс не обязателен - можно запускать Апач и под виндой - но в перспективе линукс освоить все равно придется.
>>667666
Под линуксом динамические библиотеки имеют другое расширение
>>667871
> Копирую сюда весь css код
Зачем копировать? Там нужны только дополняющие правила для печати.
> При этом ничего не выравнивается по центру, когда выводишь документ на печать,
А почему оно должно?
Тогда тебе лучше называть переменные правильно, а не key и value.
>>668117
У тебя не выводится строчка где сумма превышает миллион.
>>668273
> имхо подразумевая то что на винде вообще не удобно работать.
Спорно. Если тебе не нужна консоль то Апач и PHP вполне нормально работают и тратят меньше ресурсов чем виртуалка + не надо пока разбираться в линуксе.
>>668312
Ответ должен быть 61270. Ты сильно усложнил код, из-за чего трудно даже понять что там не так. Придется переписать его заново. Тот код, который дан в учебнике, специально содержит ошибку - потому возможно не стоит его копировать.
Алгоритм должен быть примерно такой:
- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!)
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>668375
Кыш
Тогда тебе лучше называть переменные правильно, а не key и value.
>>668117
У тебя не выводится строчка где сумма превышает миллион.
>>668273
> имхо подразумевая то что на винде вообще не удобно работать.
Спорно. Если тебе не нужна консоль то Апач и PHP вполне нормально работают и тратят меньше ресурсов чем виртуалка + не надо пока разбираться в линуксе.
>>668312
Ответ должен быть 61270. Ты сильно усложнил код, из-за чего трудно даже понять что там не так. Придется переписать его заново. Тот код, который дан в учебнике, специально содержит ошибку - потому возможно не стоит его копировать.
Алгоритм должен быть примерно такой:
- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!)
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>668375
Кыш
Число 69 лучше сделать констаной с понятными именем.
>>668832
Нет, надо использовать математические методы. Если нужны огромные числа то использовать библиотеку для работы с огромными числами.
>>668844
ucfirst работает только с некоторыми символами вроде латиннциы. Не рекомендую ее использовать никогда. С utf-8 она несовместима и может ломать символы кириллицы. Советую почитать https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>668884
Лучше использовать стандартные средства фреймворка - тогда например какие-то плагины для работы с заголовками смогут их видеть.
>>669950
> function inclineWord($number, $word1, $word2, $word5) {
> $test = $number%100;
Лучше называть вроде last2digits (2 последние цифры)
> $test = $test%10;
лучше сделать новую переменную чтобы не было путаницы
> if($test==0 && $number != 0){
Зачем второе условие ? Для нуля тоже используется форма word5
> if(isset($spelling[$number])){
Зачем это условие? Числа вроде 5 или 11 можно обрабатывать в общем порядке.
> if(isset($femaleSpelling[$tens]) && $isFemale == 1){
Чтобы не писать это несколбько раз, можно просто менять массив с написанием, если пол женский то заменять в нем элементы на элементы из femaleSpelling
> $numberStr = $numberStr." ".$femaleSpelling[$units];
Лучше сделать массив и добавлять слова в него, будет более аккуратный код и не надо помнить с какой строны ставить пробел. Или хотя бы использовать .= здесь
> $saveNumber = 0;
> $saveNumber = $number;
Первая строка не имеет смысла
> $indexName = 0;
> $indexName = 0;
То же самое
> $word = inclineWord($numericDigit, $largeNumbersNames[$indexName][0], $largeNumbersNames[$indexName][1], $largeNumbersNames[$indexName][2]);
не надо копипастить $largeNumbersNames[$indexName], вынеси в переменную. Также, возможно аругменты стоит записать вертикально.
> if($indexName == 0){
> $word = "(".$saveNumber.") ".$word;
Это можно просто поставить после / перед циклом и иф будет не нужен
Чтобы не мучаться с пробелами, складывай части фразы в массив.
Коду надо улучшить читабельность - пока читать тяжеловато.
>>669950
> function inclineWord($number, $word1, $word2, $word5) {
> $test = $number%100;
Лучше называть вроде last2digits (2 последние цифры)
> $test = $test%10;
лучше сделать новую переменную чтобы не было путаницы
> if($test==0 && $number != 0){
Зачем второе условие ? Для нуля тоже используется форма word5
> if(isset($spelling[$number])){
Зачем это условие? Числа вроде 5 или 11 можно обрабатывать в общем порядке.
> if(isset($femaleSpelling[$tens]) && $isFemale == 1){
Чтобы не писать это несколбько раз, можно просто менять массив с написанием, если пол женский то заменять в нем элементы на элементы из femaleSpelling
> $numberStr = $numberStr." ".$femaleSpelling[$units];
Лучше сделать массив и добавлять слова в него, будет более аккуратный код и не надо помнить с какой строны ставить пробел. Или хотя бы использовать .= здесь
> $saveNumber = 0;
> $saveNumber = $number;
Первая строка не имеет смысла
> $indexName = 0;
> $indexName = 0;
То же самое
> $word = inclineWord($numericDigit, $largeNumbersNames[$indexName][0], $largeNumbersNames[$indexName][1], $largeNumbersNames[$indexName][2]);
не надо копипастить $largeNumbersNames[$indexName], вынеси в переменную. Также, возможно аругменты стоит записать вертикально.
> if($indexName == 0){
> $word = "(".$saveNumber.") ".$word;
Это можно просто поставить после / перед циклом и иф будет не нужен
Чтобы не мучаться с пробелами, складывай части фразы в массив.
Коду надо улучшить читабельность - пока читать тяжеловато.
Не советуй вредное, нужны математические методы.
>>669219
> http://ideone.com/gvUha4 -5.3(оценки)
верно
> http://ideone.com/P526Ry -5.4(рост)
Верно
> http://ideone.com/6F7GME -5.5(ответ на вопрос)
Да, правильно.
> http://ideone.com/gU18qG -5.6(генератор имени)
все правильно
>>669382
Попробуй понять разницу:
echo $a+$b; - вычисляет выражение, получается число, оно выводится
echo $a . $b; - числа склеиваются как строки и выводятся
echo "$a+$b"; - в строку подставляются значения a и b но не складываются
echo '$a+$b'; - ничего не вычисляется, строка выводится как есть
Не советуй вредное, нужны математические методы.
>>669219
> http://ideone.com/gvUha4 -5.3(оценки)
верно
> http://ideone.com/P526Ry -5.4(рост)
Верно
> http://ideone.com/6F7GME -5.5(ответ на вопрос)
Да, правильно.
> http://ideone.com/gU18qG -5.6(генератор имени)
все правильно
>>669382
Попробуй понять разницу:
echo $a+$b; - вычисляет выражение, получается число, оно выводится
echo $a . $b; - числа склеиваются как строки и выводятся
echo "$a+$b"; - в строку подставляются значения a и b но не складываются
echo '$a+$b'; - ничего не вычисляется, строка выводится как есть
Скачивать 5 файлов, распаковывать, изучать код? Что-то лень. Можешь запостить ключевые места кода и выложить например на pastebin, может кто-то глянет, но обещать не могу.
> при попытки извлечь из БД что-то кроме поля username я получаю..нихуя. просто пустое поле
Ну вот и написал бы: как выглядит код отправки запроса, чему равны переменные до его выполнения и после (выведи их через var_dump)
>>669731
> Никак не пойму как писать грамотно тесты.
Читал мой урок? https://gist.github.com/codedokode/a455bde7d0748c0a351a
> Если речь идет о модульном тестировании, то мне нужно тестировать все методы всех классов, а не только метод суммы в котором содержится основная логика приложения?
Нет. Ты не обязан тестировать все. В данном случае стоит тестировать юнит-тестами именно модель. Контроллер и вью (вместе с моделью) можно тестировать end-to-end (gui) тестами, то есть посылать HTTP запрос и смотреть ответ на него.
ну то есть определись, что именно ты хочешь протестировать?
- что модель правильно складывает числа?
- что контроллер при получении запроса вызвает правильнй метод модели (довольно сомнительный тест)
- что вью правильно подставляет результат в HTML код (тоже сомнительный)
Тестированием ты пытаешься проверить что написанный тобой код работает корректно, и защищаешь его от попыток сломать. На практике вью не тестируют из-за того что в них почти нет логики, а контроллер - потому что его трудно отвязать от других частей приложения и усилия того не стоят. Ну и конечно контроллер должен быть тонким.
>>669735
При чем active record в тестировании чисел? Ну и думаю при большом желании базу в AR можно заменить моком или использовать тестовую базу, хотя конечно спутанность модели и кода работы с базой чуть усложняет тестирование.
Интеграционные и юнит-тесты нужны оба, почитай например https://habrahabr.ru/post/168451/ (я советую пролистать весь блог яндекса на хабре - там много интересного по тестированию)
>>669744
Не надо использовать хранимые процедуры. Они неудобны , надо их поддерживать, неудобно отладивать, логгировать и тд.
Ну и твой запрос можно сделать и с клиента, сделав 20 юнионов.
Скачивать 5 файлов, распаковывать, изучать код? Что-то лень. Можешь запостить ключевые места кода и выложить например на pastebin, может кто-то глянет, но обещать не могу.
> при попытки извлечь из БД что-то кроме поля username я получаю..нихуя. просто пустое поле
Ну вот и написал бы: как выглядит код отправки запроса, чему равны переменные до его выполнения и после (выведи их через var_dump)
>>669731
> Никак не пойму как писать грамотно тесты.
Читал мой урок? https://gist.github.com/codedokode/a455bde7d0748c0a351a
> Если речь идет о модульном тестировании, то мне нужно тестировать все методы всех классов, а не только метод суммы в котором содержится основная логика приложения?
Нет. Ты не обязан тестировать все. В данном случае стоит тестировать юнит-тестами именно модель. Контроллер и вью (вместе с моделью) можно тестировать end-to-end (gui) тестами, то есть посылать HTTP запрос и смотреть ответ на него.
ну то есть определись, что именно ты хочешь протестировать?
- что модель правильно складывает числа?
- что контроллер при получении запроса вызвает правильнй метод модели (довольно сомнительный тест)
- что вью правильно подставляет результат в HTML код (тоже сомнительный)
Тестированием ты пытаешься проверить что написанный тобой код работает корректно, и защищаешь его от попыток сломать. На практике вью не тестируют из-за того что в них почти нет логики, а контроллер - потому что его трудно отвязать от других частей приложения и усилия того не стоят. Ну и конечно контроллер должен быть тонким.
>>669735
При чем active record в тестировании чисел? Ну и думаю при большом желании базу в AR можно заменить моком или использовать тестовую базу, хотя конечно спутанность модели и кода работы с базой чуть усложняет тестирование.
Интеграционные и юнит-тесты нужны оба, почитай например https://habrahabr.ru/post/168451/ (я советую пролистать весь блог яндекса на хабре - там много интересного по тестированию)
>>669744
Не надо использовать хранимые процедуры. Они неудобны , надо их поддерживать, неудобно отладивать, логгировать и тд.
Ну и твой запрос можно сделать и с клиента, сделав 20 юнионов.
Получаю такой ответ:
Возможно, произошла ошибка. Обратитесь к окну результатов.
В чем проблема?
Во первых найди окошко с логом, где написано какой файл запускается, что вывелось и тд.
Во-вторых, проверь настройки - указан ли путь к PHP правильно.
В-третьих, для начала стоит научиться запускать тесты ручками, а потом уже использовать запуск одной кнопкой. Открой командную строку, перейди в папку с тестами и запусти тесты нужной командой phpunit (я напишу пример наугад) вроде такой
php c:/tmp/phpunit.phar run
Также, у phpunit есть режим, кога он пишет подробно что именно делается. Там добавляется к команде опция вроде -v или --debug, не помню. Ты можешь ее использовать для того чтобы понять что не работает.
>>674067
>>674069
>В-третьих, для начала стоит научиться запускать тесты ручками
Это хороший совет. Спасибо.
>Во-вторых, проверь настройки - указан ли путь к PHP правильно
А вот здесь крылась главная проблема.
В общем теперь всё работает за что большое тебе спасибо. Я уже дня два не мог разобраться в чём беда.
Я еще добавлю, что если урок учит именно запускать тесты через IDE то это неправильно. phpunit это консольная программа, и соответственно он рассчитан в первую очередь на запуск в ней, а не в нетбинсе. Так что лучше начинать с ручного запуска тестов, научиться писать phpunit.xml, а когда освоишься, узнать какой кнопкой это делается в IDE.
Вот у меня в уроке про phpunit немного написао: https://gist.github.com/codedokode/a455bde7d0748c0a351a#phpunit
Надо все же знать сам инструмент, а не только кнопку для его запуска из иде.
[code]1;.1;.10;;;К;;;Шайба увеличенная 8 ГОСТ 6958-78
1;.1;.11;;;П;;;"Заклепка резьбовая М8 MFX 23-VG
?№23М08VG1"
1;.2;;;;СБ;;КИУТ1501.01.01.000-01;Стойка
1;.2;.2;.5;;М;;;"Труба 40х40х2 ГОСТ 8639-82
В 10 ГОСТ 13663-86 L=0770 мм"
1;.2;.4;;;К;;;Винт М6х16 ГОСТ 11738-84[/code]
Суть в чём. Когда есть перенос строки в экселе идёт добавление \n в описании как в строке 2(заклепка) и 5(труба). И когда считываю файл через fgetcsv он разбивает описание и переносит на отдельную строку. Обычно это закавычивается. Надо как-то по маске брать то что в кавычках с новой строки например перед /n" тут текст с переносом и кавычками "/n и убирать /n в описание, которое в кавычках. Как сделать? пытался через регулярку но там ругается на маску по каждому поводу.
я пытаюсь создать форму с помощью CActiveForm
http://pastebin.com/3TjqMetB
но при вводе в текстовые поля, не происходит никакой валидации. Только срабатывает AfterValidation при загрузке страницы. ЧЯДНТ?
class Template { //класс шаблонизатора
function __construct($file = null) { //функция конструктора
$this->file = $file; //переменная $file в новом классе = null
$this->vars['null'] = ''; //обнуление значения элемента null в массиве $file в новом классе ???
}
function set($name, $value) { //вызываем функцию с аргументами типа $tpl->set('items',$cats);
$this->vars[$name] = is_object($value) ? $value->fetch() : $value; //присваиваем значение $cats элементу items в массиве $vars
}
function fetch($file = null) { // в file передается файл /main.tpl, это html шаблон
if(!$file) $file = $this->file; //если $file false, то присваиваем $file значение $this->file, т.е. null
extract($this->vars); //вот тут, и далее, совершенно не понятно, что происходит
ob_start();
include($file);
$contents = ob_get_contents();
ob_end_clean();
return $contents; //возвращает что-то...
}
}
вызывается вот так $content = $tpl->fetch("./main.tpl");
Нахуя ты память в цикле выделяешь?
И вообще тут не тужен четырехмерный массив. У тебя что имя и фамилия в целых числах описывается?
Определяешь класс с соответствующими полями, затем суешь его в вектор.
Да с формами я работать умею. Бля, это вообще не для какого-то годного кода. Мне вот просто нужно из одного php файла передать в другой (инициатором запуска этого второго является первый, он же передает) некоторые данные. Через глобалки, гет и куки/сессии делать не хочу, спрашиваю, можно ли еще как-то?
Наоборот, это для хуйни на сто строк, когда надо что-то затестить по-быстрому или набросать красивую лабу.
Странного? Ну хз. Возможно. А как заюзать $argv? Я же перехожу от выполнения одного файла к выполнению другого (через header(location...)
require('sql_bd.php');
$query1=$mysqli->query("UPDATE testov SET n1 = REPLACE(n1, '.', '')");
function gogogo() {
$query=$mysqli->query("SELECT DISTINCT n2 FROM testov WHERE n2>0");
while ($row = $query->fetch_assoc()) {
echo $row[0];
}
return false;
}
gogogo();
?>~
Fatal error: Call to a member function query() on a non-object
почему так? если пихну файл с коннектом в функцию то всё заработает?
>Озвучь, почему ты не хочешь/можешь их использовать?
Потому что юзер может изменить гет/куки, если даже они зашифрованы, первый засерает адресную строку. А сессии, я так понимаю, создают дохуя лишнюю нагрузку на сервер, если клиентов много, выполнений скриптов много, в сессии хранится много данных...да и ее можно подменить.
работа, ессно, донная
Лютейше двачую этот вопрос.
>>674376
Дело не в лени. Сегодня ты пытаешься учить пых, завтра у тебя последний день перед контрольной в вузе, через неделю дедлайн по курсачу на тему лоу-левела, потом ты заебываешься с ява-лабами, а в свободное время балуешься фотошопом, английским и перками в вовке. Ну и бухать не забываешь. Через пару месяцев вернулся - и пиздец, не помнишь, как запрос к базе сформулировать, какие параметры за что отвечают в конфиге, не понимаешь, чего от тебя хочет иксдебаг, если ты честно перегрузил функцию и почему length($arr) выдает ошибку. Каждый раз заново все гуглить...а уж редкая хуета типа трейтов и необходимости заключать в хуевинки регексп, разница в наличии-отсутствии всяких прег-сплитов и прег-тестов... Ебааать
А еще нереально трудно помнить больше 1-2 языков, все в башке мешается, особенно фреймворки, библиотеки и та их часть, которая используется нечасто.
Ещё вопрос по bootstrap имею. Смотрю туториалы на ютубе по нему: так там готовый КСС полностью прописанный, юзай не хочу, никакого пердолинга. Теперь вопрос: версталы опытные на работе только этим и пользуются? В таком случае для чего превозмогать ОП-овский урок по КСС, так, для общего развития?
Новичкам в треде помогаю решить то, что сам уже решил, смотрю на любой вариант решения, переделываю, чтобы заработало.
Думаю, что ОП и по этой причине тоже всем нам помогает, - лишний раз всё освежить в памяти.
Ещё у ОПа там годный макет, который надо сверстать из PSD.
Ты не можешь из функции получить доступ к внешней переменной. Да, должно заработать, но этой плохой путь (у тебя создаётся два соединения).
Пусть знающие аноны меня поправят, но в порядке возрастания кошерности, возможны следующие варианты:
1) глобальные переменные (всё ещё не очень)
2) передача $mysqli в функцию параметром
3) класс для работы с БД
Ну и более современным и универсальным будет использовать PDO.
Ты разделом не ошибся?
У меня глаза текли от нище-ТН и плохого освещения. Переехал на IPS и включил мягкий свет за монитором все прошло.
>elseif ($creditBalance < 0)
Такого не должно получиться при верном решении задачи, так что это лишнее.
>echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";
Это повторяется в двух основных условиях, поэтому может быть вынесено в основной цикл.
Пытаюсь запилить дефолтненькое добавление в друзья , друзей то отображает если я их вношу в БД , а вот заявки в друзья , или кому я отправил заявку , нет. В чем проблема гайз?
http://ideone.com/aQOxyd
Точнее , даже если я в БД вношу данные о отправке заявки - мне все равно предлагается "отправить" ее. То есть , он просто пропускает это , и это.
echo 'Add or No';
echi 'Otmena zayavki';
Если я выношу его в основной цикл, то у меня после последней оплаты заканчивается цикл и оно не пишет о оплате в 13 месяце. Вынести break чет не получается
Попробуй другое условие поставить в цикл.
Подсказка: обрати внимание на $creditBalance в этой ситуации, ведь цикл должен работать, пока $creditBalance не потратился до конца.
Я говорю про локальные пакеты, с глобальными все ясно.
Ну, хз. В админ.пхп есть форма удаления поста с форума, там его номер, причина удаления, возможность забанить автора, этц. Адмит вводит данные, нажимает сабмит. Форму обрабатывает delete.php, который в результате своей работы рапортует об успешном или неуспешном выполнении операции и редиректит обратно на админ.пхп
Что делает добавить и заполнитель ?
Добавить - добавление \ редактирование информации о себе.
Заполнитель - отключаемая вещь которая заполняет базу данных рандомными данными. Сделал для тестирования, потом решил оставить.
Ага, а если пользователь авторизирован, то поля уже заполнены или все поновой ?
Заполнены, все соответствует условию.
>>674974
Там не сессии а куки. Исходники можешь тут посмотреть https://github.com/foobar1643/student-list
Не хочется готовое решение смотреть. Надо самому все. Можно лишь советы просить.
Нет, не пробовал. Я считаю что мне не хватает опыта и знаний, еще мой код плохой и я очень часто делаю глупые архитектурные ошибки. Стараюсь работать над этим, параллельно изучая фреймворки и делая файлообменник.
Образование у меня 11 классов школы, учусь в ВУЗе на специальности Программное обеспечение систем. Начал заниматься всем этим еще в 15 - 16 лет, тогда я понятия не имел что такое эти ООП и паттерны, просто пробовал писать говнокод по разным туториалам в интернете, параллельно с этим изучая администрирование серверов. В том возрасте это было обычным увлечением, я часто забрасывал на пару месяцев, потом возвращался. Примерно год назад решил стать мамкиным вкатывальщиком в веб и заняться этим серьезно, и вот теперь я здесь.
Я тоже на Программной инженерии учусь. Какой курс ? Я думаю, тебе все же стоит попробовать сходить на собеседования. Хуже точно не будет. Окажут - получишь опыт. А возьмут - так оно и к лучшему.
Без обид, что назвал ебаниной работу, эт у меня бугурт на то, какой я тупой и ничего не пойму, как там что посмотреть. а посмотреть сука хочется
Второй курс.
>Хуже точно не будет
Я читал истории в соседнем треде про черные списки в некоторых конторах. Это когда тебя один раз не взяли из-за нехватки знаний и после этого добавляют в черный список. Потом все последующие походы к ним на собеседования заканчиваются отказом уже на стадии отправки резюме. Да и с одним маленьким проектом сделанным за три дня как-то неудобно идти будет.
Не удержался и посмотрел.
$student->gender = Student::GENDER_MALE; // Sexism?
Проиграл с этого.
Yii2, так же почти доделал файлообменник на слиме.
Расскажи подробнее о ходе интенсивного обучения за год.
Поможет ли хеллоувордлщику этот http://itcenter.ifmo.ru/razrabotka_web_-_saytov_3 курс? Или 60к на ветер, потому что не буду успевать? Курс 3 месяца длится.
http://ideone.com/VQjYYn ???
Я конечно не дизайнер, но думаю лучше будет хотя бы пол сделать списком с выбором (select).
Чтобы сдампить базу надо использовать mysqldump а не mysql
mysqldump -uxxx -pxxx database > file.sql
Если в PATH нет этой команды, то придется написать полный путь перед mysqldump (если ты читал мой урок по командной строке то уже это знаешь).
Дамп это текстовый файл с SQL командами. Загружается дамп с помощью mysql:
mysql -uxxx -pxxx database < file.sql
Со списком такая история. Список позволяет экономить место на экране, однако имеет недостатки:
- добавляется лишний клик для выбора
- возможные варианты не видны
Радиокнопки не имеют этих недостатков, но могут занимать больше места. Когда пунктов всего несколько, радиокнопки могут быть выгоднее.
>>675339
К чему писать такие посты?
>>675030
Форма поиска кривая, высота кнопки и поля ввода не совпадают
Поля на мой взгляд слишком длинные. Нужно бы укоротить их. Поля вроде номера группы или года рождения можно сделать совсем небольшими.
Радиокнопки расположены не очень удачно в том плане что нарушается закон близости (относящиеся друг к другу вещит находятся близко). Смотри, у тебя "мужской" и "женский" далеко, а "мужской" и "местный" близко и можно подумать что они связаны как-то.
Кнопка "очистить форму" не нужна, мне кажется, не могу представить ситуацию где она полезна. Можно заменить ее ссылкой "вернуться на главную".
Со списком такая история. Список позволяет экономить место на экране, однако имеет недостатки:
- добавляется лишний клик для выбора
- возможные варианты не видны
Радиокнопки не имеют этих недостатков, но могут занимать больше места. Когда пунктов всего несколько, радиокнопки могут быть выгоднее.
>>675339
К чему писать такие посты?
>>675030
Форма поиска кривая, высота кнопки и поля ввода не совпадают
Поля на мой взгляд слишком длинные. Нужно бы укоротить их. Поля вроде номера группы или года рождения можно сделать совсем небольшими.
Радиокнопки расположены не очень удачно в том плане что нарушается закон близости (относящиеся друг к другу вещит находятся близко). Смотри, у тебя "мужской" и "женский" далеко, а "мужской" и "местный" близко и можно подумать что они связаны как-то.
Кнопка "очистить форму" не нужна, мне кажется, не могу представить ситуацию где она полезна. Можно заменить ее ссылкой "вернуться на главную".
>К чему писать такие посты?
Для человека не очевидно что 1 раз тыкнуть мышкой проще, чем кликнуть, прочитать список, кликнуть, скролить дальше, но при этом он пытается навязать свою точку зрения другим. Да, уменя бомбит от того, что каждый день мне приходится работать с такими интерфейсами. Выпадающими списками на 1 пункт, галочками на 30 пунктов.
Он ничего не навязывал. Незачем переходить на личности. Ты бы мог дать ссылку на статью по теме или что-то такое.
Ты прав, наверное я слишком токсичен.
Ссылку не дам, но гугл в помощь.
Дизайн Для Реального Мира
Спасибо, буду править
>>675452
Композер создет файл composer.lock, и ставит пакеты в vendor. Также он устраивает кеш где-то в твоем профиле в ОС, но это мешать не должно.
npm аналогично ставит все в node_modules
Простых способов нет.
Если нужна авторизация, то для наколеночных поделок можешь посмотреть в сторону basic/digest аутентификации.
Но вообще от кук/сессий ты никуда не денешься, т.к. в вебе это по сути единственный способ сохранять состояние между запросами.
Поправьте, если я ошибаюсь.
Ну то есть можно просто удалить корневую папку FacebookKiller в которой лежат все эти node_modules, package.json, composer.lock, bowerrc, bower.json, .gitignore, .git? И не получить проблем в будущем, если например я заново создам папку с таким же именем.
Да. Более того, в случае с композером ты можешь например убрать зависимости из composer.json и сделать команду которая удалит более не нужные зависимсти (наверно, я не проверял).
>Для человека не очевидно что 1 раз тыкнуть мышкой проще, чем кликнуть, прочитать список, кликнуть, скролить дальше
>выбор пола
Oh you!..
Господа, что за хрень?
Устанавливал опенкарт на винде, все норм работало, на линуксе 404 ошибку выдает (пхп ламп апаче все есть и работате). Надо какие-то депенденсис в апаче писать?
5.9 неправильно же, проверяет только 1ю букву, для примера вставил в твой код набор буков с одинаковыми в начале и конце http://ideone.com/n9xgYF, в результате говорит что полиндром, хотя таким не является
Я наверное глупый вопрос задам, но это делается не через MySQL 5.7 Command Line Client, а через mysqldump.exe? У меня проблема с экзешками из папки из пикрелейтед - они все сразу вылетают, вот успел заскринить окно только. Поэтому работал со студентами через комманд клиент только.
Они не вылетают. Это программы для командной строки, ты их при клике запускаешь без аргументов, они об этом пишут и окно закрывается.
Надо запускать из командной строки.
> это делается не через MySQL 5.7 Command Line Client
Нет, он только для выполнения запросов к базе.
Спасибо за быстрый ответ, Оп. Раз ты здесь еще хотел спросить. Второй день не могу найти баг. Появляется когда настраиваешь количество записей на странице. Когда их меньше 20 - все ок. Когда 20 - ошибка 500. Когда их больше - не хватает некоторых кусков html или вообще всего, когда их примерно 30 - львиная часть записей отсутствует. С чем это может быть связано? Или ты без полного кода какие-то предположения сделать не сможешь.
Такое бывает, кстати.
Потому что соискателей много, а делать работу надо. Сделаешь хорошо - могут взять. Сделаешь не очень - откажут, поправят код, работа сделана.
Такое делают с SEO-специалистами постоянно. Требуют полный аудит сайта компании или нескольких сайтов, а потом отказывают. А аудиты корректируют и отправляют владельцам сайтов.
Ошибка 500 это обычно ошибка веб-сервера Апача (а не PHP кода). Причины в таких случаях записаны в логе веб-сервер - найди и прочитай.
Обычно у Апача это из-за проблем в URL страницы и в htaccess.
Правда у тебя почему-то эта страница подписана phpstorm. Раз ты используешь не стандартный Апач, а что-то что идет в комплекте с phpstorm то я в нем не разбираюсь и тебе надо читать их документацию - в каикх случахя он выдает ошибки, где логи, что у них за веб-сервер и тд.
Алсо почему ты настраиваешь число записей на странице тут, а не там где задается $recordsPerPage?
Ну и вообще, покажи потом код, там наверно будет много чего можно исправить.
Ну у соискателя всегда есть право отказаться делать задание. Да и сомнительный подход - я бы побоялся то что кандидаты присылают, на реальный сайт ставить. Замучаешься потом баги исправлять.
Ну так я для примера чтобы не скринить еще тот кусок где функция вызывается. Так то у меня все как на самой верхней пикче. Покажу, конечно, сейчас доделывать css буду и комментарии писать.
То делай псевдоэлементы с распорками, то просто задавай блокам размеры и маргины, то дисплей: тейбл.
Почему не остановиться на одном способе построения? Я запутался в этой херне, короче.
Или где внятно можно почитать.
Так эти куски я опять даже на локалке развернуть не могу, админки нет, структура папок не та, что в опенкарте, не говоря о содержимом, там еще и куски ноды есть, пиздец, я только осваивать эту новую чудную самописную легаси цмс буду месяц.
Сетка - это для дизайнеров, они по ней расставляют элементы, чтобы страница смотрелась аккаратно и пропорции были правильные. Верстальщика это не должно беспокоить - его должно беспокоить праильное позиционирование всех элементов. От чего зависит ширина того или иного элемента? Как она меняется при изменении размеров окна? Как он располагается относительно других? Как верстка меньяется на маленьких экранах?
В CSS есть такие способы позиционирования:
- блоки (которые идут вертикально)
- инлайн-блоки
- флоаты
- относ., абсол. и фикс. позиционирование
- display: table для случаев когда надо заставить блоки вести себя как ячейки и строки таблицы
Соответственно тебе глядя на макет надо решать где какой способ применить.
> То делай псевдоэлементы с распорками,
Бред какой-то, либо ты не так что-то понял. Распорки никто не использует с 2000 года.
> Почему не остановиться на одном способе построения?
Потому что ситуации разные. Иногда надо выстроить блоки вертикально, иногда горизонтально, иногда вырвать блок влево или вправо из потока.
Не знаю, что еще можно посоветовать почитать, посмотрри задания на cSS в ОП посте, там есть например ссылка на учебник на сайте softwaremaniacs
И конечно тебе надо больше внимания уделить изучению CSS. Описанные выше способы позиционирования надо знать наизусть, также знать все их особенности.
> я только осваивать эту новую чудную самописную легаси цмс буду месяц.
Может это значит что ты не подходишь на эту вакансию? Если ты развернуть проект не можешь, как ты будешь его поддерживать и правки вносить?
Абс. поз-е используется очень редко, только для случаев вроде прибить крестик в углу попапа. В обычной верстке его использовать неудобно так как оно вырывает блок из потока и он не может расталкивать идущие за ним блоки, то есть верстка получается прибита гвоздями и не подстраивается под содержимое.
>>675736
Ежедневная практика.
public login;
public password;
public function __construct($post) {
$this->setLogin(isset($post['login']) ? $post['login'] : '');
$this->setPassword(isset($post['password']) ? $post['password'] : '');
}
...
}
$form = new PostForm($_POST);
С этим всё хорошо?
зачем присылать проект, который невозможно равзернуть? почему сразу на хостинге админку не дать тогда уж?
>зачем присылать проект который нужно фиксить, пришлите полностью рабочий и заплатите мне за то что я нихуя не сделал
+--classes - здесь у меня классы
|
+--functions - здесь скрипты обработчиков для форм
|
+index.php - здесь у меня autoload
Я хочу в скриптах обработчиков в functions использовать классы из classes для которых autoload в index.php. Как мне сделать, чтобы классы были видны во всех папках проекта? Просто если у меня будет много обработчиков, то будет проблематично каждому подключать классы индивидуально.
Вынеси автолоад в отдельный файл (bootstrap.php например).
Подключай это файл в начале обработчика.
Сначала расскажи, как ты ее искал.
Просто там большими буквами на чистом английском языке написано, в чем причина и даже на какой строке ошибка, не понимаю, как это можно не увидеть.
Спасибо. Прочитав раза три понял в чем ошибка.
Цель этой задачи - закрепить твои знания. Серьёзность подхода к её решению - твой личный выбор.
>немного поработал с массивом.
Имеется в виду забить в массив остальной алфавит и его шифр или что?
Ты меня тралиш?
Задание ты выполнил (если тебя интересует решение), но у тебя возникла мысль доработать свой код. И это хорошо, поэтому если у тебя есть желание, ты можешь пушить этот массив хоть спецсимволами. Цель этой задачи, как и всех остальных, закрепить твои знания.
Должен быть отдельный скрипт, bootstrap.php который инициализирует приложение, в том числе настраивает автозагрузку.
>>675921
Ангулар это JS фреймворк вообще-то. Ты не можешь выполнить яваскрипт код в PHP (с оговорками).
>>675923
Потому что оно входит в "умение читать и понимать чужой код" и "умение настроить рабочее окружение"
>>675965
Скобки надо ставить
>>675986
Да и расшифровку
>>676008
Подумаем потом над формулировкой. Имеется в виду то, что шифруются не все буквы и часть текста видна.
В этой задаче конечно очевидно, что ты догадался правильно. Но при реальной работе с заказчиками обязательно нужно упрямо переспрашивать, что они имели ввиду, потому что на кону деньги и репутация. Чтобы потом не оказалось, что он "не то имел ввиду".
>>676010
>Задание ты выполнил (если тебя интересует решение)
Сам понял что сказал?
>>676026
Нет, ты.
>>674055
> Установите необходимые зависимости используя composer (composer install).
> Сгенерируйте файлы автозагрузки используя composer (composer dump-autoload).
install генерирует файл автозагрузки
> Загрузите файлы приложения в корневой каталог вашего веб-сервера.
Наоборот, надо настроить чтобы корень сервера был в public
Фраза "введите часть имени, фамилии..." не помещается в поле поиска. Плохо что поле поиска исчезает при поиске - нельзя подправить содержимое.
Поиск регистрозависимый - "ива" не находит имя "Иван"
По форме - не очень удачное решение с расположением полей и лейблов, лейблы находятся между полями и непонятно к чему - верхнему или нижнему полю он относится. Для такой схемы надо добавлять отступы, чтобы рядом с лейблом было только одно поле. Или, что лучше, вынести лейблы влево.
Если таблица пуста, то только шапка выглядит довольно бессмысленно. Надо выводить либо внутри, либо вместо таблицы фразу "Список студентов пуст" (в случае поиска лучше писать "Не найдено ни одного студента")
При сортировке надо показывать что сортировка включена с помощью стрелочки или треугольника у выбранной колонки.
"Форма успешно заполнена" - странный текст, лучше "Вы успешно зарегистрированы"/"Информация обновлена".
Алсо, что за выбор между приезжим и иногородним? Это не одно и то же?
Не написано что имя должно начинаться с большой буквы.
> type = pgsql
А твой проект поддерживает другие базы данных? Если нет то этот параметр конфига лишний.
> enableFiller = false
Скрипт заполнения БД лучше сделать скриптом для командной строки. Тогда не нужна защита от запуска, также мы получаем независимость от ограничений по времени для веб-скриптов, полчаем возможность прервать скрипт, можем передавать параметры и тд. Такие вещи надо делать через командную строку. И вынеси скрипт из веб-папки тогда. Ну и контроллер тогда ему не нужен - нужный код можно написать прямо в скрипте, если он простой.
мануал в помощь http://php.net/manual/ru/features.commandline.php
https://github.com/foobar1643/student-list/blob/master/public/logout.php
Для логаута должен быть метод где-то в менеджере авторизации. И его стоит вызывать.
> names.txt
На будущее: есть мощная библиотека php faker для генерации чего угодно. В том числе русские имена там есть по моему.
> function runApp($app) {
Тайп хинт бы сюда.
> } catch(PDOException $e) {
> } catch(FatalException $e) {
Почему тут только эти 2 исключения ловятся? Как ты составил список этих исключений, по каким принципам? Что делать с исключениями других классов?
> $c["config"]->getValue('db', 'type') . ":dbname=".
> $c["config"]->getValue('db', 'name') . ";host=".
Не очень хорошо читается. Можно $c["config"] заменить на переменную, и использовать sprintf для подстаноки параметров в строку.
> https://github.com/foobar1643/student-list/blob/master/app/Controller/ControllerIndex.php#L27
> if($_GET) {
Этот иф тут лишний по моему и не несет никакой пользы
> $currentPage = $_GET['page'];
Стоит добавить intval - на всякий случай (и min/max чтобы нельзя было указать число меньше 1)
> if(trim($_GET['search']) != "") {
> $linkBuilder->searchPattern = $_GET['search'];
А почему второй раз trim не делаетяс? Почти всегда для данных из форм надо делать trim.
> get_total_students(
> getValue
Что-то нет единообразия в стиле
> https://github.com/foobar1643/student-list/blob/master/templates/index.html#L10
> if(!isset($linkBuilder->searchPattern)):
Разве в обхекте может отсутсвовать поле? Или это такая закамуфлированная проверка на null?
https://github.com/foobar1643/student-list/blob/master/templates/index.html#L33
По идее ссылки надо экранировать через htmlspecialchars, в частности символ & в них
> if($_POST) {
Проверять лучше проверкой REQUEST_METHOD в _SERVER
Вот тут у тебя слишком большая простыня: https://github.com/foobar1643/student-list/blob/master/app/Controller/ControllerForm.php
Много вложенных ифов, очень трудно понять логику. Надо бы как-то это упростить, может что-то вынести в отдельные методы. Важно уметь разбивать код на отдельные части, а не писать стеной.
> if(!$tokenHelper->checkCsrfToken($_POST['csrf_field'], $_COOKIE['token']))
Эти элементы могут отсутствовать, будет ошибка обращения к несуществующему индексу
https://github.com/foobar1643/student-list/blob/master/app/Controller/ControllerIndex.php#L41
> $error = true;
Эта переменная создана в блоке else, значит использовать ее можно только в нем - снаружи она может оказаться не определена.
> https://github.com/foobar1643/student-list/blob/master/app/Helper/FormHelper.php#L42
> public function getAllowedFields() {
> return ['id',
id разрешено редактировать?
Обновление студента безопаснее делать по-другому. Надо загрузить студента из БД, а потом обновлять его из POST если там присутсвует поле. Тогда в случае если из формы уберут часть полей, ничего не сломается. У тебя в этом случае при редактирвоании отсутствующие поля обнулятся.
И ведь ты все равно потом в конце загружаешь этот студента. Надо это делать в начале. Не знаю, упомянуто ли это в моем уроке про формы, если упомянуто, то перечитай его.
> $errors = $formHelper->validateStudent($student);
> if($dataGateway->checkEmail($student->email, $student->id) != 0) {
Непонятно почему проверка емайла не входит в функцию валидации
> !isset($error)) {
Что это? переменная может существовать, а может и не существовать?
Также, я не понимаю логику работы с куками auth и token. Работать с ними лучше не напрямую, усложняя код, а вынеся в отдельные методы с понятными именами. Например для csrf можно сделать один класс, для авторизационной куки - другой. Какие в них должны быть методы, подумай сам. Также, подумай над таким вопросом: допустим у тебя будет еще одна таблица, модель и форма ее редактирования. Сколько кода тебе придется скопипастить во второй контроллер? Весь код работы с куками придется многократно дублирвоать - это признак что что-то неудачно спроектировано.
https://github.com/foobar1643/student-list/blob/master/app/Helper/PaginationHelper.php#L23
> for($i = 1; $i < $page; $i++) {
> $offset += $this->recordsPerPage;
Умножение не годится?
https://github.com/foobar1643/student-list/blob/master/app/Helper/LinkHelper.php
Название плохое. Можно подумать это хелпер для любых ссылок, на самом деле только для ссылок на страницу с таблицей.
> в формате #_vnameANUSsit?b>ePUNCTUMc|~Fom
На будущее: для примеров есть специальный домен example.com (и его русская версия испытание.рф по моему)
> [А-ЯЁA-Z]{1}
А зачем {1}?
> Год рождения должен быть не меньше 1900 и не больше 2000.
> не больше 2000.
Ой ли? Менять ведь скоро придется.
> [1][9]
Зачем квадратные скобки? Может тебе задачки на регулярки вспомнить стоит?
https://github.com/foobar1643/student-list/blob/master/app/Model/Student.php
Константы принято ставить в самом начале. Порядок такой: Константы, публичные поля, остальные поля, конструктор, магические методы, публичные методы, остальные.
https://github.com/foobar1643/student-list/blob/master/app/Exception/ExceptionHandler.php
Это не исключение, наверно лучше в другую папку поместить.
https://github.com/foobar1643/student-list/blob/master/app/Exception/FatalException.php
Хотелось бы комментарий чем исключение этого типа отличается от других
> if($names && $surnames) {
> while(($line = fgets($names)) !== false) array_push($names_array["names"], trim($line));
Попробуй сделать это же через file(), array_map(), array_filter() и trim()
Также, вместо функции readNames читающей 2 файла лучше было сделать читающую файл с указанными именем.
.... продолжение ниже ...
>>674055
> Установите необходимые зависимости используя composer (composer install).
> Сгенерируйте файлы автозагрузки используя composer (composer dump-autoload).
install генерирует файл автозагрузки
> Загрузите файлы приложения в корневой каталог вашего веб-сервера.
Наоборот, надо настроить чтобы корень сервера был в public
Фраза "введите часть имени, фамилии..." не помещается в поле поиска. Плохо что поле поиска исчезает при поиске - нельзя подправить содержимое.
Поиск регистрозависимый - "ива" не находит имя "Иван"
По форме - не очень удачное решение с расположением полей и лейблов, лейблы находятся между полями и непонятно к чему - верхнему или нижнему полю он относится. Для такой схемы надо добавлять отступы, чтобы рядом с лейблом было только одно поле. Или, что лучше, вынести лейблы влево.
Если таблица пуста, то только шапка выглядит довольно бессмысленно. Надо выводить либо внутри, либо вместо таблицы фразу "Список студентов пуст" (в случае поиска лучше писать "Не найдено ни одного студента")
При сортировке надо показывать что сортировка включена с помощью стрелочки или треугольника у выбранной колонки.
"Форма успешно заполнена" - странный текст, лучше "Вы успешно зарегистрированы"/"Информация обновлена".
Алсо, что за выбор между приезжим и иногородним? Это не одно и то же?
Не написано что имя должно начинаться с большой буквы.
> type = pgsql
А твой проект поддерживает другие базы данных? Если нет то этот параметр конфига лишний.
> enableFiller = false
Скрипт заполнения БД лучше сделать скриптом для командной строки. Тогда не нужна защита от запуска, также мы получаем независимость от ограничений по времени для веб-скриптов, полчаем возможность прервать скрипт, можем передавать параметры и тд. Такие вещи надо делать через командную строку. И вынеси скрипт из веб-папки тогда. Ну и контроллер тогда ему не нужен - нужный код можно написать прямо в скрипте, если он простой.
мануал в помощь http://php.net/manual/ru/features.commandline.php
https://github.com/foobar1643/student-list/blob/master/public/logout.php
Для логаута должен быть метод где-то в менеджере авторизации. И его стоит вызывать.
> names.txt
На будущее: есть мощная библиотека php faker для генерации чего угодно. В том числе русские имена там есть по моему.
> function runApp($app) {
Тайп хинт бы сюда.
> } catch(PDOException $e) {
> } catch(FatalException $e) {
Почему тут только эти 2 исключения ловятся? Как ты составил список этих исключений, по каким принципам? Что делать с исключениями других классов?
> $c["config"]->getValue('db', 'type') . ":dbname=".
> $c["config"]->getValue('db', 'name') . ";host=".
Не очень хорошо читается. Можно $c["config"] заменить на переменную, и использовать sprintf для подстаноки параметров в строку.
> https://github.com/foobar1643/student-list/blob/master/app/Controller/ControllerIndex.php#L27
> if($_GET) {
Этот иф тут лишний по моему и не несет никакой пользы
> $currentPage = $_GET['page'];
Стоит добавить intval - на всякий случай (и min/max чтобы нельзя было указать число меньше 1)
> if(trim($_GET['search']) != "") {
> $linkBuilder->searchPattern = $_GET['search'];
А почему второй раз trim не делаетяс? Почти всегда для данных из форм надо делать trim.
> get_total_students(
> getValue
Что-то нет единообразия в стиле
> https://github.com/foobar1643/student-list/blob/master/templates/index.html#L10
> if(!isset($linkBuilder->searchPattern)):
Разве в обхекте может отсутсвовать поле? Или это такая закамуфлированная проверка на null?
https://github.com/foobar1643/student-list/blob/master/templates/index.html#L33
По идее ссылки надо экранировать через htmlspecialchars, в частности символ & в них
> if($_POST) {
Проверять лучше проверкой REQUEST_METHOD в _SERVER
Вот тут у тебя слишком большая простыня: https://github.com/foobar1643/student-list/blob/master/app/Controller/ControllerForm.php
Много вложенных ифов, очень трудно понять логику. Надо бы как-то это упростить, может что-то вынести в отдельные методы. Важно уметь разбивать код на отдельные части, а не писать стеной.
> if(!$tokenHelper->checkCsrfToken($_POST['csrf_field'], $_COOKIE['token']))
Эти элементы могут отсутствовать, будет ошибка обращения к несуществующему индексу
https://github.com/foobar1643/student-list/blob/master/app/Controller/ControllerIndex.php#L41
> $error = true;
Эта переменная создана в блоке else, значит использовать ее можно только в нем - снаружи она может оказаться не определена.
> https://github.com/foobar1643/student-list/blob/master/app/Helper/FormHelper.php#L42
> public function getAllowedFields() {
> return ['id',
id разрешено редактировать?
Обновление студента безопаснее делать по-другому. Надо загрузить студента из БД, а потом обновлять его из POST если там присутсвует поле. Тогда в случае если из формы уберут часть полей, ничего не сломается. У тебя в этом случае при редактирвоании отсутствующие поля обнулятся.
И ведь ты все равно потом в конце загружаешь этот студента. Надо это делать в начале. Не знаю, упомянуто ли это в моем уроке про формы, если упомянуто, то перечитай его.
> $errors = $formHelper->validateStudent($student);
> if($dataGateway->checkEmail($student->email, $student->id) != 0) {
Непонятно почему проверка емайла не входит в функцию валидации
> !isset($error)) {
Что это? переменная может существовать, а может и не существовать?
Также, я не понимаю логику работы с куками auth и token. Работать с ними лучше не напрямую, усложняя код, а вынеся в отдельные методы с понятными именами. Например для csrf можно сделать один класс, для авторизационной куки - другой. Какие в них должны быть методы, подумай сам. Также, подумай над таким вопросом: допустим у тебя будет еще одна таблица, модель и форма ее редактирования. Сколько кода тебе придется скопипастить во второй контроллер? Весь код работы с куками придется многократно дублирвоать - это признак что что-то неудачно спроектировано.
https://github.com/foobar1643/student-list/blob/master/app/Helper/PaginationHelper.php#L23
> for($i = 1; $i < $page; $i++) {
> $offset += $this->recordsPerPage;
Умножение не годится?
https://github.com/foobar1643/student-list/blob/master/app/Helper/LinkHelper.php
Название плохое. Можно подумать это хелпер для любых ссылок, на самом деле только для ссылок на страницу с таблицей.
> в формате #_vnameANUSsit?b>ePUNCTUMc|~Fom
На будущее: для примеров есть специальный домен example.com (и его русская версия испытание.рф по моему)
> [А-ЯЁA-Z]{1}
А зачем {1}?
> Год рождения должен быть не меньше 1900 и не больше 2000.
> не больше 2000.
Ой ли? Менять ведь скоро придется.
> [1][9]
Зачем квадратные скобки? Может тебе задачки на регулярки вспомнить стоит?
https://github.com/foobar1643/student-list/blob/master/app/Model/Student.php
Константы принято ставить в самом начале. Порядок такой: Константы, публичные поля, остальные поля, конструктор, магические методы, публичные методы, остальные.
https://github.com/foobar1643/student-list/blob/master/app/Exception/ExceptionHandler.php
Это не исключение, наверно лучше в другую папку поместить.
https://github.com/foobar1643/student-list/blob/master/app/Exception/FatalException.php
Хотелось бы комментарий чем исключение этого типа отличается от других
> if($names && $surnames) {
> while(($line = fgets($names)) !== false) array_push($names_array["names"], trim($line));
Попробуй сделать это же через file(), array_map(), array_filter() и trim()
Также, вместо функции readNames читающей 2 файла лучше было сделать читающую файл с указанными именем.
.... продолжение ниже ...
> $data["names"][mt_rand(0, count($data["names"])-1)];
Стоило сделать метод выбирающий 1 случайное значение массива
https://github.com/foobar1643/student-list/blob/master/templates/form.html#L21
Не надо в шаблоне лезть в куки, дожна быть переменная $isEdit
> value="<?php if($student->name): ?><?= htmlspecialchars($student->name); ?><?php endif; ?>"
Не нужен if
> if($student->gender == 'male'
Лучше бы константой
> Exception message: <?= $e->getMessage() ?></center>
Лучше через __toString() выводить - деталей больше
И что за тег center? Он устарел много лет назад. Советую пройти уроки по HTML/CSS, ну или если ты их прошел, найти актуальный список тегов. У меня только на английском есть:
https://en.wikipedia.org/wiki/HTML_element
https://www.w3.org/TR/html-markup/elements.html
https://developer.mozilla.org/en-US/docs/Web/HTML/Element
Ну и давай уже доделывать эту задачу и переходить к фреймворкам, изучать twig и что там еще есть.
> $data["names"][mt_rand(0, count($data["names"])-1)];
Стоило сделать метод выбирающий 1 случайное значение массива
https://github.com/foobar1643/student-list/blob/master/templates/form.html#L21
Не надо в шаблоне лезть в куки, дожна быть переменная $isEdit
> value="<?php if($student->name): ?><?= htmlspecialchars($student->name); ?><?php endif; ?>"
Не нужен if
> if($student->gender == 'male'
Лучше бы константой
> Exception message: <?= $e->getMessage() ?></center>
Лучше через __toString() выводить - деталей больше
И что за тег center? Он устарел много лет назад. Советую пройти уроки по HTML/CSS, ну или если ты их прошел, найти актуальный список тегов. У меня только на английском есть:
https://en.wikipedia.org/wiki/HTML_element
https://www.w3.org/TR/html-markup/elements.html
https://developer.mozilla.org/en-US/docs/Web/HTML/Element
Ну и давай уже доделывать эту задачу и переходить к фреймворкам, изучать twig и что там еще есть.
>В этой задаче конечно очевидно, что ты догадался правильно. Но при реальной работе с заказчиками обязательно нужно упрямо переспрашивать, что они имели ввиду, потому что на кону деньги и репутация. Чтобы потом не оказалось, что он "не то имел ввиду".
Да я всегда привык переспрашивать, пока на 100% не пойму что от меня хотят. Часто это многих бесит, кто-то считает тупым, но для меня лучше переспросить и знать что от меня нужно а не угадывать.
>подтолкните в нужное русло
Установи нормальную иде с подсветкой и автодополнением.
Набирай в ней и копируй на идеоне, когда хочешь выложить код.
Скобка там пропущена, легко не заметить.
unexpected end of file всегда говорит, что где-то не закрыт блок.
Если бы разобрался с предыдущей задачей на Айфон, как я тебе подсказывал, то сейчас не было бы этой проблемы.
Нам же тут делать нечего больше, мы поэтому подсказываем, ты так думаешь? Как раз предостерегал от долгой возни с задачей на Айпад, всё это проходили сто раз.
Как раз именно устранение прошлого недочёта тебе сейчас бы помогло.
ну че впадлу сказать что ли? у меня уже залит ангуляр на убунту, у меня этот сраный ангуляр работатет netbeans html, ну нету нету его сраного модуля в нетбинс php я что сдела м уеба?
какая же ты тупая высокомерная мразь это просто пиздец. прям каждый раз противно заходить в этот тред и что-то спрашивать. убейся плз
1. $compulsoryPayment = ( $credit х $percent ) + $service; если стоит вне цикла, то к чему приводит, как ты полагаешь? В цикле должно всё обновляться, а этого не происходит.
2. $credit = $credit - $monthly; - а к чему тогда вообще введена дополнительная переменная $compulsoryPayment, если она нигде не принимает дальше участия?
Перечитай свой вопрос:
> Короче мне элементы ангуляр кода как в пхп выполнить? это обычная иде,
Ангулар код выполняется в браузере, а не в ИДЕ. И перед тем как браться за него надо очень хорошо изучить JS, DOM. Судя по твоим вопросам ты пока не очень понял что это вообще такое.
У тебя в регулярке с жы/шы за счет точек со звездочкой захватывается вся остальная часть строки и больше таких ошибок не находится. Надо ограничить число захватываемых символов.
> [!,;:?.]\\S
Надо допилить чтобы не реагировало на многоточиеи и многовопросие.
> {1,}
Это то же самое что плюс
> (а|но){1,}
Зачем там разрешено повторение? Искать слова вроде "нононо" или "аноано"?
> здел(ал|аю|ан)
А "зделаешь" найдет?
> var_dump($match);
Разберись в формате массива результатов и сделай нормальный вывод циклом (читай мануал по функции). Например "зделал" почему-то 2 раза вывелось.
>>670144
Нету точки с запятой в строке перед break
>>670215
Погугли. Это больше для фронтендщиков.
У тебя в регулярке с жы/шы за счет точек со звездочкой захватывается вся остальная часть строки и больше таких ошибок не находится. Надо ограничить число захватываемых символов.
> [!,;:?.]\\S
Надо допилить чтобы не реагировало на многоточиеи и многовопросие.
> {1,}
Это то же самое что плюс
> (а|но){1,}
Зачем там разрешено повторение? Искать слова вроде "нононо" или "аноано"?
> здел(ал|аю|ан)
А "зделаешь" найдет?
> var_dump($match);
Разберись в формате массива результатов и сделай нормальный вывод циклом (читай мануал по функции). Например "зделал" почему-то 2 раза вывелось.
>>670144
Нету точки с запятой в строке перед break
>>670215
Погугли. Это больше для фронтендщиков.
Так-то нормально, конечно.
Тогда посмотри на подсказки выше - у тебя там просто самих по себе ошибок много в задаче про Айпад (просто напутал ты там в самом коде).
> $creditSum x $percent / 100 + $comission
Это аж 3 раза скопировано. Попробуй убрать повторы.
Также, считает неправильно, если поставить суму в 1000 р - должно быть 2030 р во втором банке, а у тебя 2940: http://ideone.com/LRhmsn
>>670686
Я бы только вместо одного пробела разрешил любое число, а так верно.
>>670728
Верные - код праивльный, число цифр тоже.
>>670746
> (?:-?\d){5} # и еще пять цифр с опциональными дефисами. кiнец.
А почему пробелы не разрешены? Вроде "8 900 123 45 67"
>>670937
> пройти курсы кодакадеми js, jqeury
Там по моему js очень ознакомительный, надо DOM хорошо изучить прежде чем браться за jquery. У нас есть задачки, но быстро их не пройти.
> далее уже конкретно изучать бутстрап, чтоб иметь общее представление
перед ним надо хорошо изучить HTML/CSS
> оттуда уже комплексно углубляться в less
Что там углубляться-то? Это всего лишь надстройка над CSS. И странная идея изучать LESS до CSS.И jquery до js.
> $creditSum x $percent / 100 + $comission
Это аж 3 раза скопировано. Попробуй убрать повторы.
Также, считает неправильно, если поставить суму в 1000 р - должно быть 2030 р во втором банке, а у тебя 2940: http://ideone.com/LRhmsn
>>670686
Я бы только вместо одного пробела разрешил любое число, а так верно.
>>670728
Верные - код праивльный, число цифр тоже.
>>670746
> (?:-?\d){5} # и еще пять цифр с опциональными дефисами. кiнец.
А почему пробелы не разрешены? Вроде "8 900 123 45 67"
>>670937
> пройти курсы кодакадеми js, jqeury
Там по моему js очень ознакомительный, надо DOM хорошо изучить прежде чем браться за jquery. У нас есть задачки, но быстро их не пройти.
> далее уже конкретно изучать бутстрап, чтоб иметь общее представление
перед ним надо хорошо изучить HTML/CSS
> оттуда уже комплексно углубляться в less
Что там углубляться-то? Это всего лишь надстройка над CSS. И странная идея изучать LESS до CSS.И jquery до js.
> Хочешь меньше думать? Готовься выложить больше процессорного времени и памяти.
1) разница не всегда значительна 2) взамен за экономию проц. времени придется расплачиваться большей тратой человеческого времени. Что более ограниченный ресурс?
> не давай PHP спуститься на уровень ниже
Он и не дает. Там нет ни указателей ни работы с памятью напрямую. Это просто архитектурные недостатки языка, отсутсвие прозрачной поддержки кодировок, они являются источником сложностей для начинающих и багов для неначинающих. Разработчики PHP сэкономили свое время - мы тратим свое.
>>671133
Транзакции не нужны? Ты это серьезно?
> слоупочными table locks
Ты ничего не путаешь? Это в nosql продуктах есть collection lock, а в innodb используется MVCC.
>>671135
Можно генерацию 2 первых строк сделать циклом из 2 шагов, чтобы не копипастить код.
>>671151
В мануал с этим вопросом плиз
Да, ссылок лучше я не нашел. try/catch там используется может чтобы просто показать что пдо выбрасывает исключения? Или автор плохо знает эту тему? В любом случае так писать неправильно, как там. Попробуй разобраться в исключениях и сам это поймешь.
>>671204
Можно делать верстку и PHP параллельно. Да и как не важно? Как ты будешь HTML писать?
>>671223
> public function addChild(TreeElement $child){
> if($this->getRootElement()->findDescendant($child->getNodeName())){
Не годится, лучше искать не по имени а по совпадению с самим объектом. Объект сам по себе уникален и не требуются имена чтобы найти такой же.
> public function addChild(TreeElement $child){
> if($this->getRootElement()->findDescendant($child->getNodeName())){
А что если он в другом дереве? Надо проверять родителя элемента.
Алсо не надо возвращать false, какой смысл если ты ничего другого все равно не возвращаешь? Лучше исключение выбросить либо напритмер сделать правило что в этом случае элемент отдельяется от старого родителя.
> public function setChildNodes($newNodes){
Смысл функции непонятен
> setParentNode($node){
Тайп хинт бы сюда
> if($node->isAncestor($this)){
> return true;
return $node->isAncestor(...);
> if($this->parentNode){
> $depth++;
> $depth+= $this->parentNode->getDepth();
if (...) {
return $this->parentNode->getDepth() + 1;
}
> foreach ($children as $key => $child) {
> $element = array_splice($children, $key, 1);
тут указывается номер элемента, а не ключ. У тебя при удалении появляются дырки в индексах и ключ не равен номеру.
Да, ссылок лучше я не нашел. try/catch там используется может чтобы просто показать что пдо выбрасывает исключения? Или автор плохо знает эту тему? В любом случае так писать неправильно, как там. Попробуй разобраться в исключениях и сам это поймешь.
>>671204
Можно делать верстку и PHP параллельно. Да и как не важно? Как ты будешь HTML писать?
>>671223
> public function addChild(TreeElement $child){
> if($this->getRootElement()->findDescendant($child->getNodeName())){
Не годится, лучше искать не по имени а по совпадению с самим объектом. Объект сам по себе уникален и не требуются имена чтобы найти такой же.
> public function addChild(TreeElement $child){
> if($this->getRootElement()->findDescendant($child->getNodeName())){
А что если он в другом дереве? Надо проверять родителя элемента.
Алсо не надо возвращать false, какой смысл если ты ничего другого все равно не возвращаешь? Лучше исключение выбросить либо напритмер сделать правило что в этом случае элемент отдельяется от старого родителя.
> public function setChildNodes($newNodes){
Смысл функции непонятен
> setParentNode($node){
Тайп хинт бы сюда
> if($node->isAncestor($this)){
> return true;
return $node->isAncestor(...);
> if($this->parentNode){
> $depth++;
> $depth+= $this->parentNode->getDepth();
if (...) {
return $this->parentNode->getDepth() + 1;
}
> foreach ($children as $key => $child) {
> $element = array_splice($children, $key, 1);
тут указывается номер элемента, а не ключ. У тебя при удалении появляются дырки в индексах и ключ не равен номеру.
> Или все же нужно именно с пеленок себя приучать к такому стилю?
Нужно сразу приучать. Чтобы не писать стену текста, а разделять код на отдельные действия. Сам полдмай, что лучше читается: слово вроде makeLetterUppercase() или длинное сложное выражение?
Переменные названы неудачно:
text -> sentences
value -> sentence
Из-за таких названий код хуже читается.
>>671354
Если это задача про верстку поста форума, то точно не оно, так как инлайн-блок не растянется на 100% по ширине. Там в замечаниях же написан совет - использовать клеарфикс.
>>671402
Не факт. Но работать с utf-8 можно, просто это не делается автоматически.
>>672465
> for ($q = 0; $q < $height; $q++){
Этот цикл тоже можно заменить array_fill
> M_PI/180;
Есть готовые функции deg2rad и наоборот.
Также, цикл выглядит странно:
> foreach ($screen as $screen){
Ты по моему переменную перезаписываешь собой.
> implode(' ', $screen);
У тебя строки получаются очень длинные и переносятся на новую строку.
Также, так как буквы не квадратные, надо x или y домножать на коэффициент чтобы эллипс превратить в круг
>>672519
Изучи яву
Изучи коллекции в яве
Изучи веб-сервер в яве
Изучи средства работы с БД
Изучи шаблонизатор
Изучи какой-нибудь веб-фреймворк (например play)
> Или все же нужно именно с пеленок себя приучать к такому стилю?
Нужно сразу приучать. Чтобы не писать стену текста, а разделять код на отдельные действия. Сам полдмай, что лучше читается: слово вроде makeLetterUppercase() или длинное сложное выражение?
Переменные названы неудачно:
text -> sentences
value -> sentence
Из-за таких названий код хуже читается.
>>671354
Если это задача про верстку поста форума, то точно не оно, так как инлайн-блок не растянется на 100% по ширине. Там в замечаниях же написан совет - использовать клеарфикс.
>>671402
Не факт. Но работать с utf-8 можно, просто это не делается автоматически.
>>672465
> for ($q = 0; $q < $height; $q++){
Этот цикл тоже можно заменить array_fill
> M_PI/180;
Есть готовые функции deg2rad и наоборот.
Также, цикл выглядит странно:
> foreach ($screen as $screen){
Ты по моему переменную перезаписываешь собой.
> implode(' ', $screen);
У тебя строки получаются очень длинные и переносятся на новую строку.
Также, так как буквы не квадратные, надо x или y домножать на коэффициент чтобы эллипс превратить в круг
>>672519
Изучи яву
Изучи коллекции в яве
Изучи веб-сервер в яве
Изучи средства работы с БД
Изучи шаблонизатор
Изучи какой-нибудь веб-фреймворк (например play)
Это тред PHP, а не алгоритмов.
Так вот, задача была такова. Некоторые страницы запрещены для просмотра незарегистрированными пользователями. Для этих целей в yii есть такая штука как "фильтр" accessControl.
http://www.yiiframework.com/doc/guide/1.1/ru/topics.auth#sec-5
Если коротко, то можно выставить при выполнении каждого действия (action) определенную проверку (фильтр доступа), который в качестве конфига берет массив из метода accessRules.
При попытке незарегистрированного пользователя запросить недозволенный url его перекидывает на страницу логина, это хорошо. Проблема в том, что нужно же как-то сообщить пользователю, что произошло, а не молча редиректить.
Хочется видеть сообщение вида "Вы не имеете доступа к странице $url. Требуется авторизация".
В yii такого (вроде) не предусмотрено.
Что у нас есть из инструментов? Есть HTTP_REFERER, и есть такая штука как Yii::app()->user->returnUrl с довольно странной реализацией.
Если посмотреть исходники, то окажется, что этот метод возвращает сохраненную в сессию переменную, либо (если сессия умерла) базовый url, тупо адрес главной страницы.
http://www.yiiframework.com/doc/api/1.1/CWebUser#getReturnUrl-detail
Документация у yii мутная и бессвязная, некоторые места вообще вводят в заблуждение:
http://www.yiiframework.com/doc/guide/1.1/ru/topics.auth#sec-6
>Если браузер был перенаправлен на страницу входа и вход удачный, вам может понадобиться перенаправить пользователя к той странице, на которой неудачно прошла авторизация. Как же узнать URL той страницы? Мы можем получить эту информацию из свойства returnUrl
Неправда. Как видно из исходного кода, returnUrl выгребает данные из сессии, а кладутся данные в сессию при редиректе. Значит если после того как юзера перекинет на страницу авторизации он вручную походит по другим страницам, а потом вернется назад на страницу логина, то returnUrl по-прежнему будет хранить последний адрес запрещенной страницы.
Но не адрес страницы, с которой пришел пользователь.
Короче, если я напишу в шаблоне страницы логина что-то вроде
if (isset(Yii::app()->user->returnUrl)) { вывести флеш-сообщение с объяснениями причины редиректа }
это не будет работать. returnUrl всегда установлен, как минимум он указывает на главную страницу. Ну и вообще эта фишка задумывалась именно для того чтобы после успешного логина отредиректить пользователя обратно, а не для того чтобы выводить сообщение.
Так как getReturnUrl возвращает по-дефолту адрес главной страницы, можем взять более низкоуровневую вещь, то есть проверить прямо в сессии, есть ли там такая переменная.
Yii::app()->user->getState('__returnUrl'). Если ее там нет, то пользователь сам пришел на страницу логина, и не нужно ему выводить всякие ворнинги.
Проблема в том, что если пользователь сначала запросит запрещенную страницу, его перекинет на логин, он с него уйдет и походит по другим страницам, а потом вернется на страницу логина, ему по-прежнему будет показано сообщение о том, что он когда-то пытался получить доступ к некоей странице.
В общем, сообщение должно быть показано только при редиректе на страницу логина. Если пользователь зашел на нее самостоятельно, никаких сообщений быть не должно.
Решил этот вопрос костылем с реферером. То есть если реферер == returnUrl, тогда показать ахтунг, иначе не показывать.
Грустно как-то, вроде стараюсь писать хороший код, изучаю всякие исходники, а все равно говно какое-то получается. То ли у меня не хватает опыта, то ли yii кривой.
Может выучить симфони, говорят там все там хорошо сделано, что просто нельзя писать плохой код. Правда освоить его непросто, черт знает получится ли, если у меня проблемы даже с yii.
>>676290
Тут все самоучки, в наших деревнях таких страшных слов не слыхивали.
Ну и оп пытается подтолкнуть к тому, чтобы люди учились самостоятельно думать, а не заучивать всякие готовые алгоритмы.
Так вот, задача была такова. Некоторые страницы запрещены для просмотра незарегистрированными пользователями. Для этих целей в yii есть такая штука как "фильтр" accessControl.
http://www.yiiframework.com/doc/guide/1.1/ru/topics.auth#sec-5
Если коротко, то можно выставить при выполнении каждого действия (action) определенную проверку (фильтр доступа), который в качестве конфига берет массив из метода accessRules.
При попытке незарегистрированного пользователя запросить недозволенный url его перекидывает на страницу логина, это хорошо. Проблема в том, что нужно же как-то сообщить пользователю, что произошло, а не молча редиректить.
Хочется видеть сообщение вида "Вы не имеете доступа к странице $url. Требуется авторизация".
В yii такого (вроде) не предусмотрено.
Что у нас есть из инструментов? Есть HTTP_REFERER, и есть такая штука как Yii::app()->user->returnUrl с довольно странной реализацией.
Если посмотреть исходники, то окажется, что этот метод возвращает сохраненную в сессию переменную, либо (если сессия умерла) базовый url, тупо адрес главной страницы.
http://www.yiiframework.com/doc/api/1.1/CWebUser#getReturnUrl-detail
Документация у yii мутная и бессвязная, некоторые места вообще вводят в заблуждение:
http://www.yiiframework.com/doc/guide/1.1/ru/topics.auth#sec-6
>Если браузер был перенаправлен на страницу входа и вход удачный, вам может понадобиться перенаправить пользователя к той странице, на которой неудачно прошла авторизация. Как же узнать URL той страницы? Мы можем получить эту информацию из свойства returnUrl
Неправда. Как видно из исходного кода, returnUrl выгребает данные из сессии, а кладутся данные в сессию при редиректе. Значит если после того как юзера перекинет на страницу авторизации он вручную походит по другим страницам, а потом вернется назад на страницу логина, то returnUrl по-прежнему будет хранить последний адрес запрещенной страницы.
Но не адрес страницы, с которой пришел пользователь.
Короче, если я напишу в шаблоне страницы логина что-то вроде
if (isset(Yii::app()->user->returnUrl)) { вывести флеш-сообщение с объяснениями причины редиректа }
это не будет работать. returnUrl всегда установлен, как минимум он указывает на главную страницу. Ну и вообще эта фишка задумывалась именно для того чтобы после успешного логина отредиректить пользователя обратно, а не для того чтобы выводить сообщение.
Так как getReturnUrl возвращает по-дефолту адрес главной страницы, можем взять более низкоуровневую вещь, то есть проверить прямо в сессии, есть ли там такая переменная.
Yii::app()->user->getState('__returnUrl'). Если ее там нет, то пользователь сам пришел на страницу логина, и не нужно ему выводить всякие ворнинги.
Проблема в том, что если пользователь сначала запросит запрещенную страницу, его перекинет на логин, он с него уйдет и походит по другим страницам, а потом вернется на страницу логина, ему по-прежнему будет показано сообщение о том, что он когда-то пытался получить доступ к некоей странице.
В общем, сообщение должно быть показано только при редиректе на страницу логина. Если пользователь зашел на нее самостоятельно, никаких сообщений быть не должно.
Решил этот вопрос костылем с реферером. То есть если реферер == returnUrl, тогда показать ахтунг, иначе не показывать.
Грустно как-то, вроде стараюсь писать хороший код, изучаю всякие исходники, а все равно говно какое-то получается. То ли у меня не хватает опыта, то ли yii кривой.
Может выучить симфони, говорят там все там хорошо сделано, что просто нельзя писать плохой код. Правда освоить его непросто, черт знает получится ли, если у меня проблемы даже с yii.
>>676290
Тут все самоучки, в наших деревнях таких страшных слов не слыхивали.
Ну и оп пытается подтолкнуть к тому, чтобы люди учились самостоятельно думать, а не заучивать всякие готовые алгоритмы.
Спасибо за замечания, попытаюсь исправить в ближайшие пару дней. По поводу фреймворков - у меня есть почти готовый файлообменник на слиме и твиге, но работа над ним продвигается медленнее чем я планировал.
Держи нас в курсе.
Теперь пиши функцию, которая будет склонять тысячи. Принцип такой же.
Можно было разбить регулярками число на порядки (трех порядков достаточно) и прогнать их через функцию, которая пишет прописью это трехзначное число для каждого порядка, ну и потом через функции, склоняющие миллионы, тысячи и рубли.
Но у тебя интересное решение и оно получится гораздо компактнее, просто подумай немного.
>calculatePayments(39999, 1.02, 0, 5000, 0) + 7777;
Лучше 7777 прибавить к сумме кредита. ОП объяснял это тем, что ведь у Анона нет изначально этих 7777, поэтому он и на них вынужден оформить кредит. В итоге там всё равно самые выгодные условия будут, потому что нет комиссии каждый месяц.
И не забывай, что числа 11 - 20 нельзя склонять по последней цифре, так что твою функцию рублей нужно доработать. Это касается и тысяч и миллионов.
Решал по-другому, укажите на ошибку, анончики :3 проверил, переменные в цикле крутятся, а вот лавеха в банке не мутится
http://ideone.com/P4vMiG
В этом твоём варианте вот что неверно: когда $creditBalance у тебя становится меньше $monthlyPayment, то у тебя следует вот это выражение: $creditBalance = ( $creditBalance х $percent ) + $servicePayment - $monthlyPayment;. И в какой-то момент это уходит в минус, от чего дальше всё идёт неверно.
Подсказка: попробуй ввести отдельную переменную для подсчёта $creditBalance = ( $creditBalance х $percent ) + $servicePayment, ведь именно когда этот момент становится меньше $monthlyPayment, нам и надо просто его выплатить и приплюсовать к $paymentTotal.
ok
Хм
Вроде $creditBalance * $percent + $commission < $monthlyPayment выполняется, когда $creditBalance < 0, и значения поглядел, без минусов. Покурю и подумаю про новую переменную с утра сижу думаю, как решить эту задачку, лол Спасибо, анон.
Нет-нет, у тебя же в теле цикла безо всяких условий стоит $creditBalance = $creditBalance * $percent + $commission - $monthlyPayment;
Это значит, что когда $creditBalance становится, например, 260 рублей, он умножается на проценты, к нему прибавляется комиссия, а потом отнимается 5000 месячной выплаты.
Тут всё уходит в минус.
А дальше срабатывает это условие: if ($creditBalance <= 0) {
break;
}
Добра тебе :3
Позволяет использовать определенный неймспейс (или несколько неймспейсов).
Читал урок ОПа про автозагрузку и неймспейсы? Если нет, почитай https://github.com/codedokode/pasta/blob/master/php/autoload.md
Перед тем как значения отправятся в класс формы, значения $_POST пока не существуют, и, соответственно, в контроллере не имеет смысла пока что создавать этот класс. Очевидным решением напрашивается, то что нужно делать проверку перед этим, но этим у меня занимается вспомогательный метод getPost()
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach ($_POST as $value) {
$value = is_scalar($value) ? $value : '';
$value = trim($value);
}
}
return $_POST;
}
Стоит ли выносить проверку в класс контроллера?
$arr = [1 => 1, 2 => 2];
$extra=[1 => "a", 2 => "b"];
foreach($arr as $key => &$value){
\t $arr[1] = $extra[2];
}
Но мой велосипед не работает. Что я делаю не так?
$arr = [1 => 1, 2 => 2];
$extra=[1 => "a", 2 => "b"];
foreach($arr as $key => &$value){
$arr[1] = $extra[2];
}
var_dump($arr);
array(2) {
[1]=>
string(1) "b"
[2]=>
&int(2)
}
Ну хуй знает.
http://ideone.com/hhWMn7
$letter2 = mb_substr($a, - $i, -1, 1);
неправильно, попробуй заменить на
$letter2 = mb_substr($a, -($i+1), 1);
Ты видишь, пидр, што ты наделал?7
>>677105 >>677107
>только почему в скобках ? и в каких случаях мне их использовать ?
>только почему в скобках ? и в каких случаях мне их использовать ?
ой знак вопроса забыл,вот он - ?
>>677113
Разобрался ли ты с функцией mb_substr?
Почитай у ОПа, какие ей нужны символы для правильной работы, что нам дают отрицательная $i в этой функции или положительная.
Тебе нужно брать по символу с начала строки и с конца.
У тебя это
>$letter1 = mb_substr($a, $i, 1)
>$letter2 = mb_substr($a, -($i+1), 1)
В последнем тебе надо добиться отрицательного значения у $i. Представь, что ты к -1 прибавляешь 1 - что получается? 0 получается.
А теперь вспомни, что нам дают скобки?
Подсказка: сначала производятся действия в скобках, а затем другие в выражении.
Чтобы избежать всех этих скобок, достаточно в начале цикла поставить не $i = 0, а $i равно кое-чему другому, догадайся. Тогда не придётся из нуля делать -1 для первого символа с конца фразы, достаточно будет поставить просто минус перед $i.
но если заменить $i на "$i равно кое-чему другому" то первую букву будет брать не с того места которое нам надо
первую букву -> $letter1
>>677138
тогда это почти ничем не будет отличатся от
>$letter1 = mb_substr($a, $i, 1)
>$letter2 = mb_substr($a, -($i+1), 1)
Так тут то же самое, только другое сокращено.
Я же советовал немного упростить ориентиры для отрывания символов с начала и конца строки, избавиться от этих скобок и -($q+1).
Ну да, в предложенном тобою варианте будет немного понятнее, но смысл останется прежним
Так как ты сделал с той моей подсказкой?
Мне интересно, правильно ли ты меня понял, понял ли принцип работы цикла и функции mb_substr.
Я не тот анон))
Я один раз синглтон из документации переписал и в ответ на тестовое задание отправил.
Мне сказали что он не правильный и там были переопределен гетер и сеттер, так они подумали что я не знаю про магические методы.
Решение Калькулятор-кун! работает не совсем корректно
http://ideone.com/VeXs82
Спать не менее 8 часов в сутки.
А зачем?
Ну они выпустили курс разработки под андроид, а потом что-то затухло всё. Может еще что-то выкатят.
Что это за бред в последнем столбце? Если это вакансии делить на резюме, то это какая-то хуйня.
когда джуном устроишься на работу тогда им и станешь
Когда ты станешь в себе уверен. Некоторые и без знаний но с высокими амбициями ПРОСТО идут и устраиваются и по ходу дела учатся.
Это плейсхолдер куда подставляется цифра. %d выбран так как он уже используется в функции sprintf.
Это отчего же у тебя сложилось такое мнение обо мне?
Порылся по сусекам:
http://www.mediafire.com/download/5o7mmd25bvn2o9d/архив-тредов-с-марта-2015.zip
http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip
http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip
Не помню что именно в них. Тот, котрый 11..20 - это совсем старые треды из /b
Ты можешь сказать, сколько мне запросить за эту работу? Такое украсть не очень то и просто.
Яваскрипт-тред вообще-то где-то там, снаружи.
Код лапшевидный, суматошный, уровня ньюфага. Дизайн хуевый. И проблема в том, что его сердце ты спиздил. http://blankionline.ru/wp-content/themes/Impreza/libs/propis/sum.js
Рублей 200-300 твоя "работа" стоит.
Теперь понятно, а в чём сама суматошность кода? Я с яваскрипт если честно не очень, больше по ПХП.
У меня есть подозрение, что основная проблема, это не использование each (сейчас только вспомнил про такую функцию в jQuery), используя её, можно значительно сократить код.
Хреновые названия классов и переменных.
Теги option, которые красиво сверстать труднее, чем кастомные выбиралки на блоках.
Утонувшие отступы в коде.
Цепочки if, когда есть switch.
>jQuery
Учи читый JS, писать на jQuery то же самое, что писать на Бейсике и мнить себя программистом.
>Теги option, которые красиво сверстать труднее, чем кастомные выбиралки на блоках.
Заказчику нужно было так как сейчас, в смысле без выпадающих списков.
>Учи читый JS, писать на jQuery то же самое, что писать на Бейсике и мнить себя программистом.
Ясно, я на JS вообще редко пишу, я и учил его всего лишь в районе месяца, просто быстро пробежался по самому основному, чтобы разбираться как делать простенькие эффекты, как бы дополнительный скилл для ПХП-пограммиста. Просто подумал, что такое скрипт на ПХП писать нет смысла. Но JS конечно надо подтянуть.
>Заказчику нужно было так как сейчас, в смысле без выпадающих списков.
Ну так и верстал бы блоками. Или ты html+css тоже месяц назад узнал?
>я на JS вообще редко пишу
Какая разница? Я бы не хотел обслуживать написанный тобой PHP-код.
Попробуй в правом нижнем углу windows-1251 поменять на UTF-8.
Вопросы до первой проверки не хочется задавать, но все же. В задании написано:
> "Для поиска по всем колонкам можно применить оператор LIKE к соединенным через пробел значениям столбцов".
Я не понял как написать подобный запрос, появлялись ошибки. Поэтому использовал:
> Другой вариант — искать в нескольких колонках через OR, например name LIKE '%hello%' OR surname LIKE '%hello%'.
Как примерно должен выглядеть запрос из первого варианта?
Еще я не понял как вставить в код класс pager с его методами кроме как для получения свойств. Мой View-Helper::getSortedLink справляется со ссылочной работой. Это неправильно?
Заранее извиняюсь, если что-то не правильно оформил на гитхабе, буду его изучать постепенно. Вот смотрю сейчас страницу своего проекта и там под php комментариями код превращается в сплошной коммент, даже не знаю правильно это или нет.
>Ты по моему переменную перезаписываешь собой.
Нет, но всеравно исправил.
>У тебя строки получаются очень длинные и переносятся на новую строку.
На самом деле, нужно было запилить перенос на следующую строку.
ОП, чому оно у меня такое кривое?с коэффициентами баловался
https://ideone.com/D3cmbK
>Я не понял как написать подобный запрос, появлялись ошибки.
В SQL несколько столбцов можно соединить функцией CONCAT. Если соеденить их через пробел - получится неплохой результат, с помощью которого можно написать простой поиск.
Например SELECT CONCAT(name, ' ', last_name) FROM student_list выдаст результат в одной колонке вида "Имя Фамилия". Если сделаешь то же самое с WHERE и LIKE - получишь поиск.
>Еще я не понял как вставить в код класс pager с его методами кроме как для получения свойств.
Pager наверное должен считать еще оффсет для выборки из базы данных и считать общее кол-во страниц. Но тут я особо код не смотрел, поэтому могу быть не прав, лучше ОПа дождись.
>Вот смотрю сейчас страницу своего проекта и там под php комментариями код превращается в сплошной коммент, даже не знаю правильно это или нет.
Это не правильно, такого быть не должно. Заметь что такое происходит только после первой строки с любым комментарием.
Еще я думаю лучше будет readme оформить в markdown формате, это специальный формат для таких вещей. Подробнее почитать и посмотреть примеры можешь тут:
https://guides.github.com/features/mastering-markdown/
Студентов и файлообменник из ОПовского учебника сделай - на джуниора точно сможешь претендовать.
Хотя на работу им устраиваются и без этого, зависит от самих работодателей и прочего.
Домножение синуса и косинуса дает коррекцию по горизонтали и вертикали. Вопрос был в том, что некоторые буквы расположены криво по отношению друг к другу.
Это не официальная планка. Где-то сидит человек, например, на позиции мида, в другой компании его в джуны определят, а куда-нибудь может и сеньором-помидором залезть. Джун, мид и прочее - это попугаи, планки, устанавливаемые для того, чтобы решать некоторые организационные моменты в плане делегации ответственности и полномочий, а также оплаты, роста и мотивации работника. Как-то так.
Сейчас я ковыряю все это добро на локалке в нетбинсе с заливанием файла по ФТП на обычный shared хостинг при сохранении, и когда приходит время композер апдейтов и прочей многофайловой шняги я запускаю синхронизацию, которая длится хуй знает сколько времени потому что этот уебский ларавел состоит из 5000 файлов.
Это, конечно, большое уебанство, учитывая то, что вожусь я с фреймворками исключительно в образовательных целях, а умение придумывать какие-то дикие костыли мне вряд ли поможет.
Ты можешь при синхронизации закачивать не все файлы а только изменившиеся.
Также, можно сделать аккаунт на cloud9 ide, там бесплатно доступна и командная строка, и можно просматривать сайт, но только пока ты залогинен в браузере. Надо знать линукс.
> с заливанием файла по ФТП на обычный shared хостинг при сохранении
Неправильно, это вообще глупая затея и медленно. Лучше сделать скрипт который будет запускаться вручную, находить и загружать изменившиеся файлы. Может есть для этого программы с интерфейсом, я не знаю, я скрипты пишу.
Что ты за ерунду пишешь. Вот смотри, веб-приложение фактически состоит из 2 частей: той, что работает на сервере (PHP, SQL) и той что на клиенте (HTML, CSS, JS). Как можно одну из этих частей убрать? Никак, нужны обе. Значит и изучать надо и то и другое.
Также, есть очень нездоровая вещь - так как HTML простой, люди ограничиваются тем что изучают синтаксис по даунским видеоурокам и на этом останавливаются. Они же изучают jQuery не зная толком JS. Хуже того, некоторые неосиляторы на этом останавливаются и называют себя фронтендерами. Я не знаю сколько таких людей сейчас в идустрии, иногда мне кажется что много. Надеюсь в будущем их выставят за дверь - с таким отношением они все равно ничего хорошо не сделают.
Вообще, мне это не нравится. Я думаю, надо бы в задаче студентов начинать более строго проверять HTML. Неосиляторы, которым лень 3 недели потратить на верстку, не нужны.
> жалко потраченного на это всё времени,
Сколько же ты времени потратил на изучение основ CSS? Полгода? год? 2 года? На другие специальности люди в вузах учатся по 4-6 лет, к слову. Справедливо и программистов хотя бы года 2-3 заставить учиться.
> Но сколь далече уже продвинулись те, кто не стал решать бонусные задачи, кто не стал решать вот эти задачи на HTML+CSS.
Как можно продвинуться дальше не зная HTML?
> душа требует ООП уже, БД и фреймворков.
Изучай параллельно.
>>673287
Я рассматривал одно из предыддущих изданий, автор учит неправильным вещам. Не учебник, скорее пособие по быдлокодингу.
>>673301
BOM? Там у разработчиков вроде мнение что он в utf-8 не нужен, просто виндоредакторы вроде блокнота любят его вставлять. Хотя я не знаю, может лучше было бы и поддерживать его прозрачно. Но PHP пытается быть агностичен к кодировкам, и в другой кодировке эти байты могут что-то осмысленное означать.
>>673310
Бросай, не мучайся уже.
Что ты за ерунду пишешь. Вот смотри, веб-приложение фактически состоит из 2 частей: той, что работает на сервере (PHP, SQL) и той что на клиенте (HTML, CSS, JS). Как можно одну из этих частей убрать? Никак, нужны обе. Значит и изучать надо и то и другое.
Также, есть очень нездоровая вещь - так как HTML простой, люди ограничиваются тем что изучают синтаксис по даунским видеоурокам и на этом останавливаются. Они же изучают jQuery не зная толком JS. Хуже того, некоторые неосиляторы на этом останавливаются и называют себя фронтендерами. Я не знаю сколько таких людей сейчас в идустрии, иногда мне кажется что много. Надеюсь в будущем их выставят за дверь - с таким отношением они все равно ничего хорошо не сделают.
Вообще, мне это не нравится. Я думаю, надо бы в задаче студентов начинать более строго проверять HTML. Неосиляторы, которым лень 3 недели потратить на верстку, не нужны.
> жалко потраченного на это всё времени,
Сколько же ты времени потратил на изучение основ CSS? Полгода? год? 2 года? На другие специальности люди в вузах учатся по 4-6 лет, к слову. Справедливо и программистов хотя бы года 2-3 заставить учиться.
> Но сколь далече уже продвинулись те, кто не стал решать бонусные задачи, кто не стал решать вот эти задачи на HTML+CSS.
Как можно продвинуться дальше не зная HTML?
> душа требует ООП уже, БД и фреймворков.
Изучай параллельно.
>>673287
Я рассматривал одно из предыддущих изданий, автор учит неправильным вещам. Не учебник, скорее пособие по быдлокодингу.
>>673301
BOM? Там у разработчиков вроде мнение что он в utf-8 не нужен, просто виндоредакторы вроде блокнота любят его вставлять. Хотя я не знаю, может лучше было бы и поддерживать его прозрачно. Но PHP пытается быть агностичен к кодировкам, и в другой кодировке эти байты могут что-то осмысленное означать.
>>673310
Бросай, не мучайся уже.
Разберись откуда этот quot берется. Также, у меня подозрения что тебе надо больше времени уделять изчении теории - ты явно что-то делаешь очень неправильно.
Подозреваю что это из-за того что ты в коде делаешь "очистку" входных переменных с помощью htmlspecialchars, как советую в быдлокодерских учебниках и видеоуроках.
Не читайте их, решайте лучше нашу задачу про студентов.
>>673352
Да, неправильно.
>>673355
Что значит "не работает"?
>>673379
В чем твой вопрос? Что на 4-м скриншоте? Может статья устарела?
>>673384
> W1 - http://ideone.com/PaOLUG
Верно
> W2 - http://ideone.com/sAZs0A
Верно
> W3 - http://ideone.com/7FUXeB
правильно
> W4.1 - http://ideone.com/xN81k7
верно
> W4.2 - http://ideone.com/hDB9f4
Хорошо
> W5.2 - http://ideone.com/b46oYS
Верно, хотя тут цикл со счетчиком - наверно for подошел бы лучше.
> W5.1 - http://ideone.com/isOeeQ
Это мы выше проверили
Разберись откуда этот quot берется. Также, у меня подозрения что тебе надо больше времени уделять изчении теории - ты явно что-то делаешь очень неправильно.
Подозреваю что это из-за того что ты в коде делаешь "очистку" входных переменных с помощью htmlspecialchars, как советую в быдлокодерских учебниках и видеоуроках.
Не читайте их, решайте лучше нашу задачу про студентов.
>>673352
Да, неправильно.
>>673355
Что значит "не работает"?
>>673379
В чем твой вопрос? Что на 4-м скриншоте? Может статья устарела?
>>673384
> W1 - http://ideone.com/PaOLUG
Верно
> W2 - http://ideone.com/sAZs0A
Верно
> W3 - http://ideone.com/7FUXeB
правильно
> W4.1 - http://ideone.com/xN81k7
верно
> W4.2 - http://ideone.com/hDB9f4
Хорошо
> W5.2 - http://ideone.com/b46oYS
Верно, хотя тут цикл со счетчиком - наверно for подошел бы лучше.
> W5.1 - http://ideone.com/isOeeQ
Это мы выше проверили
Не знаю
>>673407
Но там ведь нет сдачи. Со сдачей код бы выглядел примерно так:
требуемая плата = ....;
полученная плата = 5000;
сдача = требуемая плата - полученная плата;
>>673542
Ты не настроил правильно виртуальные хосты.
> Для каждого сайта запись в hosts и виртуалхост в хттпд.конф.
Видимо неправильно. Или сервер забыл перезапустить.
> А то я уже заебался - удалять хтассесы при переходе с реального сервера на локалхост, иметь две разные версии хтассесов
Такие вещи можно автоматизировать скриптами, например на Баш (если линукс или cygwin) или Питоне, или даже на PHP. Зачем руками файлы копировать?
> Можно все это попроще как-то?
Написать скрипт
Я не знаю никаких книг. Есть оф. документация на англ по апачу- там все описано же
https://httpd.apache.org/docs/2.4/vhosts/index.html
https://httpd.apache.org/docs/2.4/vhosts/examples.html
Алсо ты даже свой httpd.conf не запостил
>>675220
Нужен конфиг Апача
>>673633
> W5.3 - http://ideone.com/jWpMfH
Верно
> W5.4 - https://ideone.com/hZNNWf
Верно
> W5.5 - https://ideone.com/kwBJKl
Все правильно
И насчет этой злополучной задачи про кредит. Там в учебнике я специально написал неправильный код, вычитая 5000 каждый месяц без проверки баланса. Почему-то люди принимают его на веру и никто не пытается задуматься, а правильно ли это написано и не надо ли исправить. Видимо, надо будет более толсто намекнуть - написать что-то совсем неправильное.
>>673657
лайки для комментариев
>>673827
> function inclineWord($num){
> function inclineThou($thou){
> function inclineMill($mill){
Это копипаста одной и той же функции - избавься от нее. Алсо, старайся не сокращать так слова. Поставь нормальный редактор с автодополнением, если тяжело печатать так.
> floor($thou%100) <= 11 && floor($thou%100) >= 19 ? $value = " тысяч " : (
> floor($thou%10) == 1 ? $value = " тысяча " : (
Это же кошмар. Надо пытаться писать как можно более простой и логичный код, а не соревноваться кто сможет сложнее его запутать. Это надо переписать ифами.
> function assemblyFunc($num){
> global $units, $from11To19, $tens, $hundreds, $thousands, $millions;
Хорошая функция получает все, что ей надо на вход через аргументы. То, что ты прибегаешь к глобальным переменным говорит о том что ты не смог правильно спроектировать эту функцию. Подумай, что тут будет входными параметрами.
Также, название функции должно начинаться с глагола.
> $numericArr = str_split($num, 3);
Число это не строка, надо использовать математические методы (деление на 10, 100 и тд). Ну и у тебя тут будут потенциальные ошибки. Что если число содержит всего 1 цифру? Вот https://ideone.com/s9ZuhK тут твой код дает ошибку обращения к несуществующему элементу массива.
> foreach($numericArr as $key => $triple){
> global $units, $from11To19, $tens, $hundreds, $thousands, $millions;
Зачем ты второй раз тот же самый глобал пишешь? Ты по моему что-то путаешь.
> $numericArrDouble
Очень неудачное название - непонятно что там хранится
> return $partNumStr;
> }return $partNumStr;
Зачем ты 2 раза return написал?
В общем, пока не годится. Ты забыл что копипаста это зло, что код должен легко читаться.
Я не знаю никаких книг. Есть оф. документация на англ по апачу- там все описано же
https://httpd.apache.org/docs/2.4/vhosts/index.html
https://httpd.apache.org/docs/2.4/vhosts/examples.html
Алсо ты даже свой httpd.conf не запостил
>>675220
Нужен конфиг Апача
>>673633
> W5.3 - http://ideone.com/jWpMfH
Верно
> W5.4 - https://ideone.com/hZNNWf
Верно
> W5.5 - https://ideone.com/kwBJKl
Все правильно
И насчет этой злополучной задачи про кредит. Там в учебнике я специально написал неправильный код, вычитая 5000 каждый месяц без проверки баланса. Почему-то люди принимают его на веру и никто не пытается задуматься, а правильно ли это написано и не надо ли исправить. Видимо, надо будет более толсто намекнуть - написать что-то совсем неправильное.
>>673657
лайки для комментариев
>>673827
> function inclineWord($num){
> function inclineThou($thou){
> function inclineMill($mill){
Это копипаста одной и той же функции - избавься от нее. Алсо, старайся не сокращать так слова. Поставь нормальный редактор с автодополнением, если тяжело печатать так.
> floor($thou%100) <= 11 && floor($thou%100) >= 19 ? $value = " тысяч " : (
> floor($thou%10) == 1 ? $value = " тысяча " : (
Это же кошмар. Надо пытаться писать как можно более простой и логичный код, а не соревноваться кто сможет сложнее его запутать. Это надо переписать ифами.
> function assemblyFunc($num){
> global $units, $from11To19, $tens, $hundreds, $thousands, $millions;
Хорошая функция получает все, что ей надо на вход через аргументы. То, что ты прибегаешь к глобальным переменным говорит о том что ты не смог правильно спроектировать эту функцию. Подумай, что тут будет входными параметрами.
Также, название функции должно начинаться с глагола.
> $numericArr = str_split($num, 3);
Число это не строка, надо использовать математические методы (деление на 10, 100 и тд). Ну и у тебя тут будут потенциальные ошибки. Что если число содержит всего 1 цифру? Вот https://ideone.com/s9ZuhK тут твой код дает ошибку обращения к несуществующему элементу массива.
> foreach($numericArr as $key => $triple){
> global $units, $from11To19, $tens, $hundreds, $thousands, $millions;
Зачем ты второй раз тот же самый глобал пишешь? Ты по моему что-то путаешь.
> $numericArrDouble
Очень неудачное название - непонятно что там хранится
> return $partNumStr;
> }return $partNumStr;
Зачем ты 2 раза return написал?
В общем, пока не годится. Ты забыл что копипаста это зло, что код должен легко читаться.
Нет, но в 99% случаев это и не требуется.
>>673873
Лучше наверно в ява или ньюфаг треде спросить.
>>673946
через query string (GET)
>>673965
Код статуса передавай через GET (/?notify=success). Если сообщение зависит от статуса, передавать его не надо, если там дополнительные данные - либо черз GET либо через сессии (гугли реализацию flash messages) но сессии имеют тот недостаток что разделяются между всеми вкладками браузера + при ошибке загрузки страницы и перезагрузке страницы сообщение потеряется. Традиционный способ все же лучше.
>>673966
> месседж можно выполнить с помощью обычного аллерта.
Не надо так, жутко бесит окно блокирующее страницу
А на оф сайте его не скачать отдельно? В линуксе он скорее всего есть в пакете сфинкса и ставится куда-нибудь в /usr/share
>>674003
Он скорее всего есть в пакете сфинкса либо отдельеым пакетом. Отдельно неудобно так как версии могут не совпадать.
>>674112
Если эксель генерирует файл с нарущением правил CSV, значит придется разбирать файл вручную или как-то преобразовывать.
Также, можно попробовать опеноффис - может он лучше CSV поддерживает.
Также, у меня ощущение что ты что-то напутал, у меня с опенофисом и CSV все работало.
>>674119
Проверь какой получается HTML код, какие там обработчики ставит Юи - по моему там валидация делается то ли аяксом то ли яваскриптом. Так непонятно в чем проблема.
>>674268
Через строку запроса в URL
>>674299
Это только в командной строке
А на оф сайте его не скачать отдельно? В линуксе он скорее всего есть в пакете сфинкса и ставится куда-нибудь в /usr/share
>>674003
Он скорее всего есть в пакете сфинкса либо отдельеым пакетом. Отдельно неудобно так как версии могут не совпадать.
>>674112
Если эксель генерирует файл с нарущением правил CSV, значит придется разбирать файл вручную или как-то преобразовывать.
Также, можно попробовать опеноффис - может он лучше CSV поддерживает.
Также, у меня ощущение что ты что-то напутал, у меня с опенофисом и CSV все работало.
>>674119
Проверь какой получается HTML код, какие там обработчики ставит Юи - по моему там валидация делается то ли аяксом то ли яваскриптом. Так непонятно в чем проблема.
>>674268
Через строку запроса в URL
>>674299
Это только в командной строке
>Есть ли какие-нибудь максимально нищебродские варианты для этого?
Сделать себе локальный сервер. Я не знаю зачем ты заливаешь свои образовательные эксперименты в интернет, но в php есть команда exec которая сможет выполнить любую команду. Таким образом, в теории, можно будет скачать композер через wget и запустить его, но я думаю что такие вещи админы бесплатных хостингов запретили. Конечно, никто тебе не запрещает при синхронизации заливать только те файлы которые изменились.
Ну и для сравнения самый нищебродский вариант на DigitalOcean за пять долларов дает тебе SSH, это если ты смотришь в сторону платных хостингов.
Если каждый день писать код, то не забудешь. Ну то есть ты поначалу будешь лезть в мануал или учебник, но постепенно запомнишь самые нужные функции. Мозг видит что какая-то вещь тебе нужна и запоминает ее.
Алсо, если ты натыкаешься на что-то что изучал ранее, то скорее всего вспомнишь даже если думаешь что забыл. А вообще, я не разбираюсь в этом. Я например изучаю кандзи и забываю их, запоминаю только те, которые встретил много раз или у которых есть интересные особенности или которые как-то связаны (вроде того что слово "молодость" состоит из "зеленый" и "весна", а "осень" = "дерево" + "огонь") и тд. Видимо все дело в повторении и взаимосвязях.
>>674382
Тогда думай как меньше времени тратить на работу, или может можно как-то читать уроки по дороге на работу или еще как-то. Я когда-то работал, а после работы приезжал домой и фрилансил, тяжеловато конечно постоянно так жить.
>>674389
Не помнишь - вспоминай и заново читай мануалы. Закладки делай в браузере. Рано или поздно запомнишь.
>>674390
Надо писать больше кода
>>674399
Бутстрап это набор готовых элементов. Изучать CSS все равно надо, сначала ты в совершщенстве изучаешь CSS а только потом верстаешь.
Освещение, настройки яркости/контрастности крути. У тебя монитор через цифровой выход подключен? Разрешение родное? Алсо, бывают (раньше были) плохие матрицы, где очень низкая контрастность, то есть темные цвет не очень темный - это тоже плохо.
Сейчас вспомнил что у меня в университете тоже когда-то глаза от тамошних ЖК мониторов уставали.
> Бывают ли хорошие ЖК-мониторы,
Бывают.
>>674698
> Вот вроде понятны все преимущества но когда сам пытаюсь получается тот же самый css и длинные классы вместо каскадности.
БЭМ вообще то этого и требует. И ничего хорошего в "каскадности" нет, сколько я не видел кода на less - быдлокод где идет каскад вроде .some-class div span div span. Не надо так писать. Изучай БЭМ лучше.
>>674708
> if ($compulsoryPayment > $monthlyPayment) {
> elseif ($compulsoryPayment < $monthlyPayment) {
А что если они равны друг другу? Это не учтено.
> elseif ($creditBalance >= 0) {
Он тут никогда не сработает так как для этого надо чтобы 2 предыдущих условия не выполнялось. Брейк надо делать в ветке где долг маленький.
Алсо, подумай как можно заменить if на функции min/max.
>>674852
> if(mysqli_num_rows($from_query) ==1)
> elseif(mysqli_num_rows($to_query) ==1)
Почему ты решил что там ровно 1 запись?
Советую переучиваться - код ужасного качества, так писать нельзя. Ужасно, все написано стеной без разбиения на функции, SQL код перемешан с логикой, про плейсхолдеры и обработку ошибок ты не слышал, SQL инъекции присутствуют.
Ты выбрал какой-то плохой учебник - код надо полностью переписывать.
Освещение, настройки яркости/контрастности крути. У тебя монитор через цифровой выход подключен? Разрешение родное? Алсо, бывают (раньше были) плохие матрицы, где очень низкая контрастность, то есть темные цвет не очень темный - это тоже плохо.
Сейчас вспомнил что у меня в университете тоже когда-то глаза от тамошних ЖК мониторов уставали.
> Бывают ли хорошие ЖК-мониторы,
Бывают.
>>674698
> Вот вроде понятны все преимущества но когда сам пытаюсь получается тот же самый css и длинные классы вместо каскадности.
БЭМ вообще то этого и требует. И ничего хорошего в "каскадности" нет, сколько я не видел кода на less - быдлокод где идет каскад вроде .some-class div span div span. Не надо так писать. Изучай БЭМ лучше.
>>674708
> if ($compulsoryPayment > $monthlyPayment) {
> elseif ($compulsoryPayment < $monthlyPayment) {
А что если они равны друг другу? Это не учтено.
> elseif ($creditBalance >= 0) {
Он тут никогда не сработает так как для этого надо чтобы 2 предыдущих условия не выполнялось. Брейк надо делать в ветке где долг маленький.
Алсо, подумай как можно заменить if на функции min/max.
>>674852
> if(mysqli_num_rows($from_query) ==1)
> elseif(mysqli_num_rows($to_query) ==1)
Почему ты решил что там ровно 1 запись?
Советую переучиваться - код ужасного качества, так писать нельзя. Ужасно, все написано стеной без разбиения на функции, SQL код перемешан с логикой, про плейсхолдеры и обработку ошибок ты не слышал, SQL инъекции присутствуют.
Ты выбрал какой-то плохой учебник - код надо полностью переписывать.
брейк надо в ту ветку где долг маленький
>>674865
Норм, хотя если все фразы различаются только цифрой то лучше было бы только эту часть поместить в массив. Не надо копипастить.
>>674922
Гет параметры используй
>>674974
Он просто удаляет авторизационные куки.
>>675021
Все правильно сделал
>>675030
Для формы поиска в бутстрапе есть готовый компонент.
>>675089
Обычно через 6-12 месяцев (cooldown) можно повторить попытку. Ну и такой вопрос можно прямо задать компании - напиши что подучился и хочешь снова попробовать, когда можно будет повторить попытку?
брейк надо в ту ветку где долг маленький
>>674865
Норм, хотя если все фразы различаются только цифрой то лучше было бы только эту часть поместить в массив. Не надо копипастить.
>>674922
Гет параметры используй
>>674974
Он просто удаляет авторизационные куки.
>>675021
Все правильно сделал
>>675030
Для формы поиска в бутстрапе есть готовый компонент.
>>675089
Обычно через 6-12 месяцев (cooldown) можно повторить попытку. Ну и такой вопрос можно прямо задать компании - напиши что подучился и хочешь снова попробовать, когда можно будет повторить попытку?
нужен конфиг апача
>>675276
> if ($i == 2) {
> break;
Неправильно сделано. Надо в шапке цикла прописать "продолжать цикл только пока i меньше 2", а так делать не надо.
> for ($i = 1; $i > 0; $i++) {
Какой смысл имеет $i > 0? Продолжать цикл вечно?
>>675402
Если ты не читал об этом, для тебя бы тоже возможно было неочевидно.
>>675497
Куки нужны для хранения каких-то постоянныех параметров или настроек, тут подходят параметры в query string.
>>675586
Для начала нужно смотреть логи Апача.
>>675608
Можно бы вместо уменьшения length вычислять позицию последней буквы или использовать отрицательные числа.
нужен конфиг апача
>>675276
> if ($i == 2) {
> break;
Неправильно сделано. Надо в шапке цикла прописать "продолжать цикл только пока i меньше 2", а так делать не надо.
> for ($i = 1; $i > 0; $i++) {
Какой смысл имеет $i > 0? Продолжать цикл вечно?
>>675402
Если ты не читал об этом, для тебя бы тоже возможно было неочевидно.
>>675497
Куки нужны для хранения каких-то постоянныех параметров или настроек, тут подходят параметры в query string.
>>675586
Для начала нужно смотреть логи Апача.
>>675608
Можно бы вместо уменьшения length вычислять позицию последней буквы или использовать отрицательные числа.
Название странное. Почему PostForm? Если это форма логина - так и называй ее.
>>676220
> if ($compulsoryPayment > $monthlyPayment) {
> elseif ($compulsoryPayment < $monthlyPayment) {
А что если они равны?
Также, подумай как можно объединить похожий код в 2 ветках if, тут поможет функция min или max.
>>676252
> 39999 + 7777,
Лучше бы передавать 7777 отдельным аругментом, это же как бы отдельное условие для кредита.
Подумай как убрать повторяющийся код в ветках if
>>676298
Изучал бы уже 2-ю версию.
> При попытке незарегистрированного пользователя запросить недозволенный url его перекидывает на страницу логина, это хорошо. Проблема в том, что нужно же как-то сообщить пользователю, что произошло, а не молча редиректить.
Можно использовать GET парамтетр:
/login?from=/some/page&reason=need_login
> Что у нас есть из инструментов? Есть HTTP_REFERER
Неправильно. реферер по стандарту не обязан передаваться и не стоит на него завязываться. Более того, мой способ надежнее.
> и есть такая штука как Yii::app()->user->returnUrl с довольно странной реализацией.
Лучше не использовать тут сессии так как сессия одна на много вкладок.
> Документация у yii мутная и бессвязная,
читай исходники
> Значит если после того как юзера перекинет на страницу авторизации он вручную походит по другим страницам, а потом вернется назад на страницу логина, то returnUrl по-прежнему будет хранить последний адрес запрещенной страницы.
Потмоу надо использовать query string.
В общем, ты там себе голову сломал, а все из-за непоимания того как работает протокол HTTP.
> Решил этот вопрос костылем с реферером.
Это именно что кривой костыль
> То ли у меня не хватает опыта,
Не хватает знания HTTP и того какие в нем есть средства для передачи данных (куки, URL итд). Ну и опыта, да.
>>676648
Не знаю. Может тебе CMS искать?
>>676693
> Перед тем как значения отправятся в класс формы, значения $_POST пока не существуют,
POST существует всегда, только может быть пуст. Использовать его надо если HTTP метод == POST
> foreach ($_POST as $value) {
> $value = is_scalar($value) ? $value : '';
> $value = trim($value);
Это не меняет значения в POST, также ты не должен пытаться их менять. Вообще, тут все неправильно. Ты читал мой урок про работу с формами?
Название странное. Почему PostForm? Если это форма логина - так и называй ее.
>>676220
> if ($compulsoryPayment > $monthlyPayment) {
> elseif ($compulsoryPayment < $monthlyPayment) {
А что если они равны?
Также, подумай как можно объединить похожий код в 2 ветках if, тут поможет функция min или max.
>>676252
> 39999 + 7777,
Лучше бы передавать 7777 отдельным аругментом, это же как бы отдельное условие для кредита.
Подумай как убрать повторяющийся код в ветках if
>>676298
Изучал бы уже 2-ю версию.
> При попытке незарегистрированного пользователя запросить недозволенный url его перекидывает на страницу логина, это хорошо. Проблема в том, что нужно же как-то сообщить пользователю, что произошло, а не молча редиректить.
Можно использовать GET парамтетр:
/login?from=/some/page&reason=need_login
> Что у нас есть из инструментов? Есть HTTP_REFERER
Неправильно. реферер по стандарту не обязан передаваться и не стоит на него завязываться. Более того, мой способ надежнее.
> и есть такая штука как Yii::app()->user->returnUrl с довольно странной реализацией.
Лучше не использовать тут сессии так как сессия одна на много вкладок.
> Документация у yii мутная и бессвязная,
читай исходники
> Значит если после того как юзера перекинет на страницу авторизации он вручную походит по другим страницам, а потом вернется назад на страницу логина, то returnUrl по-прежнему будет хранить последний адрес запрещенной страницы.
Потмоу надо использовать query string.
В общем, ты там себе голову сломал, а все из-за непоимания того как работает протокол HTTP.
> Решил этот вопрос костылем с реферером.
Это именно что кривой костыль
> То ли у меня не хватает опыта,
Не хватает знания HTTP и того какие в нем есть средства для передачи данных (куки, URL итд). Ну и опыта, да.
>>676648
Не знаю. Может тебе CMS искать?
>>676693
> Перед тем как значения отправятся в класс формы, значения $_POST пока не существуют,
POST существует всегда, только может быть пуст. Использовать его надо если HTTP метод == POST
> foreach ($_POST as $value) {
> $value = is_scalar($value) ? $value : '';
> $value = trim($value);
Это не меняет значения в POST, также ты не должен пытаться их менять. Вообще, тут все неправильно. Ты читал мой урок про работу с формами?
10 пробовал на виртуалке? 8 шустрее, чем 7, 10 шустрее, чем 8. Видимо, научились оси пилить наконец.
>>673310
>бросить айти
И дальше что? Ты, видимо, не в курсе ситуации в других профессиональных сферах - там она намного хуже. Ойтишники просто не представляют себе, насколько они охуели и зажрались.
Ей вроде нужна какая-то фича в процессоре, которой у меня то ли нет, то ли в виртуал боксе нет. Она наверно в 32-разрядной системе и не пойдет. А вообще семерка мне понадобилась только ради анализа снятых xperf трейсов.
>там она намного хуже
В том числе и по зарплатам. Особенно по зарплатам. Нигде больше не будут платить ни за хуй собачий. Я безмерно рад тому, что живу во время обезумевшего IT-хайпа, и не знаю, что бы ленивая жирная свинья вроде меня делала, родись она лет на 20 раньше. Наверное, я бы повесился нахуй.
>Неправильно, это вообще глупая затея и медленно. Лучше сделать скрипт который будет запускаться вручную, находить и загружать изменившиеся файлы.
При сохранении в нетбинсе заливается только конкретный сохраняемый файл. А синхронизация, опять же, должна затрагивать только измененные файлы, но на медленном хостинге это, конечно же, тоже очень небыстро.
>>678136
>Я не знаю зачем ты заливаешь свои образовательные эксперименты в интернет
хочу поковырять всякие социальные АПИ, им вроде как обычно нужен адрес до которого они могут достучаться.
А бизнесом нельзя каким-нибудь заниматься? Неужели все дело в айти? Варламов пишет он 3д моделированием первые деньги заработал.
В кремлевской кормушке твой Варламов зарабатывает. А 3д моделирование это чтобы ничего такого не подумали.
Ойти можно рассматривать как бизнес, почему нет? Пока IT-бизнес у нас еще не задавили, хотя поползновения имеются. По крайней мере, ситуация здесь куда лучше, чем в каком-нибудь продуктовом, где к тебе выстроится огромная очередь проверяющих с протянутой рукой.
>Варламов
Не говорит, сколько ему Потупчик перечисляет? Ну и правильно.
>Куки нужны для хранения каких-то постоянныех параметров или настроек, тут подходят параметры в query string.
Ему там авторизация нужна, как я понял. Для неё использовать куки.
До тех пор пока нам не закроют интернет окончательно, проблем с айти вакансиями не будет. В западных странах полно контор, в которых управляющие мечтают заменить разжиревших местных программистов получающих $100/час на неприхотливых дикарей, для которых и 15/час - заоблачные суммы.
А что делать людям, которым неинтересно программирование или надоело? Хотя это конечно оффтопик.
Алсо на западе та же ерунда, непрограммисты живут довольно бедно, https://vc.ru/p/yelp-fired
Нет, ему надо выводить сообщение почему пользователя перебросило на форму логина. И сохранять обратный адрес для возврата.
>что делать людям, которым неинтересно программирование или надоело
Не знаю.
>непрограммисты живут довольно бедно
Ну, блджад, это охуеть пример, конечно - Сан-Франциско и СИЛИКОНОВАЯ ДОЛИНА с охуевшими работодателями и риэлторами, дерущими по три шкуры. Работодатели там могут предложить зарплату ниже среднерыночной, т.к. там на каждую вакансию толпа народу, жаждущего работать в ТАКИХ-ТО КОМПАНИЯХ, и это еще касается IT-персонала. Как там жить понаехавшей обслуге типа курицы из статьи по ссылке, я не знаю. Это как понаехать в Москву из мухосрани и жаловаться, что 30 тыщ за работу кассиром в Ашане хватает только на съем халупы в трех километрах от метро - у нас-то это никого почему-то не удивляет.
На посты за 4-6 марта, на которые я пока не ответил, я отвечу тут.
Не пишите здесь больше. Переходите в новый тред.
|
|
+--subclass - тут у меня класс наследующий класс /classes/Class.php с именем Subclass
|
|
+index.php - а тут я создаю экземпляр Subclass
Как мне сделать, чтобы всё это автоматически подключалось и не нужно было бы при добавлении новых классов писать бесконечные include
> Это как понаехать в Москву из мухосрани и жаловаться, что 30 тыщ за работу кассиром в Ашане хватает только на съем халупы
Можно не ехать в Москву, аренда жилья дешевле но и зарплаты намного ниже. Думаю и в США так же - в СФ минимальная з/п $12.15, а в других штатах может быть 6-8 в час. Алсо пост в оригинале читать интереснее, и комментарии тоже.
Переходите в новый тред >>678185 (OP)
В новый тред плиз.
Тебе же выше написали про файл boostrap.php >>675906
АЛсо читай пост про автозагрузку https://github.com/codedokode/pasta/blob/master/php/autoload.md
>Алсо на западе та же ерунда, непрограммисты живут довольно бедно
На западе врачи и юристы например, получают куда больше программистов, а эта тян могла бы снимать квартиру с кем-то вдвоём и у ней бы не было проблем тогда.
Упражнение "Клавиша Шифт" в "Повторим?":
http://ideone.com/g82wBb
Что-то мне подсказывает, что есть метод получше.
>Что ты за ерунду пишешь
Братишка, ОП, согласен со всем, именно поэтому и не пропустил эти уроки на HTML и CSS.
Но я ведь изучаю только для своего проекта, мне кажется, вполне хватило бы и поверхностных знаний для такого.
Однако решаю все эти задачи ещё и просто из-за уважения к тебе - ты плохого не посоветуешь. Также хочу после того, как достигну кондиции, сделать сервис для братишек и себя по твоим урокам, который будет позволять отслеживать овладение предметом. Список с простановкой "галочек" и заполнением общего прогресс-бара изучения, возможность хранить ссылки на Идеоне со своими решёнными задачами, а также твои ответы и разборы задач - чтобы переработать свою задачу, когда захочется вернуться и сделать всё по-человечески. Думаю, вполне будет мне по силам через некоторое время.
Ну и просто есть Bootstrap, есть готовые шаблоны для фреймворков - для моего проекта, ради которого стал всё изучать, этого всего было бы достаточно.
Пока всё доделываю главное задание - шаблон страницы. Всего ушло на это три недели, многими решениями не доволен, кое-какой момент не удалось решить (data-ref в задаче про "непредсказуемость непредсказуема").
Просто пытаюсь оправдаться перед тобой: я жалуюсь, но ведь делаю. Многие, кто не жалуется, - и не делали ничего, просто перешагнули.
$clearedSentence = preg_replace('/[ ]{2,}/', "", $currentSentence);
$noSpaceComas = preg_replace('/[ ],/', ",", $clearedSentence);
$addSpaceComas = preg_replace('/,/', ", ", $noSpaceComas);
$clearSpaces = preg_replace('/[ ][ ]/', " ", $addSpaceComas);
Вот это всё - жуткий быдлокодинг.
Тут надо два массива с регулярками и заменами, всё пропустить через одну функцию preg_replace.
>>678142
ОП, спасибо, читаю кинутые тобой доки, в который раз понимая свое неумение гуглить и важность сначала посмотреть на сайте авторов апача/пыха, а не на васянских.
Только я не совсем понимаю:
1) Есть ли какая-нибудь разница между
<VirtualHost _default_:80> и <VirtualHost :80>
Результат работы какой-то одинаковый у обеих.
2) Если :80 или _default_:80 указаны НЕ самым первым виртуальным хостом, но по умолчанию (например, по 127.0.0.1 или белому ip) все равно откроется тот виртуальный хост, что прописан первым, а не этот дефолтный. Какой тогда смысл? Перезагружал, три раза.
3) Я хотел попробовать разместить разные сайты на разных портах (один виртуал хост на 80ом, другой на 81ом), но соснул хуйца. Это из-за того, что 81ый порт не слушается апачем или потому, что он закрыт? Как исправить? Можно ли наоборот вообще запретить апачу и мускулу работать с внешней сетью, будучи доступными только для локалки (типа безопасность тестового сервера)?
ПЕРЕСПРОСИЛ В НОВОМ ТРЕДЕ
Пока реквестирую ваше резюме. Обезличьте плз, мне интересны вот какие моменты:
1) Курсы и вебинары всякие вы записываете в резюме?
2) Книги?
3) Как оформляли портфолио проектов своих?
А резюме в целом нужно для понимания как программист себя представляет на рынке.
Спасибо, анончик
мимо-сеошник/верстальщик-переходящий-в-кодеры
да, я прошел кодакадеми и теперь взялся за Кевина. Просто поэтапно поясняют за пхп, ооп и скл и потом на основе знаний заставляют писать свою небольшую цмску. Дальше лежит Мэтт Зандстра.
единственное, что меня в ней смущает, так это конструкции try-catch. Когда я гуглил про pdo
(http://phpfaq.ru/pdo)
в этой статье такой метод обоссали - использование try-catch.
Их очень дохрена выходит. Вообще какой в них смысл? Ошибка если есть то и так вываливается. В книге аргумент, мол, зайдет юзер, а у тебя кусок кода с паролем-юзером БД вывалится.
Не пишите тут ничего, пишите в новом треде.
На посты с 4 по 6 марта я напишу тут ответы - может вечером, может завтра, как время будет.
Джва вопроса:
1. Почему \n не переносит строку? Использую Апач+пхп, т.е. запускаю файлы с программой в броузере.
2. Зачем в еcho переменные пишутся в скобках: echo "Foo {$bar}" ?
> define( 'UNDEFTOK', '0' );
Лучше испьзовать константы класса. Имена лучше давать полные, например TOKEN_UNDEFINED, чтобы не надо было расшифровывать сокращения
То же касается и переменных, не надо сокращать так: tok, tok_type
> private function isoperator($tok){
> return preg_match_all
Для проверки на соответсвие выражению нужен preg_match, незачем искать все совпадения. Более того, тут наверно проще было бы проверять через in_array по массиву знаков.
Слова в имени функции надо разделять: isOperator
Класс спроектирован плохо, это не ООП а просто свалка из функций. Вот смотри, какие есть публичные поля и методы:
class Calculator {
public $parse_string = "";
function __construct($str);
public function get_token();
public function compute();
public function addOrSubtractMembers(&$result);
public function multiplyOrDivide(&$result);
public function processingDegree(&$result);
public function unaryOperation(&$result);
public function processingBrackets(&$result);
public function receiveValueNumber(&$result);
}
Вот теперь попробуй по списку понять какие методы надо вызывать и в каком порядке. Я не понимаю, например.
Публичными должны быть только методы, которые должны вызываться с наружи. Их можно вызывать в любом порядке и они должны всегда возвращать корректный результат.
Также, класс называется Калькулятор и можно подумать что он может вычислить несколько выражений. Но тогда почему ему в конструктор (один раз) передается какая-то строка? Если он вычисляет только одно выражение, то как минимум он должен называться по-другому.
Вот как в моем понимании выглядит класс Калькулятор:
class Calculator {
public function compute($expression)
}
Вот как может выглядеть класс, представляющий одно Выражение:
class MathExpression {
public function __construct($expression);
public function compute();
}
Посмотри на эти примеры и сравни со своим кодом.
Более того, тут можно было бы вынести наружу класс, делающий токенизацию и отделить его от парсинга. Например так:
class Tokenizer {
__construct($expression);
public function fetchNextToken();
}
Также по моему опыту, иногда бывают полезными дополнительные методы, например peekToken (посмотреть следующий токен не поглощая его), consumeToken($type) (вызывает ошибку если идущий далее токен не такого типа). Около констант токенов стоит написать комментарии.
У тебя же токенизация и парсинг смешаны в один класс.
У тебя я вижу используется recursive descent. Стоило бы упомнянуть это в комментарии.
> public function unaryOperation(&$result)
Почему аргумент передается по ссылке, а не возвращается через return? Зачем усложнять?
Также, имя функций начинается с глагола.
> private $token_type = 0;
Разве тип токена не константами должен обозначаться? Почему ноль?
> private $token_type = 0;
> $this->tok_type = ENDPARSE;
Название поля написано по-разному.
> echo "Выражение отсутствует";
Почему класс что-то выводит на экран без разрешения?
> echo "Делим на ноль";
> exit(-1);
Для этого есть исключения
> $this->get_token();
> if($this->token == ""){
Странно что функция не возвращает значение напрямую через return, а используется более сложный способ в котором мы обращаемся к не связанному на первый взгляд с функцией полю.
> public function multiplyOrDivide(&$result){
> $temp = 0.0;
>
А правильно что тут начальное значение ноль? А, оно не используется. Но все равно странно смотрится.
В общем, я вижу что с алгоритмом парсинга ты разобрался, а с ООП и оформлением кода пока все плохо. Давай исправим программу.
> define( 'UNDEFTOK', '0' );
Лучше испьзовать константы класса. Имена лучше давать полные, например TOKEN_UNDEFINED, чтобы не надо было расшифровывать сокращения
То же касается и переменных, не надо сокращать так: tok, tok_type
> private function isoperator($tok){
> return preg_match_all
Для проверки на соответсвие выражению нужен preg_match, незачем искать все совпадения. Более того, тут наверно проще было бы проверять через in_array по массиву знаков.
Слова в имени функции надо разделять: isOperator
Класс спроектирован плохо, это не ООП а просто свалка из функций. Вот смотри, какие есть публичные поля и методы:
class Calculator {
public $parse_string = "";
function __construct($str);
public function get_token();
public function compute();
public function addOrSubtractMembers(&$result);
public function multiplyOrDivide(&$result);
public function processingDegree(&$result);
public function unaryOperation(&$result);
public function processingBrackets(&$result);
public function receiveValueNumber(&$result);
}
Вот теперь попробуй по списку понять какие методы надо вызывать и в каком порядке. Я не понимаю, например.
Публичными должны быть только методы, которые должны вызываться с наружи. Их можно вызывать в любом порядке и они должны всегда возвращать корректный результат.
Также, класс называется Калькулятор и можно подумать что он может вычислить несколько выражений. Но тогда почему ему в конструктор (один раз) передается какая-то строка? Если он вычисляет только одно выражение, то как минимум он должен называться по-другому.
Вот как в моем понимании выглядит класс Калькулятор:
class Calculator {
public function compute($expression)
}
Вот как может выглядеть класс, представляющий одно Выражение:
class MathExpression {
public function __construct($expression);
public function compute();
}
Посмотри на эти примеры и сравни со своим кодом.
Более того, тут можно было бы вынести наружу класс, делающий токенизацию и отделить его от парсинга. Например так:
class Tokenizer {
__construct($expression);
public function fetchNextToken();
}
Также по моему опыту, иногда бывают полезными дополнительные методы, например peekToken (посмотреть следующий токен не поглощая его), consumeToken($type) (вызывает ошибку если идущий далее токен не такого типа). Около констант токенов стоит написать комментарии.
У тебя же токенизация и парсинг смешаны в один класс.
У тебя я вижу используется recursive descent. Стоило бы упомнянуть это в комментарии.
> public function unaryOperation(&$result)
Почему аргумент передается по ссылке, а не возвращается через return? Зачем усложнять?
Также, имя функций начинается с глагола.
> private $token_type = 0;
Разве тип токена не константами должен обозначаться? Почему ноль?
> private $token_type = 0;
> $this->tok_type = ENDPARSE;
Название поля написано по-разному.
> echo "Выражение отсутствует";
Почему класс что-то выводит на экран без разрешения?
> echo "Делим на ноль";
> exit(-1);
Для этого есть исключения
> $this->get_token();
> if($this->token == ""){
Странно что функция не возвращает значение напрямую через return, а используется более сложный способ в котором мы обращаемся к не связанному на первый взгляд с функцией полю.
> public function multiplyOrDivide(&$result){
> $temp = 0.0;
>
А правильно что тут начальное значение ноль? А, оно не используется. Но все равно странно смотрится.
В общем, я вижу что с алгоритмом парсинга ты разобрался, а с ООП и оформлением кода пока все плохо. Давай исправим программу.
Потому что можно сделать универсальную функцию склоняющее любое слово. То есть нет никакой необходимости вообще закладывать конкретные варианты слов в функцию. А те кто закладывают делают функцию менее универсальной и усложняют код непонятно с какой целью. Надо делатьт проще.
Потому что у mb_substr 3 аргумента, а не 4.
Скобки тут работают так же как в математике - задают порядок выполнения операций.
>>677225
Брр, синглтоны, я думал мода их писать везде давно уже прошла.
>>677257
Да, ты прав. Знаешь, как исправить? наверно сделать еще проверку что стек не пуст - не поможет так как там минус идет как оператор с 2 аргументами
Также, я заметил еще одну вещь, которую можно улучшить:
> protected $associative = null;
> if (is_null($this->associative)){
> throw new Exception('Associative is empty');
Это проверка, не забыли ли при наследовании класса определить поле. Такие вещи лучше делать через абстрактные методы: abstract function getAssociativity();
> '+' => 'add',
В новом PHP можно исплоьзовать сразу имя класса (и получить проверку интерпретатором что оно правильное):
'+' => AddOperator::class
>>677457
Надо смотреть как читается лучше.
>>677919
Зависит от задач. Можно использовать display: table или float. А вот зачем ты в кучу мешашь флоаты и инлайн-блоки - не очень понятно.
Потому что у mb_substr 3 аргумента, а не 4.
Скобки тут работают так же как в математике - задают порядок выполнения операций.
>>677225
Брр, синглтоны, я думал мода их писать везде давно уже прошла.
>>677257
Да, ты прав. Знаешь, как исправить? наверно сделать еще проверку что стек не пуст - не поможет так как там минус идет как оператор с 2 аргументами
Также, я заметил еще одну вещь, которую можно улучшить:
> protected $associative = null;
> if (is_null($this->associative)){
> throw new Exception('Associative is empty');
Это проверка, не забыли ли при наследовании класса определить поле. Такие вещи лучше делать через абстрактные методы: abstract function getAssociativity();
> '+' => 'add',
В новом PHP можно исплоьзовать сразу имя класса (и получить проверку интерпретатором что оно правильное):
'+' => AddOperator::class
>>677457
Надо смотреть как читается лучше.
>>677919
Зависит от задач. Можно использовать display: table или float. А вот зачем ты в кучу мешашь флоаты и инлайн-блоки - не очень понятно.
centerX/Y лучше бы вычислять из ширины/высоты, а не прописывать руками.
Коэффициент не очень точно подобрал - у меня круг получился сплюснутый по вертикали слегка - хотя может у меня просто другим шрифтом отображается, из-за этого.
Так, в общем, верно решено.
>>677998
Тебе я выше написал замечания по предыдущей версии, посмотри их сначала.
> global $token, $token_type, $exp_ptr;
Это плохо. Глобальные переменные плохи тем что с ними непонятно вообще кто и где их модифицирует. Вообще, код как-то весь перемешан и в нем трудно разбираться.
Использование регулярок по моему неудачная идея. Вот как это проверить? Как гарантировать что оно во всех случаях будет правильно работать?
Если ты уж хочешь использовать регулярки - используй их на полную мощь как описано тут https://habrahabr.ru/post/171667/ .
> /(^-[\d\.]{1,})
Это не увидит унарный минус внутри скобок
> if(preg_match_all("/(\()/u", $stringExpression, $match) != preg_match_all("/(\))/u", $stringExpression, $match))
лучше substr_count
> "/([\/\*\-\+\^\(])(\-[\d\.]{1,})
Это заменяет некорректное выражение вроде --6 на корректное -0-6
В общем, мне кажется подход выбран не очень удачный.
> function convertReversePolishNotation(&$stringExpression){
Что за наркоманство? Почему аргумент по ссылке? Надо думать, что функция получает на вход, что дает на выходе - у тебя этого нет, ты передаешь половину данных через аргументы, другую половину через глобальные переменные и не умеешь пользоваться ретурном.
> function compute(&$stringExpression){
Почему передача по ссылке? Функция при вычислении еще и ломает исходное выражение? не могу представить зачем это нужно.
В одной функции ты используешь стек, а в другой все валишь в массив. нужно единообразие наверно.
> if($stack->count() == 0){
> $stack->push($token);
> } else {
> if(returnPpiopitet($token) > returnPpiopitet($stack->top())){
Некрасиво. Надо сделать функцию возвращающую можно ли положить токен в стек или нет.
Функция function convertReversePolishNotation(&$stringExpression) слишком длинная. Надо разбивать на части.
В общем, надо переделывать код.
>>678209
> width: 66%;
> border: 1px black solid;
> margin-left: 34%;
Одно из 2 тут лишнее - либо margin-left либо width. Также, с учетом бордера в сумме получилось на 2 пикс больше чем 100%. Ты учел что блоки автоматически растягивают свою ширину и ее можно не указывать.
centerX/Y лучше бы вычислять из ширины/высоты, а не прописывать руками.
Коэффициент не очень точно подобрал - у меня круг получился сплюснутый по вертикали слегка - хотя может у меня просто другим шрифтом отображается, из-за этого.
Так, в общем, верно решено.
>>677998
Тебе я выше написал замечания по предыдущей версии, посмотри их сначала.
> global $token, $token_type, $exp_ptr;
Это плохо. Глобальные переменные плохи тем что с ними непонятно вообще кто и где их модифицирует. Вообще, код как-то весь перемешан и в нем трудно разбираться.
Использование регулярок по моему неудачная идея. Вот как это проверить? Как гарантировать что оно во всех случаях будет правильно работать?
Если ты уж хочешь использовать регулярки - используй их на полную мощь как описано тут https://habrahabr.ru/post/171667/ .
> /(^-[\d\.]{1,})
Это не увидит унарный минус внутри скобок
> if(preg_match_all("/(\()/u", $stringExpression, $match) != preg_match_all("/(\))/u", $stringExpression, $match))
лучше substr_count
> "/([\/\*\-\+\^\(])(\-[\d\.]{1,})
Это заменяет некорректное выражение вроде --6 на корректное -0-6
В общем, мне кажется подход выбран не очень удачный.
> function convertReversePolishNotation(&$stringExpression){
Что за наркоманство? Почему аргумент по ссылке? Надо думать, что функция получает на вход, что дает на выходе - у тебя этого нет, ты передаешь половину данных через аргументы, другую половину через глобальные переменные и не умеешь пользоваться ретурном.
> function compute(&$stringExpression){
Почему передача по ссылке? Функция при вычислении еще и ломает исходное выражение? не могу представить зачем это нужно.
В одной функции ты используешь стек, а в другой все валишь в массив. нужно единообразие наверно.
> if($stack->count() == 0){
> $stack->push($token);
> } else {
> if(returnPpiopitet($token) > returnPpiopitet($stack->top())){
Некрасиво. Надо сделать функцию возвращающую можно ли положить токен в стек или нет.
Функция function convertReversePolishNotation(&$stringExpression) слишком длинная. Надо разбивать на части.
В общем, надо переделывать код.
>>678209
> width: 66%;
> border: 1px black solid;
> margin-left: 34%;
Одно из 2 тут лишнее - либо margin-left либо width. Также, с учетом бордера в сумме получилось на 2 пикс больше чем 100%. Ты учел что блоки автоматически растягивают свою ширину и ее можно не указывать.
> [ ]
можно писать просто пробел или \\s
> = preg_replace('/[ ]{2,}/', "", $currentSentence);
Это склеит слова если между ними 2 пробела.
> $noSpaceComas = preg_replace('/[ ],/', ",", $clearedSentence);
> $addSpaceComas = preg_replace('/,/', ", ", $noSpaceComas);
Это надо объединить в одну регулярку, зачем две? Тут достаточно 2 регулярок: первая для исправления пробелов вокруг знаков препинания, вторая для исправления многократных пробелов.
> $clearSpaces = preg_replace('/[ ][ ]/', " ", $addSpaceComas);
Ну ты ведь уже удалял пробелы, тут достаточно делать это один раз.
Так как текст тут один и тот же, можно не создавать переменную после каждого преобразования, а использовать одну и ту же.
>>678226
> max-height: 600px;
Почему 600? Откуда эта цифра? И зачем это?
Там максимальная ширина должна быть 600, а не высота. Также, ты не сделал зеленый фон. Почему? Не умеешь определять цвета по картинке? Возьми инструмент пипетка в графическом редакторе.
В общем, задача требует доработки.
>>678230
> я ведь изучаю только для своего проекта, мне кажется, вполне хватило бы и поверхностных знаний для такого.
Может да, а может и нет и ты много времени потреяешь на исправлении верстки например
> Ну и просто есть Bootstrap, есть готовые шаблоны для фреймворков - для моего проекта, ради которого стал всё изучать, этого всего было бы достаточно.
Да не факт. Бутстрап не заменяет знания КСС и ты это поймешь как только захочешь сделать чуть не так как в примерах.
> кое-какой момент не удалось решить (data-ref в задаче про "непредсказуемость непредсказуема").
Там надо использовать псевдоэлемент и функцию attr. погугли.
Ну и смотри, это ты сейчас думаешь что тебе только для совего проекта, а потом тебя например позовут куда-нибудь в реальнй проект, а ты ксс не знаешь.
> [ ]
можно писать просто пробел или \\s
> = preg_replace('/[ ]{2,}/', "", $currentSentence);
Это склеит слова если между ними 2 пробела.
> $noSpaceComas = preg_replace('/[ ],/', ",", $clearedSentence);
> $addSpaceComas = preg_replace('/,/', ", ", $noSpaceComas);
Это надо объединить в одну регулярку, зачем две? Тут достаточно 2 регулярок: первая для исправления пробелов вокруг знаков препинания, вторая для исправления многократных пробелов.
> $clearSpaces = preg_replace('/[ ][ ]/', " ", $addSpaceComas);
Ну ты ведь уже удалял пробелы, тут достаточно делать это один раз.
Так как текст тут один и тот же, можно не создавать переменную после каждого преобразования, а использовать одну и ту же.
>>678226
> max-height: 600px;
Почему 600? Откуда эта цифра? И зачем это?
Там максимальная ширина должна быть 600, а не высота. Также, ты не сделал зеленый фон. Почему? Не умеешь определять цвета по картинке? Возьми инструмент пипетка в графическом редакторе.
В общем, задача требует доработки.
>>678230
> я ведь изучаю только для своего проекта, мне кажется, вполне хватило бы и поверхностных знаний для такого.
Может да, а может и нет и ты много времени потреяешь на исправлении верстки например
> Ну и просто есть Bootstrap, есть готовые шаблоны для фреймворков - для моего проекта, ради которого стал всё изучать, этого всего было бы достаточно.
Да не факт. Бутстрап не заменяет знания КСС и ты это поймешь как только захочешь сделать чуть не так как в примерах.
> кое-какой момент не удалось решить (data-ref в задаче про "непредсказуемость непредсказуема").
Там надо использовать псевдоэлемент и функцию attr. погугли.
Ну и смотри, это ты сейчас думаешь что тебе только для совего проекта, а потом тебя например позовут куда-нибудь в реальнй проект, а ты ксс не знаешь.
расстояние между желтыми блоками больше 10 пикс - изучи подсказки к задаче.
Также, цвета хорошо бы сделать как на картинке.
>>678255
> span {
> display: inline-block;
Вообще-то это неправильно. Вот смотри что будет если выделенный текст занимает несколько строк: https://jsfiddle.net/smpwuf8k/1/ - этот текст вырывается в отдельный блок. Изучи как ведет себя свойство display: inline, чем инлайн-элементы отличаются от инлайн блоков - это важно. И конечно читай учебник на сайте softwaremaniacs если ты его еще не читал.
>>678285
тебе не надо сбрасыать все отступы у всех элементов. Надо исправить только то что нужно тебе. Потому звездочка тут и не нужна. Звездочка почти всегда признак неграмотности верстальщика.
Отступы между пунктами меню надо сделать больше.
Шрифт не тот - там требушет. Цвет заголовка не тот.
Почему заголовок сделан тегом h3? Почему ты именно его выбрал? Что значит цифра 3 тут?
> div {
> padding: 5px 10px;
Это неправильный селектор. Вот захочет кто-то доабвить на страницу новый блок, а к нему твои паддинги применятся. Надо применять правила только к своим элементам, а не ко всему подряд.
> <div class="title">
> <h3>ООО АГРОСЕРВИС</h3>
Зачем тут div.title?
Если текста много, он заваливается на меню: https://jsfiddle.net/t03a2v4q/3/
Если в тексте есть цветной див, он проваливается под меню: https://jsfiddle.net/t03a2v4q/4/
Если убрать меню, текст уедет влево.
Нужно исправить все эти недостатки и сделать более надежную и прочную верстку.
>>678439
Да, я мог перепутать.
расстояние между желтыми блоками больше 10 пикс - изучи подсказки к задаче.
Также, цвета хорошо бы сделать как на картинке.
>>678255
> span {
> display: inline-block;
Вообще-то это неправильно. Вот смотри что будет если выделенный текст занимает несколько строк: https://jsfiddle.net/smpwuf8k/1/ - этот текст вырывается в отдельный блок. Изучи как ведет себя свойство display: inline, чем инлайн-элементы отличаются от инлайн блоков - это важно. И конечно читай учебник на сайте softwaremaniacs если ты его еще не читал.
>>678285
тебе не надо сбрасыать все отступы у всех элементов. Надо исправить только то что нужно тебе. Потому звездочка тут и не нужна. Звездочка почти всегда признак неграмотности верстальщика.
Отступы между пунктами меню надо сделать больше.
Шрифт не тот - там требушет. Цвет заголовка не тот.
Почему заголовок сделан тегом h3? Почему ты именно его выбрал? Что значит цифра 3 тут?
> div {
> padding: 5px 10px;
Это неправильный селектор. Вот захочет кто-то доабвить на страницу новый блок, а к нему твои паддинги применятся. Надо применять правила только к своим элементам, а не ко всему подряд.
> <div class="title">
> <h3>ООО АГРОСЕРВИС</h3>
Зачем тут div.title?
Если текста много, он заваливается на меню: https://jsfiddle.net/t03a2v4q/3/
Если в тексте есть цветной див, он проваливается под меню: https://jsfiddle.net/t03a2v4q/4/
Если убрать меню, текст уедет влево.
Нужно исправить все эти недостатки и сделать более надежную и прочную верстку.
>>678439
Да, я мог перепутать.
1) не пишу. Если курсы серьезные то можно указать.
2) не пишу, бред же.
3) скриншот + краткое пояснение что я делал
>>680264
Тебе надо разобраться в обработке ошибок и исключениях. Как по твоему надо обрабатывать ошибки? Читай урок про исключения, https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
>>680581
### переносы строк и br
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
> Зачем в еcho переменные пишутся в скобках:
мануал http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
Если я вас пропустил, напомните о себе в новом треде.
Не обоссывайте только, решил намазаться веб-кодингом, нашёл видеокурсы Евгения Попова по html и css, сейчас на завершающей главе html, делаю всё за ним, разумеется, пока получается, ибо тут только дурак не справится. Этот Попов вообще норм чел?
И по какому пути следовать при обучении:
1)HTML > CSS > JavaScript (+JQuery) > PHP+MySQL;
2)HTML > CSS > PHP+MySQL > JavaScript (+JQuery);
3)HTML > PHP+MySQL > CSS > JavaScript (+JQuery)?
Сейчас объясню, что мне хочется. Я просто сам по себе пока не получу первый мало-мальски годный результат, не смогу углубиться полностью в изучение. В каком порядке мне лучше изучать всё это, чтобы я как можно быстрее смог заработать первые доллары? Это не значит, что я сразу полезу везде орать, что я у мамы программист, просто после этого я буду уверен, что время трачу не зря и заработать ТОЧНО смогу и буду углублённо изучать каждый элемент.
В общем, в какой последовательности мне это учить для достижения быстрого результата? И в какой лучше с точки зрения рациональности и вашего опыта?
И да, по времени, если можно, проконсультируйте меня, сколько дней уйдёт на обучение по двум моим веткам (быстрой и рекомендованной).
Я просто учусь и подрабатываю немного, хотелось бы рассчитать, могу ли дропнуть работу, чтобы потратить всё время на обучение и уже начать зарабатывать на жрат.
Ребят, как настроить xdebug в open server на phpstrom?
Что бы можно было по людски выделять строчку, и нажимать жучка и видеть в консоли что хрониться в переменной, делать пошаговую отладку?
1)Берётся WordPress, вставляются туда свои данные, картиночки, ???????, PROFIT!
2)Берётся WordPress, делается основной каркас, затем открывается код, плюётся на индусопись, стирается, пишется руками на пхп.
3)Сразу берётся и пишется руками на пхп?
4)Берётся уже написанный ранее сайт, редактируются css-стили, вставляются новые картиночки, новый сайт готов?
От задач зависит, так делаются сайты - визитки
http://ideone.com/OWQsMA
Сначала нужно проверять имя, это чек
Затем номер - чек
Затем в номере только цифры - не чек.
Если ввести буквы - выводит что номер превысил 13 символов.
Как бы вы сделали и в чем упущения?
До этого вообще проверки с регулярками не юзал, только на ограничение символов.
Правильно все ли я сделал?Есть замечания?
Код по ссылке.
http://pastebin.com/bFdzVPWW
Заранее спасибо
http://ideone.com/e.js/wAJYbG
Нужно проверить соответствует ли текст нужному шаблону.
Это копия, сохраненная 21 марта 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.