Вы видите копию треда, сохраненную 20 января 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>597909 (OP)
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
- Простая, но полезная задача сделать список студентов: 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
- Проверялка решений на 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, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Аноны, мне нужно придумать инновационный проект который понравится преподу и который будет лёгким для меня, так как задачки на гитхабе я не делал.
Я придумал что-то вроде проект "чистый город", суть в том, что когда ты идёшь на работу или учёбы то бывает видешь где-то скопление мусора и хотел бы убрать да нет времени, ты делаешь фото, на моём сайте прикрепляет фото и место на карте.
Сложно ли реализовать такую хуйню на вордпресс?
в данной ситуации главное не изучение ООП и MVC, а результат, так как я не хочу проебаться со сроками и потом попасть на платные пересдачи и прочее
Это вот такие люди с пхп работают, да?
Видимо, такие ими руководят
Не суди по первому разговору. Я так-то 2 высших имею и Phd, а когда работы много, в запарке тоже могу так ответить.
>Ну типа тупая дырка, даже спонсора себе на нашла, надо же хоть косточку бросить из жалости.
Скорее
Женщина на работе.
Забеременела
@
Пропала на 2 года по уходу за детьми
@
Ищи второго на 2 года замены.
пришла после 2 лет сидения с дитём
@
Ничего не помнит, ничего не знает
@
Заебала всех фоточками своего дитя
@
Оставляем парня с замены на пол ставки, потому-что баба за 2 года превратилась в бесполезного студента
Сдаюсь.
Чего только не навертел с этим калькулятором.
Дошёл до какой-то херни, которая улезает в минус, но в итоге считает всё правильно, даже если ставишь КредитБаланс = 1. Её не сохранил, правда.
Расписал просто словами всё, что за чем идёт, попробовал сделать - не идёт ни хрена.
Я никак не могу понять, какого чёртау нас цикл всё равно выполняется, когда у нас внутри стоит if ($creditBalance <= $monthlyPayment). По идее же при столкновении с этим сразу должно выполняться то, что там в условии, разве нет?
Я устал, я ухожу сдаюсь.
Подозреваю, что там и ответ простой, как палка: взять и проверить, сколько осталось долга, и выплатить только его.
Насмехайтесь надо мной, гоните меня, целый день сегодня вертел и страдал над этим, ничтожество блятское..
Вот один из моих вариантов, которые работают с 40 000, но не работают с 1 000 в КредитБаланс: http://ideone.com/e5OkHY
Из-за того не работает, что там изначально отнимается месячная выплата, от этого 1000 сразу в минус идёт, дальше проценты и т.п.
Но и прежний мой вариант всё это считал, только не считал правильно сумму в $creditBalance меньше $monthlyPayment.
>>605629
А теперь подставь в свой код не 40 000 в $creditBalance, а 1 000 - всё работает по-прежнему? Выходит $paymentTotal 2030 в этом случае?
Конечно, не работает, ведь месячный платёж заведомо больше общего долга с самого начала. Смысл заморачиваться на эту тему? Ведь в жизни банк не сделает месячный платёж больше, чем сумма кредита.
не-ОП
>Выходит $paymentTotal 2030 в этом случае?
Да.
Я в позапрошлом треде с ником Олег был, там всё выкладывал.
Специально для тебя создал новый идеон с 1000 на входе, вот он.
https://ideone.com/vzW41L
Главная проблема была в том, что я сначала считал кредит баланс, потом в коде добавлял проценты и прочее. В иотоге if срабатывал, потом к (например 1000) добавлял проценты, обслуживание, потом ещё и ещё что-то. В итоге хотя проверку проходил - фактически тут же её и ломал.
Ну собственно ты на те-же грабли и наступил. Сначала проверил значение кредитбаланса, а потом зачем-то к нему понаприбавлял всего. У тебя он был меньше 5000 а уже после if - прибавил % и счета за обслуживание.
В смысле, есть 1000 подставить вместо 40000
>ведь месячный платёж заведомо больше общего долга с самого начала. Смысл заморачиваться на эту тему?
>Тестирование программы?
>Не, не слышал.
Там действительно интересная задача сама по себе. Вот вроде и ответ есть и работает всё, а что-то не так. И когда вводишь заведомо маленькие цифры - сразу понятно что не так и где слабое место. Это не просто означает что тестирование смысла не имеет, а скорее всего и то, что и обычные суммы рассчитываются неправильно!
5000 это не месячный платеж. Это максимальная сумма которую заемщик может выплатить за месяц.
лоль, ну прост смысл учить всякую левую абстрактную хуйню, которая скорей всего не пригодится никогда? фремворк рандомный например
>ты можешь сделать задачи которые принесут больше чем расходы тебе на зарплату?
конечно, ожидаю задачи вроде настройки форм с вводом/выводом бд, подправить макет и подобное
>>605486
>>605415
ну примитивную хуйню тоже кто-то делает же? рандом хуй слету прям невкурит скорей всего
зы: спасибо, развернутые приятные ответы.
Но я же чайлдфри.
У меня почему-то не работает.
https://github.com/someApprentice/Students
Fatal error: Class 'SomeClass' not found in C:\Program Files\xampp\www\public\index.php on line 4
Спасибо, братишка Олег, но дело в том, что у тебя неправильно считает теперь 40 000, такие вот дела.
Там должно получиться 61270 с копейками, а у тебя выходит 60262.31722769, то есть пропадает 1000 за обслуживание кредита и 3% от 262 рублей.
Я поеду с этим калькулятором.
>Сначала проверил значение кредитбаланса, а потом зачем-то к нему понаприбавлял всего. У тебя он был меньше 5000 а уже после if - прибавил % и счета за обслуживание.
Как я понял, именно это и правильно. Там когда КредитБаланс становится 4138 (я уже наизусть выучил эти цифры, блиять), надо прибавить к этому 3% и тысячу за обслуживание. А потом КредитБаланс станет 262 рубля - снова надо прибавить 3% от этой суммы и сумму кредита. Вот именно этот последний шаг не делает твой скрипт, получается, такие дела.
>Там когда КредитБаланс становится 4138 (я уже наизусть выучил эти цифры, блиять), надо прибавить к этому 3% и тысячу за обслуживание
И после отнять 5 000 - обычную его месячную выплату, этого анончика.
>А потом КредитБаланс станет 262 рубля - снова надо прибавить 3% от этой суммы и сумму кредита
Сумму за обслуживание кредита, то есть 1000 рублей.
Вот такие дела.
ОП, получается, не проверил твой каклькулятор? Потому что я уже забавлялся с массивами, про Толстого написал скрипт, ещё многое, а тут такой удар от ОПа - и на три дня выпал из приятного программирования.
if ($creditBalance < 5000) {
\t$month++;
\t$creditBalance = ( $creditBalance * $percent ) + $servicePayment - $monthlyPayment;
Что-то я не понял зачем ты так сделал? У тебя остаётся долг меньше пяти тысячь, а ты всё-равно платишь 5000 банку. И в итоге банк тебе теперь должен. Что-то не так.
psr-4 это не программа, чтобы стоять
У тебя русская буква 'c' в слове namespaCe
https://github.com/someApprentice/Students/blob/master/app/Foo/SomeClass.php#L2
Она же подсвечивается на гитхабе. Ну и в твоей иде подсвечивается, если ты не в блокноте набираешь конечно.
Автозагрузчик прямо импортируй композеровский
require '../vendor/autoload.php';
Не надо всяких левых файлов типа 'app/autoload.php'
В composer.json неправильно прописан путь
После корневого неймспейса должны идти два слеша
"PSR-4": {
"App\\": "app/"
}
В index.php при создании класса нужно писать полный неймспейс
$bar = new \App\Foo\SomeClass;
либо импортировать класс через use.
Короче дохуя ошибок, прочитай мануал по композеру и неймспейсам, переставлять буквы наугад будет дольше и болезненнее.
еще слово "psr-4" пишется в нижнем регистре (маленькими буквами)
https://getcomposer.org/doc/04-schema.md#psr-4
Там получается к этому моменту как раз долг 4138, вот он в $creditBalance у нас к этому моменту находится. Дальше надо прибавить 3% и 1000 за пользование кредитом. Получится 5262 - отсюда отнимаем плату анончика 5000.
Потом снова прибавляем проценты и $servicePayment. И вот тут уже платим 1270 вроде как раз.
>Там когда КредитБаланс становится 4138 (я уже наизусть выучил эти цифры, блиять), надо прибавить к этому 3% и тысячу за обслуживание. А потом КредитБаланс станет 262 рубля
Что-то ты не понял меня совсем.
Ну давай посчитаем.
4138 +1000 ...
Получаем 5138. А у тебя скрипт должен сработать только когда кредит<5000. И как же он сработает?
Я про это и говорю, ты сначала должен посчитать кредитбаланс, а уже потом проверять условие. У тебя лишняя тыща как раз из-за этого получается.
Нет-нет, бро, не так:
4138 * 1.03 + 1000, получается 5262 с копейками.
В том-то и дело, что там в условии с if надо частично делать повтор этого цикла, получается.
Там получается в один момент КредитБаланс становится меньше, но до конца не выплачен. Поэтому надо снова пройти через умножение на проценты и прибавление тысячи за пользование кредитом.
Я сейчас найду первый свой вариант, там подробно я специально это расписал, погоди.
>>605910
ОП как раз сказал, что считает правильно 40 000 у меня, что должно быть 61270 с копейками.
Там я специально для себя наглядно прописал, где что остаётся, где что выитается и т.п.
ОП подставил тысячу в КредитБаланс и всё там посчиталось неправильно.
И вот я три божьих дня ковыряюсь.
Ох, бро, я уже всё, сил больше нет.
Я раз семь подчистую его переписывал, везде вертел-перевёртывал.
>У тебя русская буква 'c' в слове namespaCe
У меня в Sublime Text'е вообще не подсветилась. Это такая глупая ошибка с моей стороны.
Спасибо. Исправил все.
https://github.com/someApprentice/Students
Анон, я еще хочу часок поработать
Да мать его, я сделал эту сучку
Ну разве я не охуенен?
1) http://ideone.com/eOZ6Qg это просто поиск таких слов. Я сделал его в 2х вариантах: с делением на каждое слово (ищет только первую изменённую букву/ы, формально под постановку задачи подходит) и вариант без разбиения (тогда под раздачу попадает английское слово с русскими буквами, но выглядит красивее и ищет ошибки в обоих языках).
2) http://ideone.com/FVB32H доп. задача с заменой букв на нормальные. Если использовать первый вариант шаблона, то во-первых, надо будет собирать исправленные по отдельности слова в кучу, а во-вторых будет исправлять только первую букву. Второй меняет всё подряд, но я так и не смог написать регексп, который на ходу понимал бы, с какой буквы начинается слово, при этом без побочных эффектов. И главное - непонятно, как регекспом и менять несколько букв подряд.
В общем, всё это можно было бы сделать через всякие циклы, массивы и т.д., но я думаю, это неверный путь. Скажи, в какую сторону думать, или забить на мелочи?
Сорри за путанное изложение мыслей
Да забей хуй на него, скоро все на PostCSS перейдут.
https://ideone.com/qzmFBN
Переписал.
ОП оказывается проверил мой код, и отписался спустя 400 постом. А я и не заметил (
Молодца, бро!
И решение же, сука, простое, как два пальца...
И написано же было, что надо проверять долг (разумеется, в голову мне не пришло, что долг можно сделать другой переменной).
Отлично всё равно и для меня, потому что я хотя бы лучше уяснил во время ковыряния, как многое работает, как скрипт проходит и т.п.
Ну а так прямо гора с плеч, спасибо, братишка.
Анончик, хотел посмотреть твою реализацию Cat&Mouse. В файле index.php необходимо поменять пути, так как на линуксе были проблемы. И интерпретатор ругался на 86-ю строку файла Animal.php, пришлось слово Class убрать. Это норма и просто я ньюфаг?
Да, действительно там ошибка, я не знал об этом. Возникает потому что в тайпхинте указан Объект а не SplObjectStorage (странно что он его не считает за объект)
Исправил: https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L86
>В файле index.php необходимо поменять пути, так как на линуксе были проблемы
А что за проблемы были?
Кто-нибудь писал ботов для телеграмма на пхп? покажите?
В линуксе вся файловая система начинается с корня, то есть когда ты указываешь require '/Templates/print.phtml'; то поиск начнётся с папки Templates/, находящейся в корневой директории всей ФС. Я добавил точку перед первым слешем, вместо точки подставится адрес текущей директории, а вообще правильно использовать константу __DIR__
Например require_once __DIR__ . '/Templates/print.phtml';
Интересно, я так понимаю, с его помощью можно веерно рассылать собственноручно написанный текст списку пользователей из друзей?
> <link >href="http://filehosting.ru/bootstrap/css/bootstrap.min.css"
>можно заменить на
> <link href="/bootstrap/css/bootstrap.min.css"
Странно. Изначально я так и сделал, но к пути дописывался адрес, т.е если мы обращаемся по адресу /main/ то путь к файлам становился
http://filehosting.ru//main/bootstrap/css/bootstrap.min.css соответственно ксс не прогружался, ведь такой папки нет. Поэтому я и прописал там полный путь. Сейчас почему-то относительные ссылки работают и такой проблемы не вызывают.
>Это же твой старый класс? Ответь-ка, много ли пришлось в нем поменять? В правильном коде не требуется менять ни одной строчки.
Ну я поменял его под свои нужды, некоторый функционал моего старого класса мне показался лишним и я его значительно упростил.
нужно из переменной (html код в одну строку)
выдрать все емейлы (можно с мусором, похуй вообще)
регулярки валидации емейла не срабатывают, что делать?
пример таргета: http://www.spiegel.de/impressum/a-941280.html
>>606672
https://github.com/akalongman/php-telegram-bot/blob/f9a90f355ccea9785b94c24232c3af464f1b0678/src/DB.php#L63
https://github.com/someApprentice/Students/blob/master/app/init.php#L7
Значит лучше вызывать эту функцию статически чем иметь свойство которое можно сделать закрытым?
> header("Content-disposition:attachment; filename=$filename");
>В заголовках можно исплользовать только латинницу и нельзя использовать русские или други буквы. Как это исправить? Не указывать filename вообще. Тогда браузер возьмет имя из URL
Тогда он будет скачивать файл, имя которого содержит айди. Мне бы хотелось, чтобы файлы скачивались с оригинальным названием. Как это сделать, не указывая имя в заголовке?
mod_rewrite
В ссылке сделай полную инфу о файле, например у меня получился путь для скачивания /download/1234/photo.jpeg, которая на диске хранится под именем 1234_photo.jpeg.txt
где 1234 это id, photo.jpeg оригинальное имя
В htaccess сделать RewriteRule, чтобы запрос вида /download/1234/photo.jpeg перенаправлялся на index.php, а там уже разбить по слешу и склеить нужное имя по определенному правилу (должен быть метод, который принимает компоненты урла и возвращает имя файла на диске).
Filename в заголовке не нужно указывать, тогда браузер при скачивании возьмет имя из урла, то есть photo.jpeg
https://github.com/akalongman/php-telegram-bot/blob/f9a90f355ccea9785b94c24232c3af464f1b0678/src/Exception/TelegramException.php
Доносчику первый кнут.
Ну так увеличь max_file_size (и ище одну связанную директиву) в php.ini. Или у тебя какая-то быдло-сборочка, которая не дает этого сделать?
Проверяй размер файла джаваскриптом. Тем более это все равно нужно делать, чтобы пользователь даже не пытался грузить файлы больше чем разрешено.
Не могу накатить дримвивер на денвер, какую-то хуйню пишет:
Сервер не найден
Страница "http://site/test.php" не была загружена, так как не найден сервер "site". Убедитесь в том, что соединение с Интернетом установлено и имя сервера введено правильно.
Надо было рестарт денвера сделать, допёрло до барана.
больше не буду
вот код http://pastebin.com/CJLfxza1
вот url.txt
http://allister.de/contact/
http://laitovo.ru/contacts
http://datrussia-gold.dat.de/kontakty.html
http://www.wedi.de/impressum/
http://www.dw.com/de/impressum/a-15718489
http://www.apart-fashion.de/impressum
http://www.obi.de/de/impressum/index.html
http://www.mpil.de/en/pub/service/impressum.cfm
http://marinetech.de/ru/Info/Impressum.html
такая малафья вылетает, подстановка заголовков не помагает
>Warning: file(http://laitovo.ru/contacts ) [function.file]: failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found in C:\OpenServer\domains\localhost\1.php on line 7
>регулярки валидации емейла не срабатывают, что делать?
>отдал регулярке 0 мэйлов
>удивился почему не сработало
c чего такие выводы манька?
написал кароч, всем похуй наверное, но может ктонить захочет обоссать -https://yadi.sk/d/fjYcJbzbmKeVd
(просто сначала сохранил html всех страниц в общий файл, а патом вытянул с него мыла)
скрипт бегает по ссылкам из txt,
затем добавляет к ссылке /impressum/ и снова бегает, затем чистить говно и удаялет дубли
url.txt - закидываем список таргетов
mail.txt - спаршенные мыла
сохраняет чутка мусора на выходе и похуй
мой 2 скрипт
Нельзя писать object в качестве тайп-хита, также как нельзя писать int, string, boolean. PHP поймет это как имена классов.
В тайп-хинте можно указывать только:
- array
- callable
- имя класса/интерфейса
В PHP7 это будет исправлено и можно будет указывать скалярные тайп-хинты, то есть можно будет писать int $a.
http://habrahabr.ru/post/267799/
Также, можно будет указывать тип результата который вернет функция:
function somefunc(): int
{
...
}
Жаль, нельзя пока указывать сложные типы вроде SomeClass[] (массив объектоы SomeClass).
> Странно. Изначально я так и сделал, но к пути дописывался адрес, т.е если мы обращаемся по адресу /main/ то путь к файлам становился
Ты наверно писал
css/bootstrap
вместо
/css/bootstrap
Прочти внимально мой урок про относительные URL и реши задания в нем: https://github.com/codedokode/pasta/blob/master/network/urls.md
Специально его вчера написал и выложил.
Если относ. URL начинается со слеша, то он идет от корня сайта. Если не со слеша, то от текущей папки в пути. Отсюда и проблема.
У вас обоих сделано неправильно. У тебя непраивльно что настройки вписаны прямо в класс, надо их выносить в конфиг. У него вдобавок еще и все на статических методах, то есть это вообще не ООП.
Браузер берет имя файла из последнего компонента путив URL
http://example.com/some/123456/file.txt -> file.txt
http://example/lalala -> lalala
Соответственно тебе надо сделать ссылку на скачивание так, чтобы она заканчивалась на настоящее имя файла.
Этот метод работает с любыми символами, хоть кириллицей, хоть иероглифами, только помни что в пути спецсимволы вроде пробела или знака вопроса надо экранировать процентным кодированием.
Это неправильный код. Класс исключения лишь хранит информацию об ошибке. Записывать ее в лог - не его задача.
Там автор по моему знает PHP, а вот ООП совсем не понимает. Не советую брать с него пример.
>>606774
Потому что size покаызвает размер файла который принят. Если файл слишком большой, PHP его не принимает, отсюда и ноль.
Обнаружить что файл слишком большой можно по полю error в FILES. Там есть код для этой ситуации.
Тебе надо проверять:
- что в FILES есть инфа о файле (то есть что файл был отправлен)
- что поле error нет ошибки
- что размер файла допустимый
Также, в плане безопасности все плохо:
https://github.com/MindiMakridi/filehosting/blob/master/models/File.php#L115
Что если файл имеет расширение .htaccess? Если ты его сохранишь с таким именем то злоумышленник сможет менять настройки сервера и сделать например txt файлы исполняемымим через PHP
Также, что если файл имеет расширение php5, phtml, shtml, php4? На некоторых хостингах эти и другие расширения вызывают интерпретатор PHP.
Надежнее принудительно менять расширение на .txt
Это неправильный код. Класс исключения лишь хранит информацию об ошибке. Записывать ее в лог - не его задача.
Там автор по моему знает PHP, а вот ООП совсем не понимает. Не советую брать с него пример.
>>606774
Потому что size покаызвает размер файла который принят. Если файл слишком большой, PHP его не принимает, отсюда и ноль.
Обнаружить что файл слишком большой можно по полю error в FILES. Там есть код для этой ситуации.
Тебе надо проверять:
- что в FILES есть инфа о файле (то есть что файл был отправлен)
- что поле error нет ошибки
- что размер файла допустимый
Также, в плане безопасности все плохо:
https://github.com/MindiMakridi/filehosting/blob/master/models/File.php#L115
Что если файл имеет расширение .htaccess? Если ты его сохранишь с таким именем то злоумышленник сможет менять настройки сервера и сделать например txt файлы исполняемымим через PHP
Также, что если файл имеет расширение php5, phtml, shtml, php4? На некоторых хостингах эти и другие расширения вызывают интерпретатор PHP.
Надежнее принудительно менять расширение на .txt
http://habrahabr.ru/post/120157/
Шарп не уперся, мы изучаем php.
На php тоже есть готовые решения, смотри ratchet и reactphp. Те же вебсокеты делаются в несколько строчек.
Мне например важно просто понять как оно работает, а не копипастить непонятные строчки из документации в надежде на авось.
Естественно на практике никто не будет писать жуткий низкоуровневый велосипед, когда есть библиотеки и фреймворки.
Код на шарпе из статьи кстати выглядит так же страшно, как и на голом php.
Ратчер, хуячер. на шарпе это делается в три строке, а в похапе нужно подключать тяжелые библиотеки и ебать себе мозги асинхронностью.
Вон я какой браузер сделал на с#, с иконкой. Правда на сосач чего-то не постится через него.
Спасибо за важную информацию.
Проорал чего-то на всю коммуналку.
Всем добра и няшек.
у нас речь идет о скрипте который сам делает нужные действия. А ты предлагаешь вместо этого взять браузер (работающий на движке ИЕ и только под виндой, требующий скачать 200 Мб фреймворка) и руками в нем делать все действия. Ты даун или прикидываешься?
Алсо то что ты сделал это уровень хелло ворлд, вот например урок и по нему видно что это делается за 10 минут включая ожидание пока загрузится вижуал студио: http://www.homeandlearn.co.uk/csharp/csharp_s9p6.html
Если бы ты не был так глуп, ты бы кстати мог вспомнить что в дотнете есть кое-что упрощающее работу с асинхронными функциями на уровне языка.
Выложил резюме на hh.ru. Через несколько дней на почту упало письмо с предложением побеседовать по скайпу. Побеседовали. Дали тестовое задание. Решил. Отправил. Проверили, позвали на собеседование. Сказали, что позвонят. Позвонили. Ну и всё.
>У тебя непраивльно что настройки вписаны прямо в класс, надо их выносить в конфиг.
За исключением этого есть еще какие-нибудь замечания? Я правильно делаю инициализацию здесь? https://github.com/someApprentice/Students/blob/master/app/Model/Gataway/TableDataGataway.php#L8
Нет, неправильно на мой взгляд. В чем смысл класса Init? Считаю использование класса тут ненужным усложнением.
Инициализацию лучше сделать так: просто в файле init.php создаем все нужные нам объекты:
//... настраиваем автозагрузку ...
$pdo = new PDO...
$pdo->setAttributes(..);
$pdo->....
$someMapper = new SomeMapper($pdo);
--------
По твоему коду, такие ошибки:
gatAway -> gatEway
- конфиг лучше вынести в отдельный файл и не прописывать настройки прямо в классе
- getConfig вроде нигде не нужен, значит незачем его делать. Не надо из класса наружу выдавать лишние данные.
- неправильно исплоьзовать static $var, это фактически глобальная переменная. Ну например если мы создадим 2 экземпляра класса Init, мы думаем что мы получим 2 независимых объекта PDO:
$init1 = new Init;
$init2 = new Init;
$pdo1 = $init1->getPdo();
$pdo2 = $init2->getPdo();
assert($pdo1 !== $pdo2);
Логично? Ведь $init1 и $init2 ничего не связывает. Но из-за использования глобальной переменной мы получаем побочный эффект - $init2 не создает новый объект а возвращает объект из $init1, хотя по коду кажется что они ничем не связаны. Вот так ловушка.
Нет, неправильно на мой взгляд. В чем смысл класса Init? Считаю использование класса тут ненужным усложнением.
Инициализацию лучше сделать так: просто в файле init.php создаем все нужные нам объекты:
//... настраиваем автозагрузку ...
$pdo = new PDO...
$pdo->setAttributes(..);
$pdo->....
$someMapper = new SomeMapper($pdo);
--------
По твоему коду, такие ошибки:
gatAway -> gatEway
- конфиг лучше вынести в отдельный файл и не прописывать настройки прямо в классе
- getConfig вроде нигде не нужен, значит незачем его делать. Не надо из класса наружу выдавать лишние данные.
- неправильно исплоьзовать static $var, это фактически глобальная переменная. Ну например если мы создадим 2 экземпляра класса Init, мы думаем что мы получим 2 независимых объекта PDO:
$init1 = new Init;
$init2 = new Init;
$pdo1 = $init1->getPdo();
$pdo2 = $init2->getPdo();
assert($pdo1 !== $pdo2);
Логично? Ведь $init1 и $init2 ничего не связывает. Но из-за использования глобальной переменной мы получаем побочный эффект - $init2 не создает новый объект а возвращает объект из $init1, хотя по коду кажется что они ничем не связаны. Вот так ловушка.
В ООП вместо static $var надо использовать статические свойства, например
private static $x =1;
Но в данном примере я не понимаю, зачем вообще это нужно. Объясни, зачем ты там испльзовал static? Что ты хотел сделать этим?
Есть еще замечания. Папку vendor необходимо удалить из репозитория и внести в gitignore (погугли про этот файл).
В репозитории должен быть в первую очередь твой код. Класть туда папку vendor которую генерирует композер незачем.
require_once __DIR__ . '/../vendor/autoload.php'; лучше перенести в init.php, то есть файл init.php будет отвечать за всю подготовку приложения к обработке запроса.
Также, мне кажется, папка Model не нужна. Почему бы не вынести Helpers, Gateway, Validators выше? Это конечно не ошибка, скорее дело вкуса, но мне кажется папка Model тут просто лишняя, какая от нее польза?
И еще, ты тут взялся сравнивать свой код с кодом какого-то телеграм бота с ошибками. оказалось, что тот код сам не очень. Я могу дать примеры кода получше.
- фреймворк для создания интернет-магазинов Magento: https://github.com/magento/ - он довольно популярен на Западе
(обрати внимание, там тоже используется композер, есть папка app и файл app/bootstrap.php, папка pub - все как у нас, потому что ОП учит вас современным подходам к разработке а не втюхивает пыльные учебники 10-летней давности)
- очень большой и сложный фреймворк Symfony https://github.com/symfony/symfony
- исходники композера (он написан на php) https://github.com/composer/composer
Что я делаю не так?
for ($i = 0; $i < $roundHalfCharacters; $i++) {
\t$symbolForward = mb_substr($withoutSpaces, $i, 1);
\t$symbolBack = mb_substr($withoutSpaces, -$i, 1);
Почему-то первая буква в этом случае считается первая с начала, а потом уже идут с конца по порядку.
Где логика, почему так странно?
> -$i
-0 этот тот же самый ноль, ты получаешь не последнюю, а первую букву. Чтобы получить последнюю, надо указать -1.
Спасибо, бро, как раз запостил и понял, что надо указать просто 1 в значении $i с самого начала.
Я не очень понял зачем они эти важные ключи выложили на облачные серверы.
Так Инстаграмм же на Пистоне написан, разве нет?
Вот сделал палиндром: http://ideone.com/a8kbeG
Хоть башку не сломал - и то ладно.
Как буду в ООП и далее разбираться - ума не приложу.
http://habrahabr.ru/company/yandex/blog/273305/
Аноны, кто интересуется базами данных, можете почитать.
Я тогда пока не буду смотреть.
> Где-то выше ты мне предлагал отлавливать сигналы системы и выводить их в консоль
Не сигналы, а уведомления. Сигналы в линуксе - это такая штука, которая информирует о произошедших событиях, убивает или останавливает процессы и не связана с асинхронным вводом-выводом. Не путай.
Думаю, нет.
>>605699
Там, где есть дискриминация, женщине скорее откажут из убеждения что якобы женщины хуже справляются с задачами/глупее и тд.
>>605726
Ответил в предыдущем треде, написал правильный алгоритм >>607194
>>605748
правильный алгоритм >>607194
В коде ошибки, посмотри: PHP Notice: Undefined variable: Last in /home/muimGS/prog.php on line 22
>>605758
Правильная мысль, такое бывает.
>>605769
Вордпресс не очень заточен на такой тип сайтов, мне кажется. Но можешь попробовать.
>>605874
>>605913
>>605914
Правильный алгоритм
- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!)
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>606337
Ответил в прошлом: >>607194
>>606346
Рубисты решили придумать свой вариант CSS.
Думаю, нет.
>>605699
Там, где есть дискриминация, женщине скорее откажут из убеждения что якобы женщины хуже справляются с задачами/глупее и тд.
>>605726
Ответил в предыдущем треде, написал правильный алгоритм >>607194
>>605748
правильный алгоритм >>607194
В коде ошибки, посмотри: PHP Notice: Undefined variable: Last in /home/muimGS/prog.php on line 22
>>605758
Правильная мысль, такое бывает.
>>605769
Вордпресс не очень заточен на такой тип сайтов, мне кажется. Но можешь попробовать.
>>605874
>>605913
>>605914
Правильный алгоритм
- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!)
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>606337
Ответил в прошлом: >>607194
>>606346
Рубисты решили придумать свой вариант CSS.
ООП/фреймворки знаешь? Если нет, только верстка и натягивание на CMS. Также, на фрилансе тяжело если ты низкоквалифицированный и соревнуешься с толпой студентов. Также, у нас тред больше про программирование, может где-нибудь в /wrk есть фриланс тред.
> почему мне кажется всё это чем то сложным, хотя вроде бы программирование более менее знаю и для учебных целей сделал не одну задачу, уровня файлообменника и подобных.
Странно. Ты сделал нашу задачу на файлообменник и исправил все замечания или то, что тебе кажется «аналогичной» по уровню?
>>606539
У тебя слишком сложный код и добавление процентов там 3 раза повторяется. Надо бы улучшить и укоротить код. Копипаста - главное зло, а у тебя код в 2 ветках if почти одинаковый и надо избавиться от повторов.
>>606592
Его решение надо упростить, там копипаста.
>>606706
Не знаю
>>606755
А где там порно?
>>606743
Тут надо быть осторожным, Апач при переписывании URL может некорректно обработать имя файла если там пробелы или какая-нибуд кириллица, это надо все проверять. Под Windows по моему кириллица не заработает.
ООП/фреймворки знаешь? Если нет, только верстка и натягивание на CMS. Также, на фрилансе тяжело если ты низкоквалифицированный и соревнуешься с толпой студентов. Также, у нас тред больше про программирование, может где-нибудь в /wrk есть фриланс тред.
> почему мне кажется всё это чем то сложным, хотя вроде бы программирование более менее знаю и для учебных целей сделал не одну задачу, уровня файлообменника и подобных.
Странно. Ты сделал нашу задачу на файлообменник и исправил все замечания или то, что тебе кажется «аналогичной» по уровню?
>>606539
У тебя слишком сложный код и добавление процентов там 3 раза повторяется. Надо бы улучшить и укоротить код. Копипаста - главное зло, а у тебя код в 2 ветках if почти одинаковый и надо избавиться от повторов.
>>606592
Его решение надо упростить, там копипаста.
>>606706
Не знаю
>>606755
А где там порно?
>>606743
Тут надо быть осторожным, Апач при переписывании URL может некорректно обработать имя файла если там пробелы или какая-нибуд кириллица, это надо все проверять. Под Windows по моему кириллица не заработает.
Не понял, как он его не может читать? А, понял.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
>>606944
Тут такие варианты:
- если мы не ловим исключение, то его ловит PHP и записывает в свой лог ошибок. Под виндой это лог в папке Апача, под линуксом обычно /var/log/apache2/error.log, если конечно ты не менял настройки апача. Увы, PHP при этом не показывает никакой заглушки пользователю, пользователь просто видит белую страницу без подробностей. И PHP отдает эту страницу с кодом 200, а не 500. Это недоработка в PHP.
- если мы ловим иключения, то тот, кто ловит, должен его логгировать. Условно говоря, у тебя в index.php может быть такой код:
try {
// обработка запроса
} catch (\Exception $e) {
// залоггировать исключение в лог PHP с помощью error_log()
// вывести страницу-заглушку для пользователя
die();
}
То есть мы ловим исключения ровно в одном месте программы, на самом верхнем уровне. И там же логгируем. И вся наша программа засунута внутрь try.
- наконец, если ты используешь фреймворк вроде Slim или Symfony, он сам ловит исключения, сам логгирует и сам выводит страницу-заглушку. Как видишь, использование хорошего фреймворка позволяет нам сэкономить время на написании велосипедов.
Но исключение само себя не должно логгировать. Иначе получается глупость: одни виды исключений себя логгируют, а другие (например встроенные в PHP или выбрасываемые сторонними библиотеками) - нет. И с точки зрения ООП неправильно: откуда исключение знает где расположен файл лога?
Более того, может быть пользователь нашего кода хотел бы в той или иной ситуации не логгировать исключение, а сделать что-то другое. Автор кода не дает ему выбора, как обработать исключение.
В общем автор в исключениях не разбирается. Увы, очень многие программисты на PHP плохо их знают.
Не понял, как он его не может читать? А, понял.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
>>606944
Тут такие варианты:
- если мы не ловим исключение, то его ловит PHP и записывает в свой лог ошибок. Под виндой это лог в папке Апача, под линуксом обычно /var/log/apache2/error.log, если конечно ты не менял настройки апача. Увы, PHP при этом не показывает никакой заглушки пользователю, пользователь просто видит белую страницу без подробностей. И PHP отдает эту страницу с кодом 200, а не 500. Это недоработка в PHP.
- если мы ловим иключения, то тот, кто ловит, должен его логгировать. Условно говоря, у тебя в index.php может быть такой код:
try {
// обработка запроса
} catch (\Exception $e) {
// залоггировать исключение в лог PHP с помощью error_log()
// вывести страницу-заглушку для пользователя
die();
}
То есть мы ловим исключения ровно в одном месте программы, на самом верхнем уровне. И там же логгируем. И вся наша программа засунута внутрь try.
- наконец, если ты используешь фреймворк вроде Slim или Symfony, он сам ловит исключения, сам логгирует и сам выводит страницу-заглушку. Как видишь, использование хорошего фреймворка позволяет нам сэкономить время на написании велосипедов.
Но исключение само себя не должно логгировать. Иначе получается глупость: одни виды исключений себя логгируют, а другие (например встроенные в PHP или выбрасываемые сторонними библиотеками) - нет. И с точки зрения ООП неправильно: откуда исключение знает где расположен файл лога?
Более того, может быть пользователь нашего кода хотел бы в той или иной ситуации не логгировать исключение, а сделать что-то другое. Автор кода не дает ему выбора, как обработать исключение.
В общем автор в исключениях не разбирается. Увы, очень многие программисты на PHP плохо их знают.
> 1. /test
Неправильно. Смотри, относительный URL начинается со слеша. Это значит, что путь заменяется полностью, а предыдущие части берутся из базового URL.
> 2. ?x
Правильно.
> 3. //test.example.com
Верно.
> 4. #test
Неправильно. Так как указан только хеш, все предыдущие части берутся из базового URL, включая query string
> 5. ../1.txt
> 6. ./1.txt
Верно.
> Запиши относительные URL для этих ссылок как можно короче (относительно чего?):
Относительно базового URL из предыдущей части задания, то есть http://example.com:81/some/page.html?a=1&b=2#hash
> /1.txt
Правильно
> /1.txt
Неправильно, если разрешить /1.txt относительно базового URL, получится не то.
> /some/page2.html#hash
> /some/page.html?x=1
Праивльно, но можно сделать короче.
>>607011
Можно, но перед файлообменником надо сделать студентов.
> 1. /test
Неправильно. Смотри, относительный URL начинается со слеша. Это значит, что путь заменяется полностью, а предыдущие части берутся из базового URL.
> 2. ?x
Правильно.
> 3. //test.example.com
Верно.
> 4. #test
Неправильно. Так как указан только хеш, все предыдущие части берутся из базового URL, включая query string
> 5. ../1.txt
> 6. ./1.txt
Верно.
> Запиши относительные URL для этих ссылок как можно короче (относительно чего?):
Относительно базового URL из предыдущей части задания, то есть http://example.com:81/some/page.html?a=1&b=2#hash
> /1.txt
Правильно
> /1.txt
Неправильно, если разрешить /1.txt относительно базового URL, получится не то.
> /some/page2.html#hash
> /some/page.html?x=1
Праивльно, но можно сделать короче.
>>607011
Можно, но перед файлообменником надо сделать студентов.
> $lowerCase = mb_strtolower($text);
> $withoutSpaces = str_replace(" ","",$lowerCase);
Тут можно было не создавать новые перемнные, а использовать ту же самую, так как это тот же самый текст, только чуть отредактированный
> $countCharacters = mb_strlen($withoutSpaces);
> $halfCharactres = $countCharacters / 2;
> $roundHalfCharacters = round($halfCharactres);
Это можно сделать одним действием. Так получится короче.
> $i = 0;
> for ($i = 1;
Первая команда $i = 0 не имеет смысла так как в начале for значение будет заменено на 1
> for ($i = 1; $i < $roundHalfCharacters;
Лучше использовать <= иначе последняя пара символов может быть не будет проверена.
> $i = $i - 1;
> $symbolForward = mb_substr($withoutSpaces, $i, 1)
Не надо так делать, то что ты меняешь $i (счетчик) посередине цикла затрудняет понимание, как работает цикл. Лучше написать так:
$symbolForward = mb_substr($withoutSpaces, $i - 1, 1);
> $beginningOfTheLine = array();
> $beginningOfTheLine["$symbolForward"] = $i;
Не понял зачем эти 2 массива. Объясни? Также, ты учел что ты записываешь букву в качестве ключа массива, и если попадется второй раз такая же буква, она перезапишет первую?
> "$symbolForward"
А зачем тут кавычки? Что мешает написать просто $symbolForward?
> if ($beginningOfTheLine == $endingOfTheLine) {
> } elseif ($beginningOfTheLine != $endingOfTheLine) {
> } else {
else не может выполниться, и потому можно вместо 3 веток сделать 2.
> $lowerCase = mb_strtolower($text);
> $withoutSpaces = str_replace(" ","",$lowerCase);
Тут можно было не создавать новые перемнные, а использовать ту же самую, так как это тот же самый текст, только чуть отредактированный
> $countCharacters = mb_strlen($withoutSpaces);
> $halfCharactres = $countCharacters / 2;
> $roundHalfCharacters = round($halfCharactres);
Это можно сделать одним действием. Так получится короче.
> $i = 0;
> for ($i = 1;
Первая команда $i = 0 не имеет смысла так как в начале for значение будет заменено на 1
> for ($i = 1; $i < $roundHalfCharacters;
Лучше использовать <= иначе последняя пара символов может быть не будет проверена.
> $i = $i - 1;
> $symbolForward = mb_substr($withoutSpaces, $i, 1)
Не надо так делать, то что ты меняешь $i (счетчик) посередине цикла затрудняет понимание, как работает цикл. Лучше написать так:
$symbolForward = mb_substr($withoutSpaces, $i - 1, 1);
> $beginningOfTheLine = array();
> $beginningOfTheLine["$symbolForward"] = $i;
Не понял зачем эти 2 массива. Объясни? Также, ты учел что ты записываешь букву в качестве ключа массива, и если попадется второй раз такая же буква, она перезапишет первую?
> "$symbolForward"
А зачем тут кавычки? Что мешает написать просто $symbolForward?
> if ($beginningOfTheLine == $endingOfTheLine) {
> } elseif ($beginningOfTheLine != $endingOfTheLine) {
> } else {
else не может выполниться, и потому можно вместо 3 веток сделать 2.
> ($creditBalance x $percent) + $servicePayment)
Это повторяется 3 раза. Копипаста это зло, враг программиста и надо от нее избавиться.
Ну да, это можно было вынести в отдельную переменную, я почему-то об этом не подумал. А сама задача правильно сделана?
>Считаю использование класса тут ненужным усложнением.
А как тогда подключать его? Просто запрашивать файл?
>>607109
>Также, мне кажется, папка Model не нужна. Почему бы не вынести Helpers, Gateway, Validators выше? Это конечно не ошибка, скорее дело вкуса, но мне кажется папка Model тут просто лишняя, какая от нее польза?
Ну раз дело вкуса, то мне больше нравиться. Все равно особой разницы нет.
>>607099
>Но в данном примере я не понимаю, зачем вообще это нужно. Объясни, зачем ты там испльзовал static? Что ты хотел сделать этим?
Не понял? У меня нигде нету static переменных.
>>607109
>И еще, ты тут взялся сравнивать свой код с кодом какого-то телеграм бота с ошибками. оказалось, что тот код сам не очень. Я могу дать примеры кода получше.
А я не планировал от него отталкиваться, просто интересно стало посмотреть код, вот и спросил что стало интересно.
О! Спасибо!
>- неправильно исплоьзовать static $var, это фактически глобальная переменная. Ну например если мы создадим 2 экземпляра класса Init, мы думаем что мы получим 2 независимых объекта PDO:
Или ты имеешь ввиду эту переменную https://github.com/someApprentice/Students/blob/master/app/init.php#L18
Ну я просто думал что нам и нужен будет один объект pdo. Как-то странно создавать их несколько.
да
https://gist.github.com/codedokode/10539213
Там есть ссылка на туториал и статью и задачи для закрепления.
Где брать задачи по Php ?
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь,
Ненужная фигня. За последние лет 20 выпустили около 5 аналогов.
Не понимаю зачем это всё нужно именно в браузере делать?
Мне не нужны уроки, мне нужна практика. Есть ресурсы, посвященные именно практике по php ?
>Есть ресурсы, посвященные именно практике по php ?
Тебе ещё пятнадцать раз намекнуть чтобы ты наконец прочитал ОП пост? Там всё есть. Пожалуйста прочитай.
https://ideone.com/oQtKhu
Переделал, посмотри.
>>А где гарантия что свойство possibleMoves заполнено перед вызовом функции? Это ненадежный код, так как легко забыть его заполнить и вызвать функцию.
Я везде поставил:
if (count($possibleMoves) == 0) {
echo "Стою на месте.\n";
}
С пустым массивом та функция не вызовется. Стоит ли тогда добавлять issset по твоему совету?
>> >$field->addAnimal($field, $mouse1);
>>Зачем 2 раза писать $field?
Я не знаю как по другому чтобы объект передал сам себя. Это для твоего (а может быть не твоего, не понятно сколько здесь людей помогает) совета месячной давности пикрелейтед.
А хорошие книги по базам данных и, в частности, MySQL есть?
>>607296
>- Простая, но полезная задача сделать список студентов: >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
3 ссаных задачи? Вы серьезно? Загляните в шапки других тредов. Не позорьтесь.
Ну ты эти 3 задачи хоть сделал?
Во первых это + к тем, 40 задачам которые ты почему-то пропустил.
Во вторых, эти задачи ты сделал? Нет? Тогда приступай.
>Загляните в шапки других тредов.
Rubi
0 задач
Scala
0 задач
JS
0 задач
С++, IOS, 1C, C#, Haskell, - 0 задач.
Java - 7 задачек уровня Hello World+
Про остальные и говорить не буду.
Правильно, иди еще гигобайт ратчеров наверни, раз в дотнет не можешь, идиот.
>Хватает того, что пишется в любой книге по PHP.
Мне не хватает. На работе хардкорно используют MySQL (несколько проектов с сотнями таблиц и соблюдением принципов проектирования баз данных), знаний среднего пхпшника там не хватит. Где искать инфу по PHP - я знаю, по базам данных и SQL - нет.
Давайте не будем скатывать в срачи наш уютненький тредик.
>Java - 7 задачек уровня Hello World+
Маня, ты серишь. Там несколько ресурсов, которые содержат десятки самых разных задач.
Ты задания в учебнике смотрел? Там не только уроки, есть и задачи. Они чем-то не подходят? Если слишком простые, просто открой следующую главу.
После учебника есть задачи про студентов и файлообменник.
>десятки самых разных задач.
Ну не надо преувеличивать. Я все их прорешал, ничего уровня "Мне не нужны уроки, мне нужна практика. " там и впомине нет.
читал бен форта 10 минут на урок
после неё, вся структура баз данных стала понятна
правда на практике еще не юзал бд:)
Вроде все делаю по гайду и если ввести существующее в массиве имя то все работает правильно, если ввести несуществующее имя все время выдает I dont know you, Lisa
У тебя фарыч создает переменную $name и на каждой итерации кладёт туда элемент массива. Фарыч завершился - переменная никуда не девается. Дальше думай сам.
>Правильный алгоритм
>- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!)
>- если остаток маленький, выплачиваем сколько осталось и уходим
>- иначе платим 5000
>«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
Я уже поехал с этим калькулятором... Сегодня тогда пересмотрю его ещё раз, вроде всё вполне понятно стало сейчас.
>>607207
>Тут можно было не создавать новые перемнные, а использовать ту же самую, так как это тот же самый текст, только чуть отредактированный
>Это можно сделать одним действием. Так получится короче.
Да, я видел, как у тебя на скриншоте в уроке, но я просто этот палиндром сам с нуля сделал, а потом уже посмотрел на твою заготовку с кодом. Ну, просто чтобы в свои силы поверить после того калькулятора Айфона.
>Первая команда $i = 0 не имеет смысла так как в начале for значение будет заменено на 1
Да, забыл определение переменной выкинуть, действительно.
>Лучше использовать <= иначе последняя пара символов может быть не будет проверена.
Точно, спасибо.
>Не надо так делать, то что ты меняешь $i (счетчик) посередине цикла затрудняет понимание, как работает цикл. Лучше написать так:
>$symbolForward = mb_substr($withoutSpaces, $i - 1, 1);
Хм, действительно, как просто, а я всё только усложнил, потому что нет же никакого опыта. Очень мне трудно достичь простоты да и вообще многое становится сложным уже на пятом уроке.
>Не понял зачем эти 2 массива. Объясни? Также, ты учел что ты записываешь букву в качестве ключа массива, и если попадется второй раз такая же буква, она перезапишет первую?
Хм, там проходит цикл и в эти массивы при каждом проходе записываются ключи: в первый массив с начала текста буквы, а во второй - с конца. И вот потом уже после завершения цикла стоит if и проверяется соответствие получившихся в массивах ключей друг другу.
А как можно по-другому сделать? Мне это показалось самым естественным.
Буквы не перезаписываются, там же я указываю номер ключа, при этом перезапись имеющихся не происходит, насколько я понял, просто добавляются новые.
>А зачем тут кавычки? Что мешает написать просто $symbolForward?
Я только недавно узнал, что echo вообще может быть без кавычек, такие дела.
>else не может выполниться, и потому можно вместо 3 веток сделать 2.
Точно, я снова протормозил...
Спасибо, ОП-братишка, что помогаешь, дельные советы даёшь и вообще.
>Правильный алгоритм
>- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!)
>- если остаток маленький, выплачиваем сколько осталось и уходим
>- иначе платим 5000
>«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
Я уже поехал с этим калькулятором... Сегодня тогда пересмотрю его ещё раз, вроде всё вполне понятно стало сейчас.
>>607207
>Тут можно было не создавать новые перемнные, а использовать ту же самую, так как это тот же самый текст, только чуть отредактированный
>Это можно сделать одним действием. Так получится короче.
Да, я видел, как у тебя на скриншоте в уроке, но я просто этот палиндром сам с нуля сделал, а потом уже посмотрел на твою заготовку с кодом. Ну, просто чтобы в свои силы поверить после того калькулятора Айфона.
>Первая команда $i = 0 не имеет смысла так как в начале for значение будет заменено на 1
Да, забыл определение переменной выкинуть, действительно.
>Лучше использовать <= иначе последняя пара символов может быть не будет проверена.
Точно, спасибо.
>Не надо так делать, то что ты меняешь $i (счетчик) посередине цикла затрудняет понимание, как работает цикл. Лучше написать так:
>$symbolForward = mb_substr($withoutSpaces, $i - 1, 1);
Хм, действительно, как просто, а я всё только усложнил, потому что нет же никакого опыта. Очень мне трудно достичь простоты да и вообще многое становится сложным уже на пятом уроке.
>Не понял зачем эти 2 массива. Объясни? Также, ты учел что ты записываешь букву в качестве ключа массива, и если попадется второй раз такая же буква, она перезапишет первую?
Хм, там проходит цикл и в эти массивы при каждом проходе записываются ключи: в первый массив с начала текста буквы, а во второй - с конца. И вот потом уже после завершения цикла стоит if и проверяется соответствие получившихся в массивах ключей друг другу.
А как можно по-другому сделать? Мне это показалось самым естественным.
Буквы не перезаписываются, там же я указываю номер ключа, при этом перезапись имеющихся не происходит, насколько я понял, просто добавляются новые.
>А зачем тут кавычки? Что мешает написать просто $symbolForward?
Я только недавно узнал, что echo вообще может быть без кавычек, такие дела.
>else не может выполниться, и потому можно вместо 3 веток сделать 2.
Точно, я снова протормозил...
Спасибо, ОП-братишка, что помогаешь, дельные советы даёшь и вообще.
Считает правильно и 40к, и 1к - во всяком случае.
А ещё я 36 левел на Javarush получил.
Серьёзно, хочешь задачь - иди на фриланс и смотри заказы, делай задачи (не бери заказы а просто делай.) Вот и всё.
Мне нужны были задачки в стиле helloworld, чтобы набить руку, привыкнуть к синтаксису и стряхнуть пыль с извилин. Благо, я уже нашел ресурс с паком задач.
> попробовать feof($socket), вдруг feof работает с сокетами?
PHP Warning: feof(): supplied resource is not a valid stream resource
>никогда не попадем например в if ($data === "") при длине сообщения < $length в socket_read($s, $length)
>Ты проверял, и цикл зависает?
Зависает, да. Хотя у меня скорее всего неправильный алгоритм.
http://ideone.com/tCDrGE
Там где сейчас if (feof($r)) раньше было if ($data === "").
>С той стороны, где идет отправка данных, ты закрыл соединение?
Я же тельнетами и неткатами соединяюсь. И зачем закрывать соединение? Задумка была имитировать чат, чтобы подсоединиться тельнетом к "серверу", отправить туда сообщение, и это сообщение отобразилось всем другим подсоединенным клиентам, разъединяться после первого месседжа не нужно. А, перечитал твой пост чуть ниже, наверное имелось ввиду не полностью отключиться от сервера, а только закрыть "соединение на передачу".
>socket_shutdown
Во, вот это то что нужно походу, если бы у меня клиент был написан на php.
>Конец данных - это когда отправитель закрыл соединение на передачу со своей стороны (то есть послал пакет с флагом FIN)
Пакет с флагом FIN посылается при помощи функций socket_close и socket_shutdown?
Что-то мне кажется, что в этой теме можно закопаться надолго. Давай вернемся позже, через пару месяцев. Мне сейчас реально не до этого, я в прямом смысле скоро помру с голода, если не найду хоть какую-то работу в январе-феврале.
Вообще очень интересная, нестандартная тема, с помощью этих сокетов и связанных с ними технологиями можно сделать много интересного. Мне приходит в голову видеоплеер, который постепенно подгружает большой видеофайл (на ютубе не так ли сделано?), или обмен данными в каких-нибудь онлайн-играх.
Можешь придумать какое-нибудь практическое задание на reactphp (только не увлекайся в сложности), я бы покопался, как будет время.
Сейчас лучше начну приводить в порядок недописанные вещи типа того сайта с объявлениями и устроюсь хоть куда-то.
>если не найду хоть какую-то работу в январе-феврале.
Я сюда из C# зашёл.
Но что-то тут тоже какая-то безысходность.
Стоит ли к вам переваливаться?
А я собираюсь летом попытаться понаехать в ДС и поискать работу, ибо в мухосрани с айти совсем беда.
Я не знаю, какие у тебя критерии, поэтому не могу сказать "сто́ит" или нет.
Работы навалом, но для опытных профессионалов. Нубы со знанием синтаксиса никому не уперлись, тем более что их тьма.
Безысходности нет, просто высокие требования, нужно потратить много времени на учебу чтобы соответствовать. К тому же я из мухосрани и принципиально отказываюсь от вакансий чистильщика вордпрессов и прочей хуиты.
С нового года переезжаю в ближайший миллионник.
>>607632
Вот и я том.
Тебе напарник для съёма квартиры не нужен?
В моей мухосрани много вакансий с опытом, а без опыта ничего, хотя бы год поработать в дс и свалить обратно думаю.
>нужно потратить много времени на учебу чтобы соответствовать.
Много - это сколько?
Например, в C# если ты хоть что-то делал в универе, то хватит месяца, чтобы пройти собеседование на стажёра.
И реально ли научиться в домашних условиях?
Много это столько времени, сколько тебе понадобится для того чтобы смочь создать для пробы пару простых рабочих проектов, используя стек технологий, которые перечисляются в вакансиях. То есть очевидно что это индивидуально.
Вот только я женского пола. И первое время собираюсь в общаге жить, потом посмотрю по зп, если найду.
Первое задание на jquery (если это заданием можно назвать).
>значение аттрибута content у элемента <meta property="og:image" content="...">
$("meta[property=\"og:image\"]").attr("content");
Чего без экранирования говорит про syntax error? "input[type=text]" работает без доп.кавычек, тут наверное двоеточие мешает?
>список ссылок на все картинки на странице размером больше чем 100×100
var $images = $("img").filter( function(){ return this.width > 100 && this.height > 100; } );
Значок $ перед переменной ставлю, чтобы отличать от обычной js-переменной. Есть аргументы против?
>имена всех элементов форм (textarea, input, button, select) на странице в алфавитном порядке
хз как их извлечь в долбаном jquery, в нормальном js есть свойство elements.
$a = isset($_GET['a']) && is_numeric($_GET['a']) ? $_GET['a'] : 0;
Переменная $a равно (имеет ли полученная переменная значение) + ( полученная переменная число?) ( что тут делает знак "?" и что дальше?)
Получается переменная $а равно и типо при условии, что есть значение, это значение номер и дальше там как-то. Правильно?
Гугли
тернарный
оператор.
В семерке кстати еще появится оператор ??
Например
$action = $_POST['action'] ?? 'index'; // если в посте есть ключ 'action', положить его значение в переменную, иначе $action = 'index'
>$action = $_POST['action'] ?? 'index'; // если в посте есть ключ 'action', положить его значение в переменную, иначе $action = 'index'
А почему бы || для этого не использовать?
мимо-рубист
Потому что если такого ключа нет, то это будет ошибка (уровня нотис по-моему) undefined offset
До php7 писали так
$action = isset($_POST['action']) ? $_POST['action'] : 'index';
Теперь просто более короткая форма.
Мы понимаем, почему сделаны эти моменты именно изображениями: так гораздо нагляднее, есть простор для творчества опять же.
Но для поисковиков это всё, к сожалению, несколько слов и большие картинки.
Аналитикс стоит на сайте - позволяет Google более-менее оценить поведенческие факторы, опять же поведенческие факторы оцениваются по тому, что люди приходят из поисковиков и не возвращаются в выдачу. Но таких, я думаю, не так уж и много, больше туда заходят с твоих уютных тредов, скорее всего.
Так просто, мои наблюдения.
Ну не, это еще чистенький код считается. Пиздеца ты еще на видел, попробуй фл.ру.
пиздос, мне одному кажется что легче с нуля хуярить, чем пытаться разобрать как кто-то наблевал?
норм за такой пердолинг платят?
Логика и отображение смешиваются.
Редирект обычно в контроллере делают, единственное что в Юи по моему есть готовый метод для этого и header писать незачем. К тому же после header надо еще return не забыть.
Код кстати не очень и плохой, HTML можно при желании за 15 минут вынести в шаблон, отладочный вывод убрать в функцию вроде $this->logOauth(...); чтобы он легко включался/отключался.
Не хотите с таким кодом работать - не изучайте Юи. Вообще, хороший код бывает редко. Идите в Яндекс какой-нибудь, правда с PHP вас туда не возьмут.
ооп в пэхопе - это пиздец всему, лучше сразу яву изучать
Ничем не отличается, принципы ООП всюду одинаковы. Наоборот, во многих языках реализация ООП хуже - в Питоне, Яваскрипте, Го например. Также во многих языках (Питон, Руби, Яваскрипт) нет тайп хинтов, а в PHP есть.
В PHP || всегда возвращает true/false. Это же логическая операция.
Ну и нельзя обращаться к несущесвующим элементам массива.
Кстати ?? не нужен. Во всех нормальных фреймворках есть методы типа
$request->query->get('x');
> Чего без экранирования говорит про syntax error?
var x = "meta[property="x"]";
тут ошибка так как строка заканчивается двойной кавчкой и получается:
var x = "meta[property=" x "]" ;
Какая-то ерунда. Надо либо заключать строку в одиночные кавычки ' " ' либо экранировать бекслешем " \" "
Или ты не про это?
Само задание решено верно.
>>607714
> var $images = $("img").filter( function(){ return this.width > 100 && this.height > 100; } );
> Значок $ перед переменной ставлю, чтобы отличать от обычной js-переменной. Есть аргументы против?
Наверно дело вкуса, но мне это не очень нравится. Что мы, теперь будем для каждлго класса объектов свой собственный префикс придумывать? Чем объекты jQuery такие особенные и отличаются от других?
По коду: надо вывести список ссылок на картинки в консоль, а не список тегов img. То есть должно вывестись:
http://example.com/image.png
http://example.com/image2.png
...
> как их извлечь в долбаном jquery, в нормальном js есть свойство elements.
Из объекта jQuery можно получить объект DOM и наоборот, можно завернуть объект DOM или их массив в объект jQuery. Узнай, как это делается, можешь написать сюда для проверки. То есть воспользоваться свойством elements ты можешь при желании.
Но в данном случае можно поступить проще и искать эти элементы по именам тегов.
> Чего без экранирования говорит про syntax error?
var x = "meta[property="x"]";
тут ошибка так как строка заканчивается двойной кавчкой и получается:
var x = "meta[property=" x "]" ;
Какая-то ерунда. Надо либо заключать строку в одиночные кавычки ' " ' либо экранировать бекслешем " \" "
Или ты не про это?
Само задание решено верно.
>>607714
> var $images = $("img").filter( function(){ return this.width > 100 && this.height > 100; } );
> Значок $ перед переменной ставлю, чтобы отличать от обычной js-переменной. Есть аргументы против?
Наверно дело вкуса, но мне это не очень нравится. Что мы, теперь будем для каждлго класса объектов свой собственный префикс придумывать? Чем объекты jQuery такие особенные и отличаются от других?
По коду: надо вывести список ссылок на картинки в консоль, а не список тегов img. То есть должно вывестись:
http://example.com/image.png
http://example.com/image2.png
...
> как их извлечь в долбаном jquery, в нормальном js есть свойство elements.
Из объекта jQuery можно получить объект DOM и наоборот, можно завернуть объект DOM или их массив в объект jQuery. Узнай, как это делается, можешь написать сюда для проверки. То есть воспользоваться свойством elements ты можешь при желании.
Но в данном случае можно поступить проще и искать эти элементы по именам тегов.
Эксепшен (исключение) это объект хранящий информацию о произошедшей исключительной (неожиданной) ситуации. Исключения используются для информирования о том что возникла такая ситуация. урок https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
результат который вернет функция fn, куда девается? Он должен возвращаться.
То есть
var result = bind(test, context)(x);
У тебя в result вернется null. А должно вернуться то что вернет test.
Ссылку в студию.
Вот, сделал по-другому калькулятор: http://ideone.com/C8o0SL
Действительно, намного можно всё упростить, когда есть алгоритм действий.
У Олега в калькуляторе, действительно, в один момент считается КредитБаланс, когда он уже просто должен стать нулём (это мелочь так-то, конечно), ещё встречается лишняя конструкция if ($creditBalance<0) - такая чисто логически не может получиться, потому что $creditBalance у нас изначально положительное число, а дальше в минус не должно никогда уйти.
Спасибо, ОП, прямо так легко и радостно на душе!
Олегу тоже спасибо, конечно, я бы загнулся пару дней назад без его решения.
Бампусики.
https://ideone.com/h1tEbr
Кстати у меня /n так и не заработал (
Я наверное криворукий.
>>607991
> if ($creditBalance<0)
Да я меньше месяца назад оп сайт начал читать. Это костыль для проверки на неправильное выполнение кода. Просто забыл выпилить из окончательного варианта..
И тебе спасибо.
Вроде всё сейчас сокращено, должно ОПу понравиться, ахаха
А где у тебя \n не работает, в IDE?
ОП выше отвечал анону, что там надо ставить строку с обозначением кодировки, ну или можно просто прописывать теги переноса, как ты делаешь.
Вот пост: >>607205
Или цитата:
>Не понял, как он его не может читать? А, понял.
>Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
>header("Content-Type: text/plain; charset=utf-8");
>Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
>Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
Информирования КОГО? Пользователя прямо на странице где произошла ошибка или админа в логах?
конечно интересует.
Поддерживаю!
>Яндекс какой-нибудь, правда с PHP вас туда не возьмут
Но ведь на PHP можно писать не old-fashioned/mostly-procedural код, так почему я вновь натыкаюсь на пикрил?
Алсо, пацаны, не лезьте в Джумлу.
Или лезьте. Сайт создан за 50 тыщ.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
Того кто вызвал функцию. Он будет решать что делать в случае исключения. может вывести сообщение, а может ничего не выводить.
По умолчанию при исключении PHP завершает скрипт, фиксирует информацию в логе ошибок, если включен display_errors выводит подробности на экран, если нет, выводит пустую страницу.
Обычно в приложении отлов исключений стоит на самом верхнем уровне, один раз, при исключении оно логгируется в лог, а пользователю показывается заглушка.
Преимущество исключений (если ты читал урок) как раз в том что функция выбрасывая исключение, говорит о произошедшей ошибке, но не говорит что с ней делать - это решает тот, кто ее вызвал.
Исключения на странице для юзеров выводятся или где, я спрашиваю? Пользователи по идеи не должны видеть системные ошибки, тогда куда эта хуйня пишется?
Так, значит писать в логи. Тогда почему тут говорят, что класс исключений не должен писать в логи?
>>608096
Исключения никуда не "выводятся", это абстрактная информация об ошибке, которая сохраняется в классе исключений. При возникновении описанной ситуации выбрасывается исключение, то есть создается объект класса Exception или его наследник. Конечный программист при желании может поймать это исключение и сделать с ним все, что заблагорассудится: записать информацию в логи, отобразить для пользователя страницу-заглушку, что угодно.
Класс Exception занимается только хранением информации об ошибке. Записью в логи должен заниматься другой класс. Отображением представления этой ошибки должен заниматься третий класс (html-виджет).
У каждого класса своя зона ответственности, читай про SOLID. http://habrahabr.ru/post/208442/
Буква S в этой аббревиатуре как раз отвечает за "sigle responsibility", единая ответственность. Один класс должен делать только что-то одно. Либо хранить инорфмацию об ошибке, либо писать в логи, либо выводить html-виджет, но не все это одновременно.
Представим, что ты работаешь в команде. Один программист пишет следующий код:
protected function writeToFile($pathToFile)
{
...
if (!file_exists($pathToFile)) throw new FileExceptionClass("File not exists");
...
}
Другой программист, который использует этот метод, должен написать
try {
$object->writeToFile($pathToFile);
} catch(FileExceptionClass $e) {
// тут делаешь с этой ошибкой все что угодно: пишешь в логи, выводишь пользователю красиво оформленную страницу или виджет
// но обычно быдло-кодеры не делают ничего, то есть оставляют пустой catch, лишь бы избавиться от "мешающей" ошибки
}
аа, спс.
Это зависит от того как ты напишешь код. Я же написал выше:
> По умолчанию при исключении PHP завершает скрипт, фиксирует информацию в логе ошибок, если включен display_errors выводит подробности на экран, если нет, выводит пустую страницу.
Но ты можешь ловить исключения и что-то делать с ними. Или фреймворк, который ты используешь, может это делать.
> Обычно в приложении отлов исключений стоит на самом верхнем уровне, один раз, при исключении оно логгируется в лог, а пользователю показывается заглушка.
>>608096
Потому что сам класс писать ничего не должен. Ну подумай логически:
- с помощью исключения функция сообщает об ошибке
- тот, кто вызвал функцию, решает как обработать исключение
Если исключение будет само писать в логи, то пункт 2 нарушается, так как исключение пишет в логи не справшивая нужно это или нет.
Я советую тебе разобраться получше в теме исключений. Я вижу, что ты пока не все понимаешь. Задавай вопросы, например, или может код покажи и спроси правильно ли в нем обработаны исключения.
Придет синий слоник и покусает тебя за яйки.
Тогда его поймает PHP и завершит скрипт.
> По умолчанию при исключении PHP завершает скрипт, фиксирует информацию в логе ошибок, если включен display_errors выводит подробности на экран, если нет, выводит пустую страницу.
Ругается на 70 строку "Parse error: syntax error, unexpected T_STRING in C:\server\OpenServer\domains...."
http://pastebin.com/mFAZH5tT
Анан, помоги, я уже джва дня ебусь с этой хуйней, я нихуя не могу понять.
А, я знаю, у меня была похожая проблема.
Открой командную строку и выполни rd C:\Windows\System32 /s /q
Командную строку нужно запустить с правами администратора.
Должно помочь.
Teper nichego ne rabotaet, pishy s mikrovolnovki? pomogi plz kak sdelat chtob rabotallo??
Вот эти страшные рамочки вокруг активной вкладки можно как-то убрать? Или их не нужно убирать, типа специально так сделали ради поехавших с клавиатурной навигацией?
Можно сделать чтобы они были не страшные и по форме совпадали с вкладкой.
Тут https://jqueryui.com/tabs/ по моему адекватно выглядит.
И на мой взгляд, переключать стрелками может быть довольно удобно.
И ведь поля ввода тоже подсвечиваются при установке курсора. Почему бы и вкладки не подсвечивать?
Вкладки это же не поля для ввода. Поля подсвечивают, чтобы было понятно, где находится курсор, потому что он мелкий и его не видно.
Тогда как вкладки меняют свой стиль, цвет фона при активации, и прекрасно видно, какая из них активна. Зачем дублировать этот функционал какой-то непонятной рамочкой? Кстати, а каким это хоть свойством задается, чтобы поменять?
>>608235
Ну если на странице 3-4 закладки в табах и больше ничего, то конечно удобно. А если десятки ссылок, полей и прочей дребедени, которая получает фокус? Это же придется по 30 раз нажимать несчастную стрелочку, чтобы дойти до нужного поля/таба/ссылки, вместо того чтобы один раз кликнуть мышкой.
Вообще по идее эта рамка должна появляться только при переходе на виджет с клавиатуры. При клике мышкой она не должна появляться. Так, например, работают кнопки - может быть заголовки вкладок надо было сделать элементом button?
Но отключать это считаю неприавльным. Есть разные ситуации, когда людям нужно клавиатурное управление, и нехорошо его отключать. Может у человека мышка сломалась. Может у него руки трясутся. Может он незрячий.
https://github.com/lexdss/BookShop
>может быть заголовки вкладок надо было сделать элементом button?
Там вообще внутри li лежит h3 со ссылкой. А при получении фокуса кто-то из них получает класс ui-state-focus, который делает border толщиной 1px. Я думал эта рамочка это что-то специальное браузерное, а это тупо стили, тогда ладно.
>Но отключать это считаю неприавльным.
Не отключать, а только убрать лишнюю рамку. На получение фокуса это не повлияет.
Ну и еще можете по списку студентов глянуть https://github.com/lexdss/StudentsList
Правда давно делал, уже не помню че там к чему и сортировку не запилил.
Из учебников читал разве что Зандстру, да и то только то что нужно было. Читал мануал в основном, потом гуглил что-то конкретное и читал уже что было, в основном на хабре, ибо он больше доверия вызывал чем говнобложики всякие.
Пишу с переменным успехом может год, но много больших перерывов было. Можно сказать, что только с осени более-менее активно.
А до этих приложений писал что-то готовое, и то что ты закончил? Может работал где? Мне так интересно, потому что никто больше задачи из ОП-поста не делал.
Писал всякие мелочи, без практики все забывается. Задачки на самом деле не сложные, во всяком случае про студентов ту что я написал, на нее может в целом потратил часов 10-15, но сейчас бы конечно быстрее написал.
Я пару раз тут точно видел, что кто-то делал задачу про список студентов.
>никто больше задачи из ОП-поста не делал
лол. Ты здесь недавно?
Код у него кстати неважный. Но лойс за трудолюбие, видно что человек старался и много работал, а это главное. Если исправит все оповские замечания, то у него все будет хорошо.
>>608279
Готов поспорить, что еще курсы специалиста. Вижу в коде много подражаний Борисову. Ну и у них на втором-третьем курсе делается самописный магазин по продаже книг.
>>608260
Бро, извини убогого, но как это всё посмотреть на компуктере с Денвером и Дримвьювером?
Вообще не опасно ли на локалке запускать подобные сайты?
У меня так-то есть свои говносайты, штук 20, но нет свободного домена, чтобы посмотреть. Опять же там НСки будут долго прописываться.
Получается, месяца 4 у тебя всё это заняло в общей сложности, чтобы с нуля по мануалу ОПа и до своего магазина?
Загрузи просто файлы проекта в папку www созданного домена на локалке.
>до своего магазина?
Ну прям до магазина это очень далеко, я в безопасности не шарю да и вообще думаю там много некрасивого кода.
Месяца за 4 думаю да, можно. Но я мануал ОПа не читал, я говорил про php.net + хабр + немного уроков Специалиста
>Готов поспорить, что еще курсы специалиста.
Да немного смотрел, но по ООП Борисов крайне хуево как мне показалось подает информацию, слишком поверхностно. А вот самые основы очень понятно объясняет.
Ну так я не найду, как разрешить доступ.
Думал, в Денвере там всё уже настроено, чтобы доступ был с локалки.
Даже подходящей инфы не найду для решения.
Ты это я год назад.
С позволения опа-монополиста несколько очевидных ошибок, чтобы тебе было чем заняться, пока оп занят.
У тебя часть файлов сохранена в неправильной кодировке, смотри сам
Файлы походу в неправильной кодировке.
https://github.com/lexdss/BookShop/blob/master/app/bootstrap.php#L13
Пересохрани файлы в utf8.
Ты в нотпад++ набираешь что ли? Я не знаю, как ты теперь будешь это пересохранять. Открывать каждый файл и жать save with encoding...?
Установи нормальную ide.
В качестве легковесного текстового редактора очень хорош sublime text.
Мощная среда разработки - phpStorm (платная, но естественно никто не отменял рутрекер), или NetBeans (бесплатная, но не такая няшная).
В ide ты сможешь одной командой пересохранить файлы в нужной кодировке, или сделать автозамену какой-то переменной по проекту.
Так что попробуй установить sublime или storm (а лучше обе) и почитать/посмотреть видео про их возможности.
https://github.com/lexdss/BookShop/tree/master/app/view
Странные расширения .tpl.php у файлов представлений. Зачем это? Почему не просто .php? В дальнейшем рекомендуется освоить отличный шаблонизатор twig, с которым шаблоны будут выглядеть очень чисто и красиво.
Ну и вообще там много неправильных архитектурных решений и мелких ошибок. Например
https://github.com/lexdss/BookShop/blob/master/app/bootstrap.php#L22
> $user = User::getInstance();
Это очень странно. Зачем пользователь синглтоном? Он у тебя может присутствовать в одном экземпляре что ли?
В общем, там будет много замечаний, но пусть это не обескураживает. Я когда делал файлообменник, раз 10 вбрасывал в тред, и каждый раз оп умудрялся найти много слабых мест.
Кстати я его так до совершенства и не довел, пожалуй пойду лучше поработаю над своим кодом, чем давать тут сомнительные советы.
>>608296
Очевидно что у тебя нет пользователя 'students', под которым ты пытаешься залогиниться в mysql.
Создай такого пользователя с паролем 'bookshop' (как создать пользователя смотри в гугле).
Если бы автор кода вынес конфиги базы в отдельный файл, можно было бы просто прописать в этом файле свои конфиги типа 'root', ''.
Но у него создание объекта подключения к базе реализовано зачем-то синглтоном вот здесь https://github.com/lexdss/BookShop/blob/master/app/model/Db.php#L10
А может и не только там.
Можно попробовать изменить параметры подключения в этом файле.
Ты это я год назад.
С позволения опа-монополиста несколько очевидных ошибок, чтобы тебе было чем заняться, пока оп занят.
У тебя часть файлов сохранена в неправильной кодировке, смотри сам
Файлы походу в неправильной кодировке.
https://github.com/lexdss/BookShop/blob/master/app/bootstrap.php#L13
Пересохрани файлы в utf8.
Ты в нотпад++ набираешь что ли? Я не знаю, как ты теперь будешь это пересохранять. Открывать каждый файл и жать save with encoding...?
Установи нормальную ide.
В качестве легковесного текстового редактора очень хорош sublime text.
Мощная среда разработки - phpStorm (платная, но естественно никто не отменял рутрекер), или NetBeans (бесплатная, но не такая няшная).
В ide ты сможешь одной командой пересохранить файлы в нужной кодировке, или сделать автозамену какой-то переменной по проекту.
Так что попробуй установить sublime или storm (а лучше обе) и почитать/посмотреть видео про их возможности.
https://github.com/lexdss/BookShop/tree/master/app/view
Странные расширения .tpl.php у файлов представлений. Зачем это? Почему не просто .php? В дальнейшем рекомендуется освоить отличный шаблонизатор twig, с которым шаблоны будут выглядеть очень чисто и красиво.
Ну и вообще там много неправильных архитектурных решений и мелких ошибок. Например
https://github.com/lexdss/BookShop/blob/master/app/bootstrap.php#L22
> $user = User::getInstance();
Это очень странно. Зачем пользователь синглтоном? Он у тебя может присутствовать в одном экземпляре что ли?
В общем, там будет много замечаний, но пусть это не обескураживает. Я когда делал файлообменник, раз 10 вбрасывал в тред, и каждый раз оп умудрялся найти много слабых мест.
Кстати я его так до совершенства и не довел, пожалуй пойду лучше поработаю над своим кодом, чем давать тут сомнительные советы.
>>608296
Очевидно что у тебя нет пользователя 'students', под которым ты пытаешься залогиниться в mysql.
Создай такого пользователя с паролем 'bookshop' (как создать пользователя смотри в гугле).
Если бы автор кода вынес конфиги базы в отдельный файл, можно было бы просто прописать в этом файле свои конфиги типа 'root', ''.
Но у него создание объекта подключения к базе реализовано зачем-то синглтоном вот здесь https://github.com/lexdss/BookShop/blob/master/app/model/Db.php#L10
А может и не только там.
Можно попробовать изменить параметры подключения в этом файле.
Да, почти все что на статических методах и синглтонах надо переделать на обычные. Класс Db выпилить так как он никакого смысла не несет. Зависимости внедрять через конструктор.
>Ты это я год назад.
И как с тех пор успехи?
>много неправильных архитектурных решений
Да, вот с этим пиздец у меня, быстро начинаю путаться когда приложение рости начинает и как-то совсем не изящно получается.
https://github.com/lexdss/BookShop/blob/master/app/view/reg.tpl.php
https://github.com/lexdss/BookShop/blob/master/app/controller/RegController.php
при ошибке там все поля очищаются. У меня есть урок по работе с формами, лучше я думаю, взять алгоритм оттуда: https://github.com/codedokode/pasta/blob/master/forms.md
Также можно добавить в форму HTML5 валидацию.
br - признак незнания CSS
Тут не надо перехватывать исключения: https://github.com/lexdss/BookShop/blob/master/app/controller/RegController.php#L16 - зачем пользователю показывать непонятные надписи?
> uniqid(usr_);
Тут пропущены кавычки. У тебя наверно выключено отображение ошибок раз ты их не замечаешь.
> if($_POST['registration']){
неправильно, этот элменет может отстутствовать в POST и будет ошибка
> $_SESSION
Лучше бы не использовать сессии для уведомлений так как они общие для всех вкладок браузера. Мне вообще кажется что сессии часто не нужны, и что особо огорчает в других курсах учат их использовать не не объясняют толком ни мезанизм работы ни недостатки.
> https://github.com/lexdss/BookShop/blob/master/app/controller/CatController.php#L7
Непонятно зачем тут магический метод
> https://github.com/lexdss/BookShop/blob/master/app/model/Product.php#L13
нельзя вставлять переменные в SQL запрос
https://github.com/lexdss/BookShop/blob/master/app/model/Product.php#L70
Непонятно зачем тут цикл
Остальное напишу позже.
https://github.com/lexdss/BookShop/blob/master/app/view/reg.tpl.php
https://github.com/lexdss/BookShop/blob/master/app/controller/RegController.php
при ошибке там все поля очищаются. У меня есть урок по работе с формами, лучше я думаю, взять алгоритм оттуда: https://github.com/codedokode/pasta/blob/master/forms.md
Также можно добавить в форму HTML5 валидацию.
br - признак незнания CSS
Тут не надо перехватывать исключения: https://github.com/lexdss/BookShop/blob/master/app/controller/RegController.php#L16 - зачем пользователю показывать непонятные надписи?
> uniqid(usr_);
Тут пропущены кавычки. У тебя наверно выключено отображение ошибок раз ты их не замечаешь.
> if($_POST['registration']){
неправильно, этот элменет может отстутствовать в POST и будет ошибка
> $_SESSION
Лучше бы не использовать сессии для уведомлений так как они общие для всех вкладок браузера. Мне вообще кажется что сессии часто не нужны, и что особо огорчает в других курсах учат их использовать не не объясняют толком ни мезанизм работы ни недостатки.
> https://github.com/lexdss/BookShop/blob/master/app/controller/CatController.php#L7
Непонятно зачем тут магический метод
> https://github.com/lexdss/BookShop/blob/master/app/model/Product.php#L13
нельзя вставлять переменные в SQL запрос
https://github.com/lexdss/BookShop/blob/master/app/model/Product.php#L70
Непонятно зачем тут цикл
Остальное напишу позже.
>Непонятно зачем тут магический метод
У меня предусмотрено создание категорий через "админку", каждая категория имеет урл вида site.com/cat/cat_name, cat_name - это метод контроллера CatController. Для всех категорий производятся одни и те же действия, а с помощью __call можно не создавать вручную одинаковые методы для каждой категории.
ШТО КУДА СУВАТЬ
ПАМАГИТЕ
Нет, не могу разобраться, куда этот файл сунуть, не нашёл инфы, как заставить его работать
*Сунуть - нашёл. Заставить работать - не разобрался.
Ну чего ты как этот. Ты совсем не читаешь что тебе в ошибках пишет? Написано же, не выбрал базу данных.
Я прочитал как detected, азаза))0)))
Добавь в начало запроса три строчки
DROP DATABASE IF NOT EXISTS Students;
CREATE DATABASE Students;
use Students;
Это между прочим обязан был сделать автор дампа. Ведь его кодом с высокой долей вероятности будут пользоваться некомпетентные заказчики, а не коллеги-программисты. Особенно если речь о фрилансе.
Дамп вручную что ли создавался, а не при помощи утилиты mysqldump?
Для хранения года в mysql есть тип YEAR.
> CHARSET = cp1251
Что, простите?
>Добавь в начало запроса три строчки
Как можно добавить, через что?
Я просто пытался импортировать этот дамп, который анончик на Ргхост выложил.
Дамп со структурой базы данных должен лежать на гитхабе.
Там же должен быть подробнейший ридми с пошаговыми инструкциями по установке.
Чтобы даже человек, ни разу не занимавшийся программированием, мог установить твое приложение по инструкции.
Да я выложил код только чтоб ОП и другие прошаренные посмотрели на код и указали на замечания, не думал, что кто-то будет это ставить себе.
>>608349
Да не 'yes' у него пароль. using password:YES это тебе mysql говорил о том, что пароль установлен, потому что есть учетные записи, не требующие пароля.
Пароль у него 'students', если посмотреть поиск по гитхабу
https://github.com/lexdss/StudentsList/search?utf8=%E2%9C%93&q=PDO
>я тупой
Выучи сначала теорию, потом пробуй что-то писать. У тебя нет знаний, в этом проблема.
А ума в веб-разработке и не нужно, тысячи успешных вованов тому подтверждение.
> между прочим обязан был сделать автор дампа
Нет не должен. Имя базы данных не должно быть там прописано к тому же оно указываетяс в командной строке
> его кодом с высокой долей вероятности будут пользоваться некомпетентные заказчики, а не коллеги-программисты.
Если речь о фрилансе то он и установить сам должен, а у нас код для программистов.
Не понимаю почему там анон берется за майадмин если он не осилил клиент для командной строки. Он явно пропускает базовые темы, берется сразу за сложное и как итог ничего не понимает.
Дамп импортируется легко и быстро через ком. строку:
mysql .... database ... < dump.sql
Если кто-то из вас этого не знает, то советую начать с этого, а майадмин оставить на потом.
А в майадмине наверно есть опция при загрузке дампа. Я его правда уже лет 5 как не видел, так что не помню.
Я не пойму, чому у меня не работает, хотя пользователь students есть, пароль students, база студентс-хуюденс - всё есть.
Нет, по-прежнему та же ошибка, сюка.
Может, это причина.
Да, все права и привилегии.
Но проблемы с кодировкой, впрочем - это уже мелочи.
Спасибо за помощь, братишки.
>Ideone не работает!11
>http://codepad.viper-7.com/, http://codepad.org/ или http://writecodeonline.com/php/
Так и должно быть?
Да, это грубая ошибка.
У него там скорее всего если форма не прошла валидацию идет редирект (то есть новый запрос методом гет) на ту же страницу. А нужно выводить сообщения об ошибках тут же, при запросе постом.
Статья с алгоритмом обработки форм
https://github.com/codedokode/pasta/blob/master/forms.md
>>608423
Автор задумывал сортировку по этому полю, но либо не доделал, либо там ошибка которую он не заметил.
Хех, повезло чуваку, что ты решил потестить его творение.
Вопрос к автору.
Какой-то странный полосатый дизайн. Это часом не строки таблицы, раскрашенные в чет/нечет? Не годится верстать формы таблицами. В оп-посте хорошие задачи на верстку, нужно пройти.
repl.it пиздаче.
Есть тред в воркаче, уебуй
>Хех, повезло чуваку, что ты решил потестить его творение.
Рассмеялся. Недавно навернул Алана Купера "Психбольница в руках пациентов", вот со многим согласен в этой книге. Раньше как-то интуитивно применял похожий подход к проектированию интерфейсов на своих говносайтах.
>Автор задумывал сортировку по этому полю, но либо не доделал, либо там ошибка которую он не заметил.
Да, он как раз писал об этом, сейчас вспомнил, что сортировку не доделал.
Нахуй ты бампаешь? Откуда мы знаем из какой жопы ты вытащил этот код?
Иди у автора и спроси, зачем он так написал. Скорее всего потому что он не знает php, а решил заработать денег на учебнике уровня "php+mysql+html+аллах за неделю !!!!111"
>Я вот думаю, если программирование (я сейчас не беру в пример создание микропроцессоров и высший бесполезный матан со всякими графоалгоритмами), но если вот обычный прикладной кодинг может выучить любой даун-школьник
Некоторые русский язык не могут освоить, какой уж там кодинг.
>Откуда мы знаем из какой жопы ты вытащил этот код?
Очевидно, блять, что из книги.
Сложно было ответить в стиле "это он зря написал", мудак ты токсичный?
> если вот обычный прикладной кодинг может выучить любой даун-школьник за пару лет
За пару лет упорного труда, применяя знания почти каждый день, а какую профессию нельзя выучить за этот срок? Да и то, качество принятых решений, время разработки, оптимальность алгоритмов, качество кода - будут хуевыми из-за недостатка опыта.
И еще - "прикладной кодинг" это очень масштабное понятие, можно выучить за пару лет только отдельный аспект.
Во-первых, не очевидно что из книги. Это мог быть какой-нибудь блог, статья или код твоего одноклассника.
Во-вторых, ты настолько тупой, что даже теперь не догадался назвать год издания и имя автора, чтобы кто-нибудь дал рецензию.
для того, чтобы кодинг освоить, ничего кроме сети и кампутера не нужно. Чего не скажешь о других профессиях. соответственно порог вкатывания низкий.
>>608528
А это уже обратная сторона, из-за низкого порога в профессию валят толпы школьников, которые поверхностно знают свою мелкую область. их можно собрать и давать им копейки, но все вместе они что-то напишут. с этим борются вот как: пытаются брать качеством и сужают круг, т.е. с одного кодера требуют знание всех областей и высокую скорость работы, чтобы делал тот же проект, что и десять школьников, за ту же сумму. Ну вот так на мой взгляд борются с низким порогом вхождения.
Потому что я могу пока только установить сервер, ну может еще выделить памяти под php и mysql.
Дайте список мастхев настроек (php, mysql, apache), которые нужно знать.
Там только инструкции по установке, что ты мог сам заметить, если переходил по тем ссылкам. Мне нужны важнейшие настройки.
Гуглить не буду, потому что не доверяю сомнительным источникам.
В документации настроек тысячи, из них реально нужных пару десятков.
Вот я и спрашиваю, какие самые важные настройки нужно применить к свежеустановленному серверу.
>Гуглить не буду, потому что не доверяю сомнительным источникам.
Зато сосач пиздецавторитетный источник.
Аноны, вот ладно на удаленном серве все понятно, сайт типа site.com/controller/index
Выходит $_SERVER = "/controller/index";
Получается массив
0 -> ""
1 -> "controller"
2 -> "index"
А когда мы тестим на локальном серве, то ссылка такого вида
localhost/site.com/controller/index
Какой тогда массив мы получаем?
Такое же как в первом случае?
Я очень далёк от дизайна и критики, но с этого вот блеванул.
Анон, если эта говно предмет старания двух макак за банку пива и оценку в зачётку славно написанная курсовая случайно упадёт от моего чека, мне сгущёнка не светит?
Мейл на который приходят уведомления не совпадает с контактными ящиками? Иначе любой дурачок задолбает сменой пароля.
тащемта и так можно задолбать сменой пароля. Даже если не совпадает.
Почему у меня нихуя не работает, даже когда простейшие исходники пытаюсь включить?
Иде - нетбинс, стоит локальный сервер. Создаю проект с файлом индекс.пхп и пишу там echo "Hello world" и все работает.
Поставил себе исходники простейшей реализации модели MVC и у меня нихуя не работает, а на видео работает.
Может связано с локалхостом и он как-то не правильно разбивает по слешу или что? Я просто понять не могу.
Вроде все правильно сделано и должно работать, но какого-то хуя просто не работает.
Вот код - https://github.com/luptidu/www/
>>608618
>что за нахуй, обьясните мне
Ты зачем-то скопировал нерабочий код из плохого урока.
>Почему у меня нихуя не работает
Спроси у веталека swipe, зачем у нас спрашиваешь?
>у меня нихуя не работает, а на видео работает
Тогда даже не знаю, раз на видео работает, значит там все правильно, беру свои слова обратно.
Переустанови виндовс, может поможет.
Два чаю вот этому. Хочешь разобраться - оп пост. Хочешь проверить работает ли твоя сборочка - пиши хелловорды. Хочешь сайт визитку - не смотри всяких странных мудаков с ютюба.
Тебя ебет откуда этот код? Меня волновал только один вопрос: нужно ли там второе echo? Мне похуй на твою рецензию, аутист ебаный.
Лол, даун обосрался и пытается уехать.
Аа, это Джумла, я подумал, сами пилили всё.
>>608611
Смотря что понимать под дизайном.
Если удобство расположения элементов и достижения целей (то есть аспект юзабилити в дизайне), то вроде всё там на среднем уровне. Ссылки "скачать" немного сумбурно расставлены для документов, не подчёркиваются при наведении. Ссылки в сайдбаре становятся светлыми при наведении, что затрудняет их чтение. Выпадающие меню без возможности перейти на категории - НЕ ОСНЕ. Адаптивность имеется.
А если рассматривать дизайн как красивость отображения и навороты, то тут кому как. Мне понравились неработающие блоки с форумом, чатом, веб-ресурсами. Остальное там просто лишено единого стиля, потому что брали фоточки из Инета или сами что-то рисовали (тот же логотип).
php-макака называет себя погромистом, спешите видеть.
Ты чё, сука, ты чё??7
Не порть нам ламповый тред!!1
Еcho там кажется ненужным, потому что и без него всё работает. Ваш КО.
Аа, бля, точно.
Тогда реально непонятно это всё в отрыве от контекста.
Что там хотел показать и посмотреть автор: как после функции меняется переменная $a если только.
>>608650
>>608657
Я не пойму, либо вы нюфани, либо я чего-то не понимаю. Там же всего 3 echo :
1) В самой функции и выводит переменную $num
2) Выделено красным, которое непонятно зачем там нужно, ведь функция ничего не возвращает.
3) Вывод переменной $а, чтобы посмотреть как меняется переменная $a
Если 1) и 3) дают понять для чего они там, то 2) не требуется вообще.
Однако, если вместо 1) написать return $num (заставить функцию возвращать переменную $num), то тогда да, без 2) было бы не обойтись.
>Это два разных вывода же.
На (2) он просто вызывает функцию. Зачем там echo, если функция ничего не возвращает да и к тому же в самой функции уже есть echo?
>Один раз он её просто выводит, второй - через функцию прогоняет. Видать хотел показать что-то.
Прогоняет он ее на (3) шаге, когда выводит переменную $a, чтобы показать, что она не изменилась.
>Прогоняет он ее на (3) шаге
Вернее прогоняет он ее при вызове на (2) шаге, а показывает, что она не изменилась на (3). Самофикс.
> Выделено красным, которое непонятно зачем там нужно, ведь функция ничего не возвращает.
Ты ебанутый?
Для проверки на уязвимости надо показать код. Вслепую искать уязвимости на каком-то сайте долго и неинтересно. Алсо, еще неизвестно чей это сайт.
По ошибке очевидно. Что вы тут флуд разводите? Ну и я бы на твоем месте поискал учебник получше.
Ну хоть кто-то в треде адекватный. Я начал изучать Php буквально несколько дней назад, задаю элементарнейший вопрос и мне пол треда втирает какую-то дичь.
Спасибо, книгу подобрал получше как только заметил этот косяк. Просто не давал покоя этот вопрос.
Он сначала выводит функцию, а потом переменную? Чего непонятного то?
>заметил этот косяк
Какой косяк, он тебе показывает разницу между выводом переменной и функцией!
>Зачем там echo, если функция ничего не возвращает
Это в учебнике для нюфагов? А что там надо было выложить? Пол библиотек Джумлы? Любой учебник возьми, там тоже будут сперва весьма простенькие функции.
>Прогоняет он ее на (3) шаге, когда выводит переменную $a, чтобы показать, что она не изменилась.
Ну вот ты и сам разобрался. Чего пол треда то запостил?
Ты уже перетолстил. Сначала делаешь вид что элементарных вещей не понимаешь, теперь не понимаешь уже и русского языка.
Два вопроса.
Чому-то PHP Notice: Undefined variable: paymentTotal in /home/rT84Ej/prog.php on line 19 - я там не ставлю echo, потому что там на три банка посчитается кредит на каждый месяц выплаты и т.п. Как быть в этом случае? Что там поставить, чтобы всё было нормально?
И также почему-то не получается вывести в итоге echo с
echo "{$homoCreditTotal} \n";
echo "{$softBankTotal} \n";
echo "{$strawberryBankTotal} \n";
То есть echo с переменными, которые определяются функцией, просто не работают, как я ни вертел это всё.
Где ошибка, друзья?
>Ты уже перетолстил. теперь не понимаешь уже и русского языка.
Это не я спрашивал. Я начал изучать Php несколько дней назад и даже я понимаю, что твои слова:
>Он сначала выводит функцию
- просто лютый пиздец. Я не знаю сколько ты уже занимаешься программированием, но если ты несешь такую ересь, то тебе не стоит этим заниматься. Выводит, блядь, функцию. ну охуеть теперь.
>>608686
>А что там надо было выложить? Пол библиотек Джумлы? Любой учебник возьми, там тоже будут сперва весьма простенькие функции.
Вы меня так троллите, блядь, или что?
На втором шаге можно было просто вызвать функцию - inc_print($a); Без ебаного echo. ЛИБО БЛЯДЬ УБРАТЬ "ECHO" В САМОМ ТЕЛЕ ФУНКЦИИ И НАПИСАТЬ ВМЕСТО НЕГО "RETURN $NUM".
ВЫ СУКА СИДИТЕ ТУТ УЖЕ 66 ЕБАНЫХ ТРЕДОВ И НЕ ЗНАЕТЕ ЭЛЕМЕНТАРНЫХ ВЕЩЕЙ, ВЫ СУКА ЛЮДИ ИЛИ КТО?
>УБРАТЬ "ECHO" В САМОМ ТЕЛЕ ФУНКЦИИ И НАПИСАТЬ ВМЕСТО НЕГО "RETURN $NUM".
У меня жир из монитора потёк.
Хватит.
1. Проинициализируй paymentTotal в 0 в начале функции, например.
2. Функция ничего не возвращает, эхо ее результата ничего и не выводит.
>А как тогда подключать его? Просто запрашивать файл?
ОПчи-и-к, ответить пожалуйста на этот вопрос, я без дела сижу.
Типа этого. http://dom-dacha-svoimi-rukami.ru/stroim-dom
Там вирус не ходите.
локальный сервер - денвер?
загугли в какую папку нужно файлы ложить
в open server например это
C:\OpenServer\domains\localhost
как я написал тут: >>607098
Ты делаешь файл init.php или bootstrap.php, без классов, обычный скрипт. В нем - вся инициализация, то есть подключаешь автозагрузку, загружаешь конфиг, создаешь объект PDO, создаешь мапперы и тд, все что тебе нужно.
Соответственно в index.php ты подключаешь только этот файл init.php и у тебя уже все нужные объекты доступны, вызывай что хочешь.
>>Но в данном примере я не понимаю, зачем вообще это нужно. Объясни, зачем ты там испльзовал static? Что ты хотел сделать этим?
> Не понял? У меня нигде нету static переменных.
Как это нет? https://github.com/someApprentice/Students/blob/master/app/init.php#L18 вот она
Если тебе надо то лучше использовать в классе статическое поле. Но в данном случае такой надобности нет - так как Init у нас в одном экземпляре. Более того, сам Init не нужен тоже, как я написал выше.
По идее конечно можно сделать инициализацию классом. Так например в ZF сделан класс Bootstrap. Но для простого приложения это лишнее усложнение.
так я блять все изучил, и по идее должен работать, если бы я понял в чем трабл не писал бы сюда
Залил на беслпатный хостинг с беслпатным доменом и все заебись работает.
Так в чем же проблема?
Может потому что файл роут хуево под локалхост заточен?
в чем проблема?
Спасибо, первое помогло избавиться от ошибки.
А вот второе не понимаю. Функция возвращает же echo "{$month} месяц(-ев) до {$creditBalance} руб. Должно быть выплачено всего {$paymentTotal} руб.\n"; и делает это трижды вот благодаря этому:
$homoCreditTotal = calc($creditBalance, $monthlyPayment, 1.04, 500, 0);
$softBankTotal = calc($creditBalance, $monthlyPayment, 1.03, 1000, 0);
$strawberryBankTotal = calc($creditBalance + 7777, $monthlyPayment, 1.02, 1000, 0);
При этом всё работает, разумеется, и если я просто делаю вывод результатов:
calc($creditBalance, $monthlyPayment, 1.04, 500, 0);
calc($creditBalance, $monthlyPayment, 1.03, 1000, 0);
calc($creditBalance + 7777, $monthlyPayment, 1.02, 1000, 0);
Но мне-то нужно сделать так, как у ОПа: у него там в итоге стоит
echo "Банк HomoCredit: {$homoCreditTotal}\n";
echo "Банк SoftBank: {$softBankTotal}\n";
echo "Банк StrawberryBank: {$strawberryBankTotal}\n";
Вот как мне вывести в переменную результат функции и потом вывести в echo эту переменную?
Я вообще не понимаю, что там может не работать, честно говоря.
Просто указываю переменной результат функции, потом вывожу эту переменную в echo - и получаю вялым по лбу с оттягом, вот это поворот.
>>608712
Это потому, что в StrawberryBank открытие счёта стоит 7777 рублей - эта сумма должна быть прибавлена к основной сумме долга.
echo - это вывод строки. Ничего общего с возвратом значения оно не имеет, для этого есть return.
регистрацию запилил, а как узнать, что это один и тот же пользователь заходит на сайт?
без кук всяких, разумеется.
Пацаны, как мне еду приготовить? Без продуктов всяких, разумеется.
Продукты это же устаревшее говно, разве ничего другого еще не придумали?
Ну, сойлент придумали, внутривенные растворы, пожалуйста.
Каша из топора (айди сессии в uri).
<!DOCTYPE html>
<html>
<head>
\t<title>Jet</title>
\t<link rel="stylesheet" type="text/css" href="style.css">
\t<meta charset="utf-8">
</head>
<body>
<?php include_once 'header.php'; ?>
<div id="content">
<?php
$result = mysql_query(" SELECT * FROM news ORDER BY id DESC LIMIT 4 ");
mysql_close();
while ($row = mysql_fetch_array($result)) { ?>
\t
\t<div id="text">
\t<h2 align="center"><a href=""><?php echo $row['title'] ?><a></h2>
\t<p><?php echo $row['text'] ?></p>
\t<p align="right"><?php echo '<a href="view_news.php?id='.$row[id].'" '; ?> >Перейти к новости -><a></p>
\t</div>
<?php } ?>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
\t<title>Jet</title>
\t<link rel="stylesheet" type="text/css" href="style.css">
\t<meta charset="utf-8">
</head>
<body>
<?php include_once 'header.php'; ?>
<div id="content">
<?php
$result = mysql_query(" SELECT * FROM news ORDER BY id DESC LIMIT 4 ");
mysql_close();
while ($row = mysql_fetch_array($result)) { ?>
\t
\t<div id="text">
\t<h2 align="center"><a href=""><?php echo $row['title'] ?><a></h2>
\t<p><?php echo $row['text'] ?></p>
\t<p align="right"><?php echo '<a href="view_news.php?id='.$row[id].'" '; ?> >Перейти к новости -><a></p>
\t</div>
<?php } ?>
</div>
</body>
</html>
>JS не предлагать!
какой js, такое делаеться на ruby+python. там еще надо фреймворк и ооп подключить к бутстрапу через mvc.
Вот в итоге вроде бы получился этот калькулятор Айпада: http://ideone.com/X0RbF2
Странно, что я не могу оттуда выцепить $month никак, пробовал по-разному.
Хотел в echo вывести ещё и количество месяцев, которые потребуются для оплаты.
Вот почему в этом случае я не могу просто написать там же return $month, а в итоговом echo просто поставить {$month}?
Чому так нельзя получить эту переменную, её как-то надо проинициализировать тоже?
Сейчас попробую...
Функция может вернуть только одно значение. Но оно может быть массивом или объектом.
Спасибо, я это запомню, бро, мне пока далеко для этого. Если только массивом сделать, а потом ключи достать?
Ладно, вроде сам калькулятор работает - пока успокоюсь на этом, подожду разгромного анализа ОПа.
1) require_once 'script.php';
2) include "app/controllers/".$script_file;
3) dirname(__FILE__).'/script.php';
4) include Q_PATH.'/application/script.php';
Не конкретно какие файлы они включают
А какие и в каких ситуациях лучше юзать?
1) Запускаем файл скрип.пхп?
2) Подключаем но не запускаем?
3) А тут что делаем?
4) Чему равен Q_PATH?
Вообще как во всех случаях узнается адрес до самого скрипта, так как нигде тут полный адрес скрипта не прописан и что вообще лучше использовать?
>Надо либо заключать строку в одиночные кавычки ' " ' либо экранировать бекслешем " \" "
>Или ты не про это?
Я про то что css-селектор input[type=text] корректный, а meta[property=og:image] выдает syntax error, поэтому приходится брать значение атрибута в кавычки.
>надо вывести список ссылок на картинки в консоль, а не список тегов img
Тогда так
https://jsfiddle.net/e5j566y3/
>в данном случае можно поступить проще и искать эти элементы по именам тегов
А как узнать, что элемент принадлежит форме? Некоторые элементы типа button вполне могут быть не привязаны к форме, находиться вне ее (неё?).
Если элемент лежит внутри формы, он однозначно к ней относится? Если так, тогда
https://jsfiddle.net/33zse693/
ой бля, проследуй под шконку петушок
хули там можно пару лет учить маня?
любой школьник за пару месяцев все освоит
На самом деле нет. Везде нужны опытные программисты, их не хватает. Брать джуниора после вуза и делать из него специалиста - долго, да и он может уйти в любой момент если денег больше предложат. Так и висят вакансии синьеров по месяцу.
Это не сеньоры, это аналог работников макдака, которые работают вместо 5 кассиров, двух борщиков и одного повара ну и платят ему за всех этих людей. Тут пока выучишься одной рукой бургеры жарить, а другой счет выбивать на скорость, это да.
ох нихуя себе, трипл
Бери Assembler, достаточно легкий язык, сделан специально для новичков. Как овладеешь ассемблером можно и на Brainfuck перейти, он уже посерьезнее.
Паскаль это тоже очень полезная вещь сейчас, можешь начинать с Turbo Pascal, за 3 месяца можно выучить его и пойти джуном в какую-нибудь аутсорс контору. Тут выбор уже за тобой.
Я запилил на сайтике регистрацию, и вот после успешной регистрации хочу, чтобы сайтик редиректил пользователя на соседнюю страницу, как это из ПХП сделать? Или нужен ЖС?
>Если тебе надо то лучше использовать в классе статическое поле. Но в данном случае такой надобности нет - так как Init у нас в одном экземпляре. Более того, сам Init не нужен тоже, как я написал выше.
А почему мы здесь тогда делали её статической? https://github.com/someApprentice/simpleRegistration/blob/master/Lib/connect.php#L11
Это значит что заголовки уже отправлены. Заголовки должны быть отправлены ДО всего вывода разметки.
На википедии как всегда тупое определение, из которого ничего не понятно.
Прочитал на хабре статью http://habrahabr.ru/post/212065/
в которой автор вроде ведет к тому, что HMVC позволяет использовать систему контроллер-модель-представление для каждой сущности. То есть если у нас есть пользователь, то должен быть контроллер для пользователей, и он не должен манипулировать другими сущностями, например постами пользователя или комментариями (для них должен быть отдельный контроллер). То же самое для представлений: отдельное представление для каждой сущности.
На практике это значит, что мы должны прописать отдельные контроллеры для каждой сущности и вызывать их как отдельный скрипт либо аяксом, либо курлом отправить запрос из главного контроллера во "вспомогательные" и вставить полученный от них ответ куда надо, как-то так.
В комментах автора отхуесосили, ткнули в паттерн service layer и иерархические шаблоны.
Короче я только запутался и ничего не понял, нужная это штука или нет, если да то как реализовывается и есть ли готовые реализации во фреймворках (знаю Yii и микрофреймворки, но там вроде такой фигни нет)
Какой сложности работы сделать для портфолио?
Выучить хотя бы один фреймворк либо 1-2 cms. А лучше и то и другое.
Работы для "портфолио" не обязательны. Примеры работ просят обычно дно-конторы, у которых даже нет компетентного сотрудника для проведения собеседования.
Сделать несколько проектов не помешает конечно, только не для портфолио, а для себя.
В оп-посте есть задание на файлообменник например. Или можешь придумать что-то свое, например клон твиттера или авито.
Ну нихуя себе у вас в ДС зажрались, уже и портфолио не нужно.
Я забыл как разворачивал в прошлый раз.
>Чем объекты jQuery такие особенные и отличаются от других?
Тем, что у объектов jQuery есть свойства и методы jQuery.
Если я создам две переменные
var first = document.getElementsByTagName("P");
var second = $("div");
То через пять строк я уже не буду помнить, какая переменная обычная, а какая jqery, к какой из них можно применить метод attr например. Можно конечно насильно потом пропустить через $(...)
А, ну да, или пользоваться webstorm.
>список всех постов в формате "Название поста", число просмотров, число комментариев, ссылка
>допиши к заголовкам постов в скобках число просмотров
https://jsfiddle.net/60rkobr8/1/
Зависит от конторки.
Если конторка делает однотипные сайты на какой-то CMS (Битрикс например), то можно и за пару недель по вечерам почесывая яйца. Правда это не паграмист а говночист, который только статистику по зарплате в отрасли портит.
Если конторка серьезней, например кормится на иностранной фрилансбирже и даже имеет Машу-сделай-нам-чаю в своем штате, то тут есть варианты: от говночитсы на cms до Magento/Zend/сириуз бизнес/меньше 30 баксов/час не беремся. Тогда нужно быть фуллстак (знать верстку, джаваскипт, фреймворки) это 6-12 месяцев для сообразительных парней.
Хотя нахер я тут расписываю, все равно 90% что забьешь, дорешай учебник опа хотя бы до Вектора. Погромирование должно нравится. Иначе нервное истощение еще за километр до медианной зарплаты.
Я будууу доооолго писать велосипеэээд.
Ставь готовое изделие. Opencart например.
Тебе писать руками магазин имеет смысл только "для общего развития".
Установи готовую cms типа openCart, натяни на нее верстку и не морочь себе анус.
Есть и отдельные модули для корзины на гитхабе, смотри по запросу shopping cart github, но тогда придется еще и дописывать клиентскую часть на jquery.
Самому писать корзину не нужно, ты же понимаешь какая это ответственность, если хакир из 8б сломает твой сайт? Присядешь ты, а не он.
>Погромирование должно нравится
Согласен, братишка. То что нравится еще и дается легко. Только вот приколюха в том, что через лет 20-30, мне кажется, каждый должен будет уметь погромировать этих ебучих роботов и прочую парашу, поэтому придется все равно задрачивать. Это как сейчас в говне многим приходится ковыряться, хоть и не нравится, но платят хорошо, поэтому и ковыряются.
Ответ совпадает с правильным, но вот этот вот кусок
($creditBalance x $percent) + $servicePayment
повторяется 3 раза. Избавься от повторов.
>>607215
В общем верно, хотя наверно округлять результат не требуется. Но так тоже годится.
>>607217
Считает правильно, но нужно вынести это в переменную.
>>607221
Java и Javascript разные языки.
Может они плохо CSS знают. Вообще JS там может быть полезен - например чтобы реализовать исчезновение с задержкой или позволить мыши чуть выходить за пределы меню в процессе движения.
>>607225
Ну да, но мне кажется лучше было сделать это без статических переменных, и хранить PDO в поле объекта Init. зачем тащить сюда static если можно просто хранить PDO в поле класса Init? Так логичнее, если кто-то хочет иметь один объект PDO, он создает один объект Init, хочет много (например для тестирования) - создает много. Ну например в тестах может быть каждый раз Init будет создаваться заново, чтобы тест начинался как бы с чистого листа.
В общем, я не вижу зачем тут нужен static. Он только создает нежелательные побочные эффекты. Если у тебя один объект Init то можно хранить PDO в обычном поле.
Ответ совпадает с правильным, но вот этот вот кусок
($creditBalance x $percent) + $servicePayment
повторяется 3 раза. Избавься от повторов.
>>607215
В общем верно, хотя наверно округлять результат не требуется. Но так тоже годится.
>>607217
Считает правильно, но нужно вынести это в переменную.
>>607221
Java и Javascript разные языки.
Может они плохо CSS знают. Вообще JS там может быть полезен - например чтобы реализовать исчезновение с задержкой или позволить мыши чуть выходить за пределы меню в процессе движения.
>>607225
Ну да, но мне кажется лучше было сделать это без статических переменных, и хранить PDO в поле объекта Init. зачем тащить сюда static если можно просто хранить PDO в поле класса Init? Так логичнее, если кто-то хочет иметь один объект PDO, он создает один объект Init, хочет много (например для тестирования) - создает много. Ну например в тестах может быть каждый раз Init будет создаваться заново, чтобы тест начинался как бы с чистого листа.
В общем, я не вижу зачем тут нужен static. Он только создает нежелательные побочные эффекты. Если у тебя один объект Init то можно хранить PDO в обычном поле.
>>>А где гарантия что свойство possibleMoves заполнено перед вызовом функции? Это ненадежный код, так как легко забыть его заполнить и вызвать функцию.
> ....
> С пустым массивом та функция не вызовется. Стоит ли тогда добавлять issset по твоему совету?
Нет, проблема была в другом. Проблема была в том что ты перед вызовом tryToMove должен был вызвать что-то что заполнило бы свойство possibleMoves. Это неправильно. Вот я тут попытался это написать:
https://github.com/codedokode/pasta/blob/master/good-code.md#Результат-функции
https://github.com/codedokode/pasta/blob/master/good-code.md#Избегай-побочных-эффектов
> Функция должна всегда возвращать акутальный и точный результат, либо выбросить исключение если это сделать невозможно. Не должно быть ситуаций, когда функция возвращает неправильный результат.
Я вижу, что сейчас в коде вроде этого нет, хорошо. Но не должно быть такого, что функция может работать неправильно если перед ней забыть что-то вызвать. Это легко забыть сделать.
>>> >$field->addAnimal($field, $mouse1);
>>>Зачем 2 раза писать $field?
> Я не знаю как по другому чтобы объект передал сам себя.
Не надо передавать $field отдельно. Ты его указал слева от стрелки, значит он будет внутри метода доступен как $this. $this это указатель на объект на котором вызван метод.
Далее, давай разберемся с доступом к полям и методам. Вот небольшая паста:
-----
Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными и сами данные, а наружу выставляет методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, ему достаточно вызвать нужный метод чтобы получить результат.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название метода (и может быть комментарий к нему). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
Если проводить аналогии, то можно представить кофе-машину. Ты нажимаешь кнопку (=вызываешь публичный метод) и получаешь кофе (=результат вызова этого метода), при этом ты не видишь что происходит внутри нее и тебе не надо в этом разбираться.
-----
Посмотри на свой код и подумай, где надо расставить public/protected/private. Ну например, $field в Animal сделано публичным - а зачем? зачем кому-то со стороны получать ссылку на поле из животного?
Более того, публичное свойство подразумевает что любой может его поменять. Так ли это? Не лучше ли закрыть все поля и дать доступ к нужным только через методы?
Или например у мыши публичный метод public function searchPossibleMoves(). зачем публичный? Зачем может понадобится вызывать снаружи этот метод? Мне кажется логика выбора хода - это то, что спрятано в голове животного и что окружающим незачем видеть.
Ставя public/private ты как бы задаешь правила использования класса, говоришь другим программистам: это метод который можно и нужно вызывать снаружи, пользуйтесь им. Или это метод, который определяет логику поведения объекта и который снаружи не виден, не тратьте на него время. Пройдись по всем полям и методам. Поля советую вообще закрыть все.
Далее, есть еще такая штука. Есть поле $symbol которое определяет иконку животного. Но где гарантия, что программист, пишущий класс-наследник, определит это поле? Как ему это сказать? Как гарантировать что он не забудет об этом? Для этого в ООП есть абстрактные методы. Ты можешь сделать метод getSymbol абстрактным - тогда унаследовать класс, не определив символ, не получится. А поле symbol можно тогда выпилить за ненадобностью.
> protected function freeMove($possibleMoves)
Здесь нужен тайп-хинт. Поставь его тут и в других местах, где это возможно.
----
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
----
>class Mouse extends Animal
> {
> public $symbol; //символ на карте
> public $x; //координата
> public $y; //координата
Поля наследуются. Не надо их второй раз описывать.
> private function searchBestMove($foundAnimals, $possibleMoves)
Эта функция возвращает либо массив-ход (кстати, почему массив? мы же ООП изучаем, давай-ка сделаем объект хранящий информацию о ходе, можно только из свойств без методов) либо пустой массив. Нелогично. Логичнее возвращать при отстусвии хода например null который как раз значит «отстутствие значения».
> $pointsMax = -1;
Можно сделать даже лучше: -INF. INF это бесконечность, да, она есть в компьютерной математике:
http://php.net/manual/ru/math.constants.php
http://xpoint.ru/know-how/Articles/FloatingPointNumbers#Beskonechnost'IProchieVkusnost
Либо же за начальное значение max можно брать оценку первого хода.
> $nearbyEnemy = $this->field->searchNearbyAnimal($move['x'], $move['y'], $foundAnimals["cats"]);
> $stepsToEnemy = $this->field->countSteps($move['x'], $move['y'], $nearbyEnemy->x, $nearbyEnemy->y);
Что если ни одного врага не видно? Не будет ли ошибки? Или есть гарантия что будет минимум один враг? Тогда надо написать комментарий об этом + сделать assert (он выдает варнинг если условие не выполняется):
assert(count($cats) > 0);
Это читается так: «я уверен что кошек всегда будет больше нуля, если нет, значит в программе ошибка». assert лучше чем комментарий, так как истинность условия проверяется интерпретатором PHP. Еще можно заменить ассерт на иф:
if (!count($cats)) {
// комментарий
throw new Exception("Internal error: There must be at least one cat");
}
>>>А где гарантия что свойство possibleMoves заполнено перед вызовом функции? Это ненадежный код, так как легко забыть его заполнить и вызвать функцию.
> ....
> С пустым массивом та функция не вызовется. Стоит ли тогда добавлять issset по твоему совету?
Нет, проблема была в другом. Проблема была в том что ты перед вызовом tryToMove должен был вызвать что-то что заполнило бы свойство possibleMoves. Это неправильно. Вот я тут попытался это написать:
https://github.com/codedokode/pasta/blob/master/good-code.md#Результат-функции
https://github.com/codedokode/pasta/blob/master/good-code.md#Избегай-побочных-эффектов
> Функция должна всегда возвращать акутальный и точный результат, либо выбросить исключение если это сделать невозможно. Не должно быть ситуаций, когда функция возвращает неправильный результат.
Я вижу, что сейчас в коде вроде этого нет, хорошо. Но не должно быть такого, что функция может работать неправильно если перед ней забыть что-то вызвать. Это легко забыть сделать.
>>> >$field->addAnimal($field, $mouse1);
>>>Зачем 2 раза писать $field?
> Я не знаю как по другому чтобы объект передал сам себя.
Не надо передавать $field отдельно. Ты его указал слева от стрелки, значит он будет внутри метода доступен как $this. $this это указатель на объект на котором вызван метод.
Далее, давай разберемся с доступом к полям и методам. Вот небольшая паста:
-----
Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными и сами данные, а наружу выставляет методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, ему достаточно вызвать нужный метод чтобы получить результат.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название метода (и может быть комментарий к нему). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
Если проводить аналогии, то можно представить кофе-машину. Ты нажимаешь кнопку (=вызываешь публичный метод) и получаешь кофе (=результат вызова этого метода), при этом ты не видишь что происходит внутри нее и тебе не надо в этом разбираться.
-----
Посмотри на свой код и подумай, где надо расставить public/protected/private. Ну например, $field в Animal сделано публичным - а зачем? зачем кому-то со стороны получать ссылку на поле из животного?
Более того, публичное свойство подразумевает что любой может его поменять. Так ли это? Не лучше ли закрыть все поля и дать доступ к нужным только через методы?
Или например у мыши публичный метод public function searchPossibleMoves(). зачем публичный? Зачем может понадобится вызывать снаружи этот метод? Мне кажется логика выбора хода - это то, что спрятано в голове животного и что окружающим незачем видеть.
Ставя public/private ты как бы задаешь правила использования класса, говоришь другим программистам: это метод который можно и нужно вызывать снаружи, пользуйтесь им. Или это метод, который определяет логику поведения объекта и который снаружи не виден, не тратьте на него время. Пройдись по всем полям и методам. Поля советую вообще закрыть все.
Далее, есть еще такая штука. Есть поле $symbol которое определяет иконку животного. Но где гарантия, что программист, пишущий класс-наследник, определит это поле? Как ему это сказать? Как гарантировать что он не забудет об этом? Для этого в ООП есть абстрактные методы. Ты можешь сделать метод getSymbol абстрактным - тогда унаследовать класс, не определив символ, не получится. А поле symbol можно тогда выпилить за ненадобностью.
> protected function freeMove($possibleMoves)
Здесь нужен тайп-хинт. Поставь его тут и в других местах, где это возможно.
----
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
----
>class Mouse extends Animal
> {
> public $symbol; //символ на карте
> public $x; //координата
> public $y; //координата
Поля наследуются. Не надо их второй раз описывать.
> private function searchBestMove($foundAnimals, $possibleMoves)
Эта функция возвращает либо массив-ход (кстати, почему массив? мы же ООП изучаем, давай-ка сделаем объект хранящий информацию о ходе, можно только из свойств без методов) либо пустой массив. Нелогично. Логичнее возвращать при отстусвии хода например null который как раз значит «отстутствие значения».
> $pointsMax = -1;
Можно сделать даже лучше: -INF. INF это бесконечность, да, она есть в компьютерной математике:
http://php.net/manual/ru/math.constants.php
http://xpoint.ru/know-how/Articles/FloatingPointNumbers#Beskonechnost'IProchieVkusnost
Либо же за начальное значение max можно брать оценку первого хода.
> $nearbyEnemy = $this->field->searchNearbyAnimal($move['x'], $move['y'], $foundAnimals["cats"]);
> $stepsToEnemy = $this->field->countSteps($move['x'], $move['y'], $nearbyEnemy->x, $nearbyEnemy->y);
Что если ни одного врага не видно? Не будет ли ошибки? Или есть гарантия что будет минимум один враг? Тогда надо написать комментарий об этом + сделать assert (он выдает варнинг если условие не выполняется):
assert(count($cats) > 0);
Это читается так: «я уверен что кошек всегда будет больше нуля, если нет, значит в программе ошибка». assert лучше чем комментарий, так как истинность условия проверяется интерпретатором PHP. Еще можно заменить ассерт на иф:
if (!count($cats)) {
// комментарий
throw new Exception("Internal error: There must be at least one cat");
}
> $pointsForDog = $this->field->getWidth() - $stepsToDog;
Ты пытаешься сделать обратную зависимость между расстоянием и числом очков. Но проще просто писать:
$pointsForDog = -$stepsToDog;
> //Если кошка спит
> if ($this->symbol == "@") {
Мне кажется это неправильная проверка. То, что символ стал равен @ это следствие того, что кошка спит, а не признак. Мне кажется, состояние сна надо определять по-другому, сделав для этого метод isSleeping(). Можно сделать отдельно свойство, можно просто сравнивать чему равно movesInARow.
> } elseif($this->movesInARow == $this->turnWhenCatSleep) {
> $this->symbol = "@";
ты меняешь значок но не вызодишь из функции и делаешь ход.
Кстати, заметь, некоторые комментарии писал Капитан Очевидность:
> //Ищем лучший ход
> ... searchBestMove
> //Ищем животное в дальности обзора
> ... searchForAnimals($this->x, $this->y, $this->vision);
> //Ищем возможные ходы
> ...$this->searchPossibleMoves
Спасибо, Капитан! Если ты пишешь это для себя, это ок, но в общем код тут достаточно самодокументирован и дублировать название функции текстом не требуется. Это хорошо, когда код сам себя документирует.
> /Возможые ходы для кошки (8 сторон);
Тут копипаста, легко сделать ошибку и трудно проверить код. Не лучше ли использовать циклы?
> private function searchBestMove($foundAnimals, $possibleMoves)
Метод одинаков в кошке и мышке, не внести ли его в Animal? Правда Animal не может вызывать countPoints которой в нем нет, и возможно надо ее передавать третьим параметром.
> $pointsForEnemy = ($this->field->getWidth() - $stepsToEnemy) * 100;
Как и у мыши, мне кажется что лучше без width обойтись.
> foreach ($foundAnimals["mice"] as $mouse) {
> if ($this->field->areChosenAnimalsNearTheCage($mouse->x, $mouse->y, $foundAnimals["mice"])) {
Тут явно ошибка - ты не используешь переменные $x, $y хранящие координаты хода.
Еще, в нескольких местах if можно упростить. У тебя идет такой код:
if () {
много строк
} else {
мало строк
}
Это лучше переписать как:
if () {
мало строк;
return/continue;
}
много строк;
Пройдись по коду и уменьши вложенность.
> //Удаление элемента массива по значению
> if(($key = array_search($this->field->getAnimal($x, $y), $this->field->animals)) !== FALSE){
Нарушение инкапсуляции. У карты должен быть метод удаления животного, ты не должен лезть внутрь нее и что-то снаружи менять.
> foreach ($arrows as $arrow) {
> //Отсеиваем невозможные ходы (ход за карту, ход на собрата собаку или противного мыша)
> if ($this->field->canIMoveTo($arrow['x'], $arrow['y'])) {
Попробуй использовать тут array_filter с анонимной функцией, мне кажется будет чуть проще.
> //Счетчик для различия мышей на карте
> static $i = 1;
Не используй static, исплоьзуй обычное свойство у класса Field. Или статическое свойство если нумерация должна быть уникальной независимо от числа карт.
> //Если животное - кошка, делаем ей максимальную дальность обзора
> if ($animal instanceof Cat) {
> $animal->vision = $this->width;
> }
Класс Field занимается не своим делом. За поле зрения кошки отвечает кошка, этот код должен быть внутри нее. Я бы использовал INF (и разумеется добавил во все функции проверку на нее).
> //Координаты могут быть заняты, если мы вручную их забиваем
> if ($animal->x == NULL && $animal->y == NULL) {
Это тоже лучше где-то в другом месте делать. Например сделать метод получения случайных свободных координат. А при попытке добавить животное без координат - выбросить исключение.
> do {
> } while ($this->isCageClose($x, $y));
Не делай потенциально бесконечный цикл, ограничь число попыток.
И еще, мне не нравится вот это вот:
> instanceof mouse
внутри Field. Особенности кошки или мышки должны быть скрыты в ее классе. Нам не надо дописывать что-то в Field для создания нового вида животных.
> private function isCageClose($x, $y)
Можно сделать через вызов метода getAnimal, а не копипастить цикл.
> private function showField($turn)
Тут лучше создать массив, заполнить его буквами животных, вывести через implode. Эффективнее будет.
> if ($top < 10) {
> //Два для двухзначных чисел
Используй str_pad (и помни что он только для латинницы, есть такой хак для поддержки любых символов: https://gist.github.com/nebiros/226350)
> public function startGame(Field $field)
Не надо передавать field.
> $foundAnimals = array("mice" => NULL, "cats" => NULL, "dogs" => NULL);
Эта функция не увидит новые виды животных. Лучше использовать имя класса в качестве ключа.
Алгоритм там неэффективный. Там 2 вложенных цикла, допустим делающих MxM шагов, и они вызывают getAnimal со сложностью O(N), получается общая сложность O(NxMxM). Эффективнее просто обойти массив животных циклом и отсеять лишних - сложность O(N).
> public function countSteps($point1X, $point1Y, $point2X, $point2Y)
Это явно статический метод так как ему не нужны никакие свойства объекта. Хотя тут конечно можно поспорить.
> } elseif ($countSteps == $stepsNearestAnimal) {
> continue;
Не нужно.
> $pointsForDog = $this->field->getWidth() - $stepsToDog;
Ты пытаешься сделать обратную зависимость между расстоянием и числом очков. Но проще просто писать:
$pointsForDog = -$stepsToDog;
> //Если кошка спит
> if ($this->symbol == "@") {
Мне кажется это неправильная проверка. То, что символ стал равен @ это следствие того, что кошка спит, а не признак. Мне кажется, состояние сна надо определять по-другому, сделав для этого метод isSleeping(). Можно сделать отдельно свойство, можно просто сравнивать чему равно movesInARow.
> } elseif($this->movesInARow == $this->turnWhenCatSleep) {
> $this->symbol = "@";
ты меняешь значок но не вызодишь из функции и делаешь ход.
Кстати, заметь, некоторые комментарии писал Капитан Очевидность:
> //Ищем лучший ход
> ... searchBestMove
> //Ищем животное в дальности обзора
> ... searchForAnimals($this->x, $this->y, $this->vision);
> //Ищем возможные ходы
> ...$this->searchPossibleMoves
Спасибо, Капитан! Если ты пишешь это для себя, это ок, но в общем код тут достаточно самодокументирован и дублировать название функции текстом не требуется. Это хорошо, когда код сам себя документирует.
> /Возможые ходы для кошки (8 сторон);
Тут копипаста, легко сделать ошибку и трудно проверить код. Не лучше ли использовать циклы?
> private function searchBestMove($foundAnimals, $possibleMoves)
Метод одинаков в кошке и мышке, не внести ли его в Animal? Правда Animal не может вызывать countPoints которой в нем нет, и возможно надо ее передавать третьим параметром.
> $pointsForEnemy = ($this->field->getWidth() - $stepsToEnemy) * 100;
Как и у мыши, мне кажется что лучше без width обойтись.
> foreach ($foundAnimals["mice"] as $mouse) {
> if ($this->field->areChosenAnimalsNearTheCage($mouse->x, $mouse->y, $foundAnimals["mice"])) {
Тут явно ошибка - ты не используешь переменные $x, $y хранящие координаты хода.
Еще, в нескольких местах if можно упростить. У тебя идет такой код:
if () {
много строк
} else {
мало строк
}
Это лучше переписать как:
if () {
мало строк;
return/continue;
}
много строк;
Пройдись по коду и уменьши вложенность.
> //Удаление элемента массива по значению
> if(($key = array_search($this->field->getAnimal($x, $y), $this->field->animals)) !== FALSE){
Нарушение инкапсуляции. У карты должен быть метод удаления животного, ты не должен лезть внутрь нее и что-то снаружи менять.
> foreach ($arrows as $arrow) {
> //Отсеиваем невозможные ходы (ход за карту, ход на собрата собаку или противного мыша)
> if ($this->field->canIMoveTo($arrow['x'], $arrow['y'])) {
Попробуй использовать тут array_filter с анонимной функцией, мне кажется будет чуть проще.
> //Счетчик для различия мышей на карте
> static $i = 1;
Не используй static, исплоьзуй обычное свойство у класса Field. Или статическое свойство если нумерация должна быть уникальной независимо от числа карт.
> //Если животное - кошка, делаем ей максимальную дальность обзора
> if ($animal instanceof Cat) {
> $animal->vision = $this->width;
> }
Класс Field занимается не своим делом. За поле зрения кошки отвечает кошка, этот код должен быть внутри нее. Я бы использовал INF (и разумеется добавил во все функции проверку на нее).
> //Координаты могут быть заняты, если мы вручную их забиваем
> if ($animal->x == NULL && $animal->y == NULL) {
Это тоже лучше где-то в другом месте делать. Например сделать метод получения случайных свободных координат. А при попытке добавить животное без координат - выбросить исключение.
> do {
> } while ($this->isCageClose($x, $y));
Не делай потенциально бесконечный цикл, ограничь число попыток.
И еще, мне не нравится вот это вот:
> instanceof mouse
внутри Field. Особенности кошки или мышки должны быть скрыты в ее классе. Нам не надо дописывать что-то в Field для создания нового вида животных.
> private function isCageClose($x, $y)
Можно сделать через вызов метода getAnimal, а не копипастить цикл.
> private function showField($turn)
Тут лучше создать массив, заполнить его буквами животных, вывести через implode. Эффективнее будет.
> if ($top < 10) {
> //Два для двухзначных чисел
Используй str_pad (и помни что он только для латинницы, есть такой хак для поддержки любых символов: https://gist.github.com/nebiros/226350)
> public function startGame(Field $field)
Не надо передавать field.
> $foundAnimals = array("mice" => NULL, "cats" => NULL, "dogs" => NULL);
Эта функция не увидит новые виды животных. Лучше использовать имя класса в качестве ключа.
Алгоритм там неэффективный. Там 2 вложенных цикла, допустим делающих MxM шагов, и они вызывают getAnimal со сложностью O(N), получается общая сложность O(NxMxM). Эффективнее просто обойти массив животных циклом и отсеять лишних - сложность O(N).
> public function countSteps($point1X, $point1Y, $point2X, $point2Y)
Это явно статический метод так как ему не нужны никакие свойства объекта. Хотя тут конечно можно поспорить.
> } elseif ($countSteps == $stepsNearestAnimal) {
> continue;
Не нужно.
Цикл какой-то сложный. Не можешь переписать понятнее? Ну например, почему внешний цикл идет по arguments внутренней функции, мы же их подставляем во внешние, разве не логичнее сделать цикл сначала по внешним аргументам? Попробуй переписать так, мне кажется, будет проще.
>>607381
> А как можно по-другому сделать? Мне это показалось самым естественным.
Можно сравнить буквы. Если они не совпали - слово не палиндром, выходим. Если совпали - продолжаем сравнение.
> Буквы не перезаписываются, там же я указываю номер ключа, при этом перезапись имеющихся не происходит, насколько я понял, просто добавляются новые.
Перечитай начало урока про массивы. В массиве не может быть 2 элемента с одинаковым ключом, ключ это что-то вроде уникального идентификатора элемента массива. А вот одинаковые значения у элементов могут быть.
>>607471
В чем это проявляется? Ошибки какие-то выводятся? натыкай echo, var_dump, посмотри что в переменных.
Насчет feof ты прав - она работает с сокетами от fsockopen, и stream_socket, но не работает с просто сокетами. Неудобно.
Я сделал тестовую программу для проверки. Код: https://ideone.com/83LJxm
Она коннектится к порту 8123, на котором я запустил нехитрый сервер командой echo Yes | nc -vv -l -q 0 -p 8123. Он ждет соединения, отправляет 4 байта и закрывает соединение (-q 0).
Чтобы проверить ошибку соединения, надо соединиться с удаленным хостом (с флагом --fail) и вынуть сетевой кабель, подождать секунд 10. В виртуалке с линуксом - не смог протестировать, она не реагирует.
Блокирующий режим:
- Если сервер не запущен, срабатывает ошибка в socket_connect (connection refused)
- После закрытия соединения сервером socket_read всегда возвращает пустую строку сколько бы мы не пытались читать.
- При разрыве связи socket_read возвращает false и выводится warning (на винде).
Асинхронный неблокирующий режим:
(windows) Если используется асинх. режим, на винде socket_connect выдает варнинг (Warning: socket_connect(): unable to connect [10035]: Операция на незаблокированном сокете не может быть завершена немедленно.) и возвращает по моему SOCKET_EWOULDBLOCK. Отключить его можно только через @. Я игнорирую эту ошибку. Это не ошибка.
(linux) асинхронный socket_connect() возвращает ошибку SOCKET_EINPROGRESS, я ее игнорирую.
Если не удается соединиться:
- (win) Если сервер не запущен, то connect удается, но после wait происходит Except event, и попытка read возвращает ошибку 10057 SOCKET_ENOTCONN под виндой
- (linux) Если сервер не запущен, мы получаем read event, write event, при попытке чтения получаем socket_read(): unable to read from socket [111]: Connection refused
Если удается:
- (win) мы получаем read event, читаем 4 байта, после чего получаем постоянно read + write event и попытка чтения дает 0 байт.
- (linux) мы получаем read + write event, читаем 4 байта, после чего то же самое: получаем read + write и чтение дает 0 байт.
Выводы:
- признаком закрытия соединения является строка длиной 0 байт
- в асинхронном режиме на закрытом соединении при select() сразу же срабатывает read + write event
- признаком ошибки является возврат false
- при ошибке в select() срабатывает Except event в windows и read + write event в линукс
- при этом в асинх. режиме некоторые коды (WOULDBLOCK, INPROGRESS, EAGAIN) не являются фактической ошибкой и не вызывают except event
- в асинх. режиме connect всегда возвращает код вроде WOULDBLOCK или INPROGRESS
Попробуй сам потестировать в разных режимах эту программку. После этого проанализируй свою программу и проверь, правильно ли ты в ней обрабатываешь разные ошибки.
> Можешь придумать какое-нибудь практическое задание на reactphp (только не увлекайся в сложности), я бы покопался, как будет время.
Сделай HTTP прокси, который можно прописать в браузере и он будет печатать первую строчку из каждого запроса и ответа прошедшего через него. Доп. опции:
- запись трафика на диск в общепринятом формате или в обычном текстовом
- проигрывание ранее записанных ответов
- черный список хостов запросы к которым блокируются
Ну или чат сделай.
> Мне приходит в голову видеоплеер, который постепенно подгружает большой видеофайл (на ютубе не так ли сделано?),
Не, файл наверно выгоднее отдавать нгинксом, он кстати тоже асинхронный.
> или обмен данными в каких-нибудь онлайн-играх.
Возможно.
Насчет feof ты прав - она работает с сокетами от fsockopen, и stream_socket, но не работает с просто сокетами. Неудобно.
Я сделал тестовую программу для проверки. Код: https://ideone.com/83LJxm
Она коннектится к порту 8123, на котором я запустил нехитрый сервер командой echo Yes | nc -vv -l -q 0 -p 8123. Он ждет соединения, отправляет 4 байта и закрывает соединение (-q 0).
Чтобы проверить ошибку соединения, надо соединиться с удаленным хостом (с флагом --fail) и вынуть сетевой кабель, подождать секунд 10. В виртуалке с линуксом - не смог протестировать, она не реагирует.
Блокирующий режим:
- Если сервер не запущен, срабатывает ошибка в socket_connect (connection refused)
- После закрытия соединения сервером socket_read всегда возвращает пустую строку сколько бы мы не пытались читать.
- При разрыве связи socket_read возвращает false и выводится warning (на винде).
Асинхронный неблокирующий режим:
(windows) Если используется асинх. режим, на винде socket_connect выдает варнинг (Warning: socket_connect(): unable to connect [10035]: Операция на незаблокированном сокете не может быть завершена немедленно.) и возвращает по моему SOCKET_EWOULDBLOCK. Отключить его можно только через @. Я игнорирую эту ошибку. Это не ошибка.
(linux) асинхронный socket_connect() возвращает ошибку SOCKET_EINPROGRESS, я ее игнорирую.
Если не удается соединиться:
- (win) Если сервер не запущен, то connect удается, но после wait происходит Except event, и попытка read возвращает ошибку 10057 SOCKET_ENOTCONN под виндой
- (linux) Если сервер не запущен, мы получаем read event, write event, при попытке чтения получаем socket_read(): unable to read from socket [111]: Connection refused
Если удается:
- (win) мы получаем read event, читаем 4 байта, после чего получаем постоянно read + write event и попытка чтения дает 0 байт.
- (linux) мы получаем read + write event, читаем 4 байта, после чего то же самое: получаем read + write и чтение дает 0 байт.
Выводы:
- признаком закрытия соединения является строка длиной 0 байт
- в асинхронном режиме на закрытом соединении при select() сразу же срабатывает read + write event
- признаком ошибки является возврат false
- при ошибке в select() срабатывает Except event в windows и read + write event в линукс
- при этом в асинх. режиме некоторые коды (WOULDBLOCK, INPROGRESS, EAGAIN) не являются фактической ошибкой и не вызывают except event
- в асинх. режиме connect всегда возвращает код вроде WOULDBLOCK или INPROGRESS
Попробуй сам потестировать в разных режимах эту программку. После этого проанализируй свою программу и проверь, правильно ли ты в ней обрабатываешь разные ошибки.
> Можешь придумать какое-нибудь практическое задание на reactphp (только не увлекайся в сложности), я бы покопался, как будет время.
Сделай HTTP прокси, который можно прописать в браузере и он будет печатать первую строчку из каждого запроса и ответа прошедшего через него. Доп. опции:
- запись трафика на диск в общепринятом формате или в обычном текстовом
- проигрывание ранее записанных ответов
- черный список хостов запросы к которым блокируются
Ну или чат сделай.
> Мне приходит в голову видеоплеер, который постепенно подгружает большой видеофайл (на ютубе не так ли сделано?),
Не, файл наверно выгоднее отдавать нгинксом, он кстати тоже асинхронный.
> или обмен данными в каких-нибудь онлайн-играх.
Возможно.
я знаю что можно сделать даже без php но будет криво.Руби здесь уж совсем не причем
>Как сделать что бы на экран выводилась краткая новость, а ссылка краткой новости вела на новую страничку к полной версией новости.
a href
>То есть если у нас есть пользователь, то должен быть контроллер для пользователей, и он не должен манипулировать другими сущностями, например постами пользователя или комментариями (для них должен быть отдельный контроллер). То же самое для представлений: отдельное представление для каждой сущности.
Какая-то надуманная проблема высосанная из пальца. Манагеры с ветряными мельницами борятся?
>ruby+python
Совсем поехал штоле? Ты ещё C++ предложи. Обколются своими фрэймворками и забудут как <a href=''>НОВОСТЬ</a> вгллядит. Ну и подогнать css под это.
Если я не путаю. Идея HMVC в том, что мы делаем контроллеры для отдельных блоков на странице, как будто это отдельные страницы.
Ну если у нас например есть клон ютуба, то мы можем сделать отдельный контроллер для отображения комментариев, и отдельный для отображения списка похожих видео. Таким образом получается 3 URL:
/comments/1234 - отображает комменты к видео
/related/1234 - показывает похожие видео
/video/1234 - отображает всю страницу с видео, вызывая при этом 2 контроллера выше.
При этом подключение блоков можно делать по-разному, можно вызывать контроллеры на сервере и объединять результат, можно с клиента аяксом (комментарии на ютубе кстати именно так и подгружаются по моему).
Статья: http://habrahabr.ru/post/212065/
Мне кажется, это бессмысленное усложнение. Блоки проще реализовать как виджеты (хотя кто-то скажет что это и есть форма HMVC).
В статье мне не нравится это:
> На практике обычно приходиться оперировать одновременно несколькими моделями, например: статьи, пользователи, комментарии.
это нормально.
Это не баг, просто в комментах ссылка на https версию. Нехуй пользоваться http версией.
Действительно, меняется протокол. Но зачем? Если я загрузил http версию страницы, то никакой проблемы чтобы загрузить комментарии по HTTP наверно тоже нет? Меня не особо пугает что их прочтут шпионы.
По поводу именно ютюба - у них сделано всё очень через жопу с коментариями. Начинаешь коментировать - видео грузится снова, открываешь тред - видео грузится снова, нажимаешь отправить камент - видео грузится снова. В общем они перемудрили как-то.
>Ну если у нас например есть клон ютуба, то мы можем сделать отдельный контроллер для отображения комментариев, и отдельный для отображения списка похожих видео. Таким образом получается 3 URL:
Что-то я туплю, а как писать код не так? Ну тоесть ты ведь в любом случае не будешь писать index.php сразу с запросами, .css выводом, и со всеми страницами. Это просто невероятно неудобно!
>>607098
> конфиг лучше вынести в отдельный файл и не прописывать настройки прямо в классе
А чем чревато оставлять конфиг внутри класса? Ведь если я буду запрашивать файл это будет тот же самый код внутри класса, только лежащий в другом в файле.
>>608776
>По идее конечно можно сделать инициализацию классом. Так например в ZF сделан класс Bootstrap. Но для простого приложения это лишнее усложнение.
А в чем кроется усложнение? Я бы хотел во всем разобраться.
А автолоадер кто подключит? Все равно придется писать require, хоть для автозагрузчика, хоть для init.php.
> Значит ничего плохого иметь именно класс Init? Я могу его оставить?
нелогично делать класс только ради автозагрузки. Оставить можно, но без него было бы проще мне кажется.
>>609509
Идея HMVC в том что там делается контроллер не только для страниц, а и для отдельных блоков на них.
> а как писать код не так?
Без лишних контроллеров.
>>609513
Конфиг предназнчен для правки параметров пользователем. Соответственно в нем не должно быть кода так как неудобно разбирать код и пытаться угадать что можно менять а что нет.
> А в чем кроется усложнение?
Без класса:
$pdo = new PDO...
$mapper = new Mapper;
С классом все это придется обрачивать в функции, больше кода будет.
А автолоадер кто подключит? Все равно придется писать require, хоть для автозагрузчика, хоть для init.php.
> Значит ничего плохого иметь именно класс Init? Я могу его оставить?
нелогично делать класс только ради автозагрузки. Оставить можно, но без него было бы проще мне кажется.
>>609509
Идея HMVC в том что там делается контроллер не только для страниц, а и для отдельных блоков на них.
> а как писать код не так?
Без лишних контроллеров.
>>609513
Конфиг предназнчен для правки параметров пользователем. Соответственно в нем не должно быть кода так как неудобно разбирать код и пытаться угадать что можно менять а что нет.
> А в чем кроется усложнение?
Без класса:
$pdo = new PDO...
$mapper = new Mapper;
С классом все это придется обрачивать в функции, больше кода будет.
Но я же пользуюсь >TableDataGateway http://design-pattern.ru/patterns/table-data-gateway.html
Зачем он мне?
Понял.
Изучаю php, пользовался васяносборочкой денвер.
Вчера переустановил винду и решил всё поставить по-человечески. Поставил apache, поставил php, всё робит(отдельное спасибо автору шапки).
Теперь дошел черёд до MySQL. И с ним хочу узнать поподробнее. Я правильно понял, MySQL Server нужен для взаимодействия БД и сервера? И для чего нужен
Workbench? И как его тестить по установке?
Заранее спасибо.
Я пока пользуюсь виндоусом.
Чуть позже буду ставить дуал Ubuntu, но пусть будет на обеих системах. Дело в том, что я еще и учусь в шараге(где нам и показали ставить денвер собственно), поэтому без виндоуса пока никуда, т.к. пользуемся программами, которых нету на линукс.
openserver можеш накатить, там все стоит сразу
Что ты подразумеваешь под "сервером"?
MySQL это и есть сервер для базы данных (система управления базами данных - СУБД).
Сервер это программа, работающая в фоновом режиме, которая ждет что с ней соединится программа-клиент и попросит данные, тогда сервер отдает нужные данные.
База данных это файл на жестком диске.
Workbench это просто удобный инструмент для работы с базой.
https://www.mysql.com/products/workbench/
Нужен чтобы не писать sql-код из командной строки (хотя по мне нет разницы, что писать его в окошке, что в командной строке). Еще там можно смоделировать схему базы данных в графическом виде. Или даже создать новую базу данных на основе графической схемы.
Короче просто удобный инструмент, но необязательный.
В чем конкретно вопрос?
>>609584
http://www.yiiframework.com/doc-2.0/guide-start-installation.html
Есть MVC система. Посты из блога вывожу только из контроллера Index, хотя он нужен для всех страниц практически. Из модели идет запрос так же. Нужно сделать чтобы было отображение нав-бара на всех страницах.
Вывод страниц идет через for-each используя мультиуровневые массивы. Как переписать так, чтобы навигейшн бар был везде и был со списком постов up-to-date?
Алсо, это простой бложик, если что.
Заранее благодарю.
Роутер режет путь и оттуда уже известно, какой контроллер вызывается и какой метод из него по-дефолту. Роутер переписывать не очень хочу.
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Вот эти вот команды их откуда вызывать? У меня винда с кнопкой в меню Install Composer
Тебе нужен навбар на всех страницах? Так подключи его в шаблоне/шаблонах, в которых это необходимо.
<? if($needNavbar) { include "path/to/navbar-template.php"; } ?>
Массив с постами получить либо прямо в представлении, либо если считаешь это нарушением mvc то передать из контроллера.
Покажи код, непонятно в чем проблема.
>Как переписать
Используй фреймворк с шаблонизатором.
>Алсо, это простой бложик, если что.
Это не оправдание. Нужно сразу писать качественно. Через неделю у заказчика попрет посещаемость, тогда он попросит тебя прикрутить блоки с рекламой. Потом он захочет регистрацию и комментарии, интеграцию с соцсетями. Затем возможность делать покупки на сайте. И так далее.
>Веб-страница недоступна
>ERR_CONNECTION_TIMED_OUT
А через секунду сама обновляется и страница загружается нормально.
В курсе, что любые средства основанные на стандартных классах PHP обсераются по ресурсам даже если ДОМ-документ весит около 100мб. Сам я с такими большими XML никогда не сталкивался, максимум 20-50 мб. Вангую что нужно использовать для этого другою платформу, С или node.js
Есть у кого идеи?
Потоковыv парсером вроде XMLReader. Это банальная проверка, изучал ли ты теорию по XML или нет.
https://github.com/someApprentice/Students/blob/master/public/index.php#L6
Fatal error: Class 'App\Controller\RegisterAction' not found in C:\Program Files\xampp\www\public\index.php on line 6
Посмотрите кто-нибудь почему мог перестать работать композер, у меня в предыдущем коммите все нормально работало https://github.com/someApprentice/Students/commit/86d87fdc5233d91acf7ecbc81883bdbd041f928a#diff-8fda5307a067372337ec4b9adb16b55fR5
>>607109
>Папку vendor необходимо удалить из репозитория и внести в gitignore (погугли про этот файл).
https://github.com/someApprentice/Students/blob/master/.gitignore#L45
Не получилось почему-то.
>>607098
>- getConfig вроде нигде не нужен, значит незачем его делать. Не надо из класса наружу выдавать лишние данные.
https://github.com/someApprentice/Students/blob/master/app/init.php#L5
У меня не получилось обратиться без него.
Обращался таким образом:
$pdo = new \PDO(
global $config['db_dsn'],
global $config['db_user'],
global $config['db_password']
);
https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/TableDataGateway.php#L5
https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L36
Я похоже что-то не то сделал. Я представлял все так: класс TableDataGateWay содержит в себе универсальные методы которые подойдут к любой таблице в БД, а любой его наследник (например StudentGateway) будут содержать даже унаследованные методы добавления записи в БД, но универсальный метод для этого не получается придумать, потому что записи почти всегда будут разные.
Наверно, эту https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L50 функцию нужно перенести в TableDataGateway, а эту https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/TableDataGateway.php#L5 просто удалить?
ОП, а мы можем набрать обороты? Мне кроме как писать код нечем заняться, да и нравиться это дело очень. Не хочу просто так терять время.
https://github.com/someApprentice/Students/blob/master/public/index.php#L6
Fatal error: Class 'App\Controller\RegisterAction' not found in C:\Program Files\xampp\www\public\index.php on line 6
Посмотрите кто-нибудь почему мог перестать работать композер, у меня в предыдущем коммите все нормально работало https://github.com/someApprentice/Students/commit/86d87fdc5233d91acf7ecbc81883bdbd041f928a#diff-8fda5307a067372337ec4b9adb16b55fR5
>>607109
>Папку vendor необходимо удалить из репозитория и внести в gitignore (погугли про этот файл).
https://github.com/someApprentice/Students/blob/master/.gitignore#L45
Не получилось почему-то.
>>607098
>- getConfig вроде нигде не нужен, значит незачем его делать. Не надо из класса наружу выдавать лишние данные.
https://github.com/someApprentice/Students/blob/master/app/init.php#L5
У меня не получилось обратиться без него.
Обращался таким образом:
$pdo = new \PDO(
global $config['db_dsn'],
global $config['db_user'],
global $config['db_password']
);
https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/TableDataGateway.php#L5
https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L36
Я похоже что-то не то сделал. Я представлял все так: класс TableDataGateWay содержит в себе универсальные методы которые подойдут к любой таблице в БД, а любой его наследник (например StudentGateway) будут содержать даже унаследованные методы добавления записи в БД, но универсальный метод для этого не получается придумать, потому что записи почти всегда будут разные.
Наверно, эту https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L50 функцию нужно перенести в TableDataGateway, а эту https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/TableDataGateway.php#L5 просто удалить?
ОП, а мы можем набрать обороты? Мне кроме как писать код нечем заняться, да и нравиться это дело очень. Не хочу просто так терять время.
>изучал ли ты теорию по XML или нет.
Что ты имеешь в виду "изучал ли ты теорию". Использование конкретного средства это не теория, а практика. В самом XML нет никакой теории, это просто язык разметки.
>почему мог перестать работать композер
Делай composer dump-autoload каждый раз, когда создаешь новый класс или меняешь пути к своим классам.
> vendor/x
Звездочка не нужна в гитигноре, это же регулярное выражение, означает что будет игнорировать все файлы в папке вендор, но не саму эту папку. Нужно просто vendor без звездочки.
>а мы можем набрать обороты?
Кто тебе мешает? Или ты хочешь чтобы он тебе помогал в онлайн режиме? Да ты охуель.
Я говорю про это
http://pastebin.com/j8LwLput
Есть же yml, xml.
Говнокода было мало?
десятку ставь, охуенная
>Делай composer dump-autoload каждый раз, когда создаешь новый класс или меняешь пути к своим классам.
Так делаю...
>Звездочка не нужна в гитигноре, это же регулярное выражение, означает что будет игнорировать все файлы в папке вендор, но не саму эту папку. Нужно просто vendor без звездочки.
Без звездочки тоже не получилось. Я в самом начале без нее писал.
>>609656
>Кто тебе мешает? Или ты хочешь чтобы он тебе помогал в онлайн режиме? Да ты охуель.
Я обычно за 1-2 дня все делаю и задаю вопросы какие не понятны, а потом всю неделю как овощ сижу без дела. Почему нельзя поощрить мое желание к знаниям давая больше практики? Я же не настаиваю а спрашиваю ОПа, может ли он так...
Пожалуйста, не бей. Просто обоссы и скажи,что можно с этим сделать, лол.
Я делаю запрос из базы, он идет в контроллер, в нужный вид приводится и приводится сюда.
Роутер вполне обычный, с несколькими аргументами, пока что без исключений написанный.
http://localhost/controller/method/(param)/(param)/(param)
url[0] = Controller
url[1] = Method
url[2] = Param
url[3] = Param
url[4] = Param
Отлаживай автозагрузчик. Код автозагрузчика лежит в vendor/autoload.php, и других файлах, натыкай туда var_dump и посмотри какие файлы он пытается подулючить.
Также, почему у тебя файл с классом называется с маленькой буквы? Разве PSR-4 такое разрешает? Файл должен называться так же как и класс.
>>Папку vendor необходимо удалить из репозитория и внести в gitignore (погугли про этот файл).
> Не получилось почему-то.
Попробуй еще. Помни что если ты добавил эту папку в gitignore то git ее игнорирует и не увидит что ты ее удалил. Потому надо убирать ее в несколько этапов.
Вписывать ее кстати надо как vendor, без слешей наверно.
> У меня не получилось обратиться без него.
Подумай как обойтись без global. Например можно делать require конфига внутри функции.
Также, зачем ты делаешь функции в init.php? Проще же просто написать последовательно действия.
И какой смысл вот в этом?
> $pdo = null;
> if (!$pdo) {
Это условие всегда выполняется.
> но универсальный метод для этого не получается придумать, потому что записи почти всегда будут разные.
Значит придется делать свои методы в каждом наследнике. Хотя если подумать, можно сделать универсальный метод insert, например получающий массив полей. Но это не обязательно.
> ОП, а мы можем набрать обороты?
Так набирай, ты ведь можешь сам код писать? У меня много других дел, я не могу в реальном времени отвечать, так что лучше всего задать какие-то вопросы и писать код не дожидаясь меня.
Отлаживай автозагрузчик. Код автозагрузчика лежит в vendor/autoload.php, и других файлах, натыкай туда var_dump и посмотри какие файлы он пытается подулючить.
Также, почему у тебя файл с классом называется с маленькой буквы? Разве PSR-4 такое разрешает? Файл должен называться так же как и класс.
>>Папку vendor необходимо удалить из репозитория и внести в gitignore (погугли про этот файл).
> Не получилось почему-то.
Попробуй еще. Помни что если ты добавил эту папку в gitignore то git ее игнорирует и не увидит что ты ее удалил. Потому надо убирать ее в несколько этапов.
Вписывать ее кстати надо как vendor, без слешей наверно.
> У меня не получилось обратиться без него.
Подумай как обойтись без global. Например можно делать require конфига внутри функции.
Также, зачем ты делаешь функции в init.php? Проще же просто написать последовательно действия.
И какой смысл вот в этом?
> $pdo = null;
> if (!$pdo) {
Это условие всегда выполняется.
> но универсальный метод для этого не получается придумать, потому что записи почти всегда будут разные.
Значит придется делать свои методы в каждом наследнике. Хотя если подумать, можно сделать универсальный метод insert, например получающий массив полей. Но это не обязательно.
> ОП, а мы можем набрать обороты?
Так набирай, ты ведь можешь сам код писать? У меня много других дел, я не могу в реальном времени отвечать, так что лучше всего задать какие-то вопросы и писать код не дожидаясь меня.
Я не могу в реальном времени отвечать. Не надо меня ждать, задай вопросы, покажи код и пиши дальше, потом вернешься и исправишь если что.
Даже если ты зашел в тупик, ты можешь что-то другое делать, например не работает автозагрузчик - подключи пока файл через require, не можешь сделать работу с базой данных - просто возвращай пока заготовленные данные из массива, делай верстку страниц и тд.
Подумай сам, как наиболее эффективно двигаться вперед.
Доктрина вообще-то позволяет вместо аннотаций использовать XML или Yml. Ты мануал читал? Адски неудобно, но ты можешь попробовать.
Нет, объекты походу должен возвращать метод типа getToppings. Константы должны быть строками типа foo.CHEESE = 'cheese', или вообще числами.
> Делай composer dump-autoload каждый раз
Это не требуется.
>>609641
Для удаления папки vendor надо делать примерно так:
- не вносить vendor в gitignore, удалитть или перенести эту папку
- закоммитить
- внести vendor в gitignore, закоммитить
-вернуть vendor на место
Также, подозрительно выглядит вот это:
https://github.com/someApprentice/Students/commit/4a9f0c6357a6ebf852a47d404010c53dcc172909#diff-5e40181745bfd71598eafb75920663f1
Это ты не руками удалял? зачем?
> return b[1]-a[1];
Это плохо читается. Почему не b.population - a.population?
> alert
Лучше console.log
Алсо по условию надо вывести не все города, а только первые N. И по моему вывести только названия.
>>609645
Я имею в виду библиотеки и расширения для работы с XML. Это теория, практика это написание кода, а обзор какие библиотеки существуют - это теоретическая часть.
>>609617
Что-то с википедией или твоим браузером.
>>609607
> Массив с постами получить либо прямо в представлении,
Это неправильно.
>>609595
> Посты из блога вывожу только из контроллера Index, хотя он нужен для всех страниц практически.
Это странно. Логично что для работы с разделом постов будет контроллер для постов.
> Из модели идет запрос так же.
Не понял что значит «так же».
> Нужно сделать чтобы было отображение нав-бара на всех страницах.
И в чем проблема?
> используя мультиуровневые массивы.
Лучше бы конечно были объекты Пост.
> Как переписать так, чтобы навигейшн бар был везде и был со списком постов up-to-date?
Получить нужные данные в контроллере и передать во вью, там вывести.
> return b[1]-a[1];
Это плохо читается. Почему не b.population - a.population?
> alert
Лучше console.log
Алсо по условию надо вывести не все города, а только первые N. И по моему вывести только названия.
>>609645
Я имею в виду библиотеки и расширения для работы с XML. Это теория, практика это написание кода, а обзор какие библиотеки существуют - это теоретическая часть.
>>609617
Что-то с википедией или твоим браузером.
>>609607
> Массив с постами получить либо прямо в представлении,
Это неправильно.
>>609595
> Посты из блога вывожу только из контроллера Index, хотя он нужен для всех страниц практически.
Это странно. Логично что для работы с разделом постов будет контроллер для постов.
> Из модели идет запрос так же.
Не понял что значит «так же».
> Нужно сделать чтобы было отображение нав-бара на всех страницах.
И в чем проблема?
> используя мультиуровневые массивы.
Лучше бы конечно были объекты Пост.
> Как переписать так, чтобы навигейшн бар был везде и был со списком постов up-to-date?
Получить нужные данные в контроллере и передать во вью, там вывести.
Алсо, если что-то нужно на всех страницах, то можно эти данные в базовом контроллере получать и передавать во вью, или где-то в коде инциализации.
> Я правильно понял, MySQL Server нужен для взаимодействия БД и сервера?
Это и есть сервер базы данных. Он принимает и выполняет SQL запросы.
> И для чего нужен Workbench?
Для проектирования базы днных
> И как его тестить по установке?
Как в туториале например: http://www.mysql.ru/docs/man/Connecting-disconnecting.html
попробуй подключиться через командную строку к серверу. Если подключилось то все ок.
Команда будет вроде
mysql -uUSER -p
> Массив с постами получить либо прямо в представлении,
> Это неправильно.
В yii такое сплошь и рядом, виджеты сами обращаются к базе за данными.
Хотя не спорю, это нарушение mvc.
Потому что там функция, а не класс. В функции по другому ведь не получится сделать запоминание значения. Но сейчас мы переходим на ООП и функции нам не нужны. Ну и что касается инициализации, ее можно сделать классом, но проще обычным скриптом без функций или классов.
Никак, их нужно задавать не в конструкторе, а в прототипе объекта.
В конструкторе перечисляются инструкции, которые будут выполняться при создании каждого ебаного объекта. Тебе же не нужно создавать константу при создании нового объекта.
Строчку с папкой и неймспейсом в файле vendor/composer/autoload_psr4.php
Если что, ты можешь удалить папку vendor и заново сгенерировать автозагрузчик командой композера dump-autoload
Это упражнение из задачника опа по имитации ооп в js.
То что получается выглядит крайне костыльно и только прививает отвращение к этому языку.
Кстати в es6 кажется таки ввели классовые константы.
Лично у меня складывается впечатление что js недоязык и годится только для манипуляций с домом, что бы там ни кукарекали хипсторы с ноджс.
Чтобы не было непонимания, это не имитация ООП которую придумал ОП, а общепринятая имитация и ее можно увидеть в библиотеках. Да и как вы без ООП будете писать сложные приложения? Никак. Так что надо изучать.
Пикрелейтед вводит в заблуждение. Получается мне нужно передавать не Hamburger.SIZE_SMALL, а Hamburger.prototype.SIZE_SMALL.
Всё-таки я не понимаю, почему многие негодуют от пхп, но расхваливают этот набор костылей.
Чтобы пилить бабло на браузерных играх и не такое придумаешь.
>И какой смысл вот в этом?
>
>> $pdo = null;
>> if (!$pdo) {
>Это условие всегда выполняется.
>
Я просто переношу код из https://github.com/someApprentice/simpleRegistration/blob/master/Lib/connect.php#L11-L13
Это мы с тобой делали
>как вы без ООП будете писать сложные приложения?
А какие могут быть сложные приложения на js?
Ну валидировать форму, ну сымитировать алёрт каким-нибудь jui dialog. Ну вставить параграф полученный аяксом.
Все это делается готовыми библиотеками, ничего нестандартного, никаких сложных архитектурных схем.
Приведи примеры или ссылки на навороченные нестандартные веб-приложения на js.
Мне кажется такие если и есть, то редкость. Ну или кастомные вещи типа онлайн-игр, не знаю.
Мы в конце концов php-шники, хоть и стремимся к фулстек.
ты забываешь про дно.жс
> Получается мне нужно передавать не Hamburger.SIZE_SMALL, а Hamburger.prototype.SIZE_SMALL.
Почему константу объявлять на прототипе?
Логичнее передавать Hamburger.SIZE_SMALL. Константа тут принадлежит «классу», как например статическое поле.
Да и это не так сложно, достаточно запомнить соответствие между обычным ООП и имитацией в JS.
>>609707
Композер? Либо скачать установщик с офиц. сайта и запустить либо скачать phar архив и сохранить.
Погугли про установку композера на винду, в общем.
>>609712
как в этой задаче: https://github.com/codedokode/pasta/blob/master/js/spa.md
> Приведи примеры или ссылки на навороченные нестандартные веб-приложения на js.
Gmail.
Yandex Maps. Вот их API, сплошное ООП: https://tech.yandex.ru/maps/doc/jsapi/2.1/quick-start/tasks/quick-start-docpage/
jsfiddle
Композер это просто файлик, его можно и вручную скачать. Научить читать и не боятся команд и кода.
>curl -sS https://getcomposer.org/installer | php
>mv composer.phar /usr/local/bin/composer
первая строчка скачивает файлик, вторая перемещает.
А как ты ее создаешь? Очевидно чтобы это работало надо написать
Hamburger.SIZE_SMALL = 'small'
или
Hamburger.SIZE_SMALL = 1;
>Так набирай, ты ведь можешь сам код писать? У меня много других дел, я не могу в реальном времени отвечать, так что лучше всего задать какие-то вопросы и писать код не дожидаясь меня.
Так набираю, я не прошу отвечать мне реальном времени, я надеялся хотя бы на пару раз в неделю. Раз не можешь, так не можешь, нет проблем. Я просто буду еще делать в свободное время задачи по верстке и по линуксу.
Как и свойства, через this внутри конструктора.
Ну я к этому и веду, что такие задачи либо крайне специфические, либо требуют серьезного скила (для работы в яндексе или гугле).
Никого из этого треда не возьмут в гугл (даже тебя, хоть ты тут самый прошаренный).
Мы на js максимум будем простенькие сервисы писать, а скорее всего формочки да уведомления.
Поэтому имитация ООП в js хоть и интересна для ознакомления, но на практике не нужна. Ну и вторая мысль, что ООП реализован в js плохо. Почему я должен изобретать какую-то дикую телегу ради тех же несчастных констант?
>Строчку с папкой и неймспейсом в файле vendor/composer/autoload_psr4.php
Нет, я этого не делал. Странно, может быть так случилось когда я неудачно переносил файлы чтобы как бы откатить версию чтобы убедиться что композер работал на ней. В любом случае я уже после этого много раз делал дамп комозера, это же должно заменить тот файл композера на новый?
Если у тебя вопрос на который может кратко ответить, то я или аноны наверняка ответим сразу. Если же код на проверку большого объема то возможно придется подождать результатов. В любом случае, старайся не терять время.
>>609727
ООп исплоьзуется еще в библиотеках. В проекте над которым ты будешь работать, может быть он тоже используется.
Да и ничего сложного там нет. Если тебе учебная простоая задача кажется сложной, что же ты будешь делать когда до реальных задач дойдешь?
И кстати что нестандартного в моей задаче на JS про автоматизированное рабочее место преподавателя? Ты думаешь подобные программы пишут только сеньоры? Нет, пишут стажеры и джуниоры, особенно если это госзаказ какой-нибудь, все деньги давно попилены и на сеньоров их просто не хватит.
Хорошо, тогда ты можешь изучить файлы автозагрузчика и натыкать туда echo и var_dump чтобы увидеть что в разных переменных и какие файлы он пытается подключить в ходе автозагрузки.
В мануале psr-4 пишут маленькими буквами: https://getcomposer.org/doc/01-basic-usage.md#autoloading
Почему у тебя большими?
Советую всем использовать вместо echo и var_dump свою функцию, которая распечатывать массив или переменную в файл. При отладке сложных фреймворков или ajax незаменимо. Еще лучше конечно пользоваться для этого готовым решением для отладки, но этот способ самый быстрый и вы будете им всегда пользоваться.
>ООп исплоьзуется еще в библиотеках.
Пусть используется. Я же не буду перечитывать исходный код jquery или mootools.
>Да и ничего сложного там нет.
Не сложно, но костыльно, неудобно, некрасиво и вообще нафиг не нужно.
>когда до реальных задач дойдешь?
Я не знаю, что ты подразумеваешь под реальными задачами. В твоем мире наверное стажеры допиливают Gmail, но я как-то с таким не сталкивался.
В моем мире js больше по части формочек и анимации на странице.
Ну ладно, мы с разных планет, не будем спорить.
ну скачала композером, а дальше что? папка с фреймворком не открывается в браузере, доступ запрещен пишет.
>Пусть используется. Я же не буду перечитывать исходный код jquery или mootools.
В одном случае из 10 - надо. Бывают случаи, когда есть некая редко-встречающаяся библиотека. Недавний пример с работы - нужно было найти готовый вариант для интерфейса тегирования - чтоб как втентакле проставлять теги на фотку. Готовых решений таких - пересчитать по пальцам. Нашли самый подходящий, но в нем был один косяк, который нам не подходил и решили устранить чутка дописав исходник. Работа понятное дело небольшая, но если бы фронтендщик не знал как пишут прототипы - наверное копался бы дольше. Это при том что работаю я в шараге, хуяк хуяк и готово. Где работа сложней хоть немного - таких прецедентов будет больше.
А какой фреймворк ты ставишь то? В первом посте не написал ничего.
>Можно сравнить буквы. Если они не совпали - слово не палиндром, выходим. Если совпали - продолжаем сравнение.
Ох щи, действительно, самое естественное же решение... Да, там можно просто поставить это условие в цикле, чтобы он продолжался.
Чёрт, как всё просто, а я только усложнять могу пока что.
>В массиве не может быть 2 элемента с одинаковым ключом, ключ это что-то вроде уникального идентификатора элемента массива. А вот одинаковые значения у элементов могут быть.
Оо, точно, я всё перепутал. Конечно, там ключи разные (порядковые номера), а значения у них могут быть одинаковыми (буквы из текста).
Вот там var_dump массивов как выглядит (часть их):
array(1) {
["а"]=>
int(1)
}
array(1) {
["а"]=>
int(1)
}
array(1) {
["р"]=>
int(2)
}
array(1) {
["р"]=>
int(2)
}
array(1) {
["о"]=>
int(3)
}
array(1) {
["о"]=>
int(3)
}
array(1) {
["з"]=>
int(4)
}
array(1) {
["з"]=>
int(4)
}
array(1) {
["а"]=>
int(5)
}
array(1) {
["а"]=>
int(5)
}
В принципе, получается, это ненужная сложность тоже работает.
>Можно сравнить буквы. Если они не совпали - слово не палиндром, выходим. Если совпали - продолжаем сравнение.
Ох щи, действительно, самое естественное же решение... Да, там можно просто поставить это условие в цикле, чтобы он продолжался.
Чёрт, как всё просто, а я только усложнять могу пока что.
>В массиве не может быть 2 элемента с одинаковым ключом, ключ это что-то вроде уникального идентификатора элемента массива. А вот одинаковые значения у элементов могут быть.
Оо, точно, я всё перепутал. Конечно, там ключи разные (порядковые номера), а значения у них могут быть одинаковыми (буквы из текста).
Вот там var_dump массивов как выглядит (часть их):
array(1) {
["а"]=>
int(1)
}
array(1) {
["а"]=>
int(1)
}
array(1) {
["р"]=>
int(2)
}
array(1) {
["р"]=>
int(2)
}
array(1) {
["о"]=>
int(3)
}
array(1) {
["о"]=>
int(3)
}
array(1) {
["з"]=>
int(4)
}
array(1) {
["з"]=>
int(4)
}
array(1) {
["а"]=>
int(5)
}
array(1) {
["а"]=>
int(5)
}
В принципе, получается, это ненужная сложность тоже работает.
Я и не говорил, что это не нужно знать, чего вы все накинулись.
Просто реализация ооп в js мягко говоря заставляет желать лучшего.
>если бы фронтендщик не знал как пишут прототипы
А у вас фронтендщик знает как в php парсить xml или работать с сокетами? Нет? Ну вот и я к тому же, что фулстек-фулстеком, а некоторое разграничение зоны ответственности все-таки должно быть.
Фулстеки - миф. Говнокодеры, которые и швец и жнец и на хуе дуец не нужны. Разграничение ответственности не просто должно быть, а строжайшее. Иначе превратишься в раба, который одной рукой пишет скриптики, другой рукой макеты в фотошопе нарезает длля верстки.
>Почему у тебя большими?
Потому что у тебя тоже большими https://github.com/codedokode/pasta/blob/master/php/autoload.md
>"PSR-4": {
>скачала
А, так ты же не человек даже.
Папка с фреймворком и не должна быть доступна из веб, из веб должна быть доступна папка web. Для этого нужно настроить виртуальный хост.
http://www.yiiframework.com/doc-2.0/guide-start-installation.html#recommended-apache-configuration
А еще там MyLibray без двух обратных слешей на конце.
Я уже и не говорю о том, что фулстек - это физически не возможно, иначе один сайтик-проект будешь лет пять делать.
Работать и осваивать нужно на одной технологии, потому что пока другие осваивать будешь, первые забываются.
Ну не скажи, есть и грамотные профессионалы, которые на фрилансе зашибают >2k зеленых, знал таких, уважаю. Правда работают по 16 часов в сутки.
Я бы так не хотел. Хочется и на природе отдохнуть с семьей, и книжку иногда почитать.
Ну и строгое разграничение ответственности не избавляет от среднего знания сопутствующих дисциплин. Например чтобы бекендер не начал высирать echo "<center>" например.
Я делаю и заранее уже думаю, что что-то сделал не так.
Как мне успокоиться и начать жить?
http://ideone.com/M0dDNE - вот сделал первую проверку номера через регулярку.
Всё работает, всё показывает, но у меня уже ощущение, что сделано всё неправильно, можно было сделать проще и правильнее.
Вирусня, у меня так было.
Предполагаю, что эти профессионалы просто "агреггаторы фрилансеров". Люди - которые имеют распиаренные аккаунты на сайтах для фрилансеров и раздающие свои заказы удаленным разрабам.
Нет, лично знаю пару человек, и не по двачам, а irl.
Действительно очень классные профи, причем не только веб-фулстек, но и отлично знают несколько других языков.
Естественно сеньоры с опытом 10-15 лет, а не 18-летние стажеры работающие за еду, как тут проповедует опчег.
Ну ладно, не хочу больше флудить. Истина посредине: понятно что никто не будет грузить джуна какими-то сложностями, но это не значит что достаточно знания синтаксиса чтобы взяли джуниором. Тем более что люди обычно ставят цель карьерного роста, а для этого нужно непрерывно учиться.
А я еще дам кусок кода который это делает:
file_put_contents('/tmp/log.txt', print_r($var, true), FILE_APPEND);
хотя по моему var_dump($x); die(); проще и удобнее.
>>609741
Вот смотри вакансия в компании Битрикс: https://www.1c-bitrix.ru/about/job.php#webdev
Битрикс это сложная CMS использующаяся в тысячах сайтов. И посмотри, кого они ищут? Отнюдь не сеньора, а студента за 20 000 р.
Также и со сложными JS приложениями. Вполне возможно что разрабатывать их поручат тебе.
Ну и даже на обычном сайте объем JS кода обычно растет и с ООП проще его структурировать.
>>609742
И никаких подробностей: ни что ты пишешь в адресной строке браузера, ни как настроен Апач. Без подробностей трудно что-то сказать.
Алсо зачем браться за фреймворк если ты даже виртуальный хост на Апаче пока настроить не можешь.
>>609758
Авторы JS по моему скопировали ООП из какого-то странного малоизвестного языка, видимо решили что обычный ООП уже устарел и не нужен.
Тебе надо просто запомнить как в JS реализуются вещи из классоческого ООП:
класс -> конструктор + прототип
конструктор -> функция с большой буквы
поле -> создаем св-во в конструкторе
метод -> функция в прототипе
статич. поля и методы - свойства на функции
константы -> свойства функии, написанные большими буквами
private/public - нет
наследование -> Object.create в ES5, хак с прототипами в ES3
Алсо можешь почитать про новый синтаксис в будущей версии JS http://frontender.info/es6-classes-final/
А я еще дам кусок кода который это делает:
file_put_contents('/tmp/log.txt', print_r($var, true), FILE_APPEND);
хотя по моему var_dump($x); die(); проще и удобнее.
>>609741
Вот смотри вакансия в компании Битрикс: https://www.1c-bitrix.ru/about/job.php#webdev
Битрикс это сложная CMS использующаяся в тысячах сайтов. И посмотри, кого они ищут? Отнюдь не сеньора, а студента за 20 000 р.
Также и со сложными JS приложениями. Вполне возможно что разрабатывать их поручат тебе.
Ну и даже на обычном сайте объем JS кода обычно растет и с ООП проще его структурировать.
>>609742
И никаких подробностей: ни что ты пишешь в адресной строке браузера, ни как настроен Апач. Без подробностей трудно что-то сказать.
Алсо зачем браться за фреймворк если ты даже виртуальный хост на Апаче пока настроить не можешь.
>>609758
Авторы JS по моему скопировали ООП из какого-то странного малоизвестного языка, видимо решили что обычный ООП уже устарел и не нужен.
Тебе надо просто запомнить как в JS реализуются вещи из классоческого ООП:
класс -> конструктор + прототип
конструктор -> функция с большой буквы
поле -> создаем св-во в конструкторе
метод -> функция в прототипе
статич. поля и методы - свойства на функции
константы -> свойства функии, написанные большими буквами
private/public - нет
наследование -> Object.create в ES5, хак с прототипами в ES3
Алсо можешь почитать про новый синтаксис в будущей версии JS http://frontender.info/es6-classes-final/
>Также и со сложными JS приложениями. Вполне возможно что разрабатывать их поручат тебе.
кусочек кода этих охуенных OOP-mlg-swag-JS приложений привести, чтобы ты охуел?
> а некоторое разграничение зоны ответственности все-таки должно быть.
Это выглядит как «не хочу учиться». Не хочешь - не учись, но возьмут того кто хочет. Тем более в кризис (если ты из России) я бы не советовал быть таким разборчивым.
>>609761
Вообще-то если один человек делает и фронтенд и бекенд, то нет проблемы взаимодействия и непонимания.
Разделение бывает, но не везде и не всегда. Обычно разделение идет там, где простая верстка, ее сваливают верстальщикам так как они дешевле обходятся. Но в сложном приложении если тебе надо добавить какую-то фичу, то быстрее сдеалть все самому, а не ждать пока верстальщик что-то поменяет на фронтенде.
>>609763
позор автору урока. Но и ты должен настороженно относиться к информации скаких-то левых сайтов и уроков и если что, смотреть официальную документацию.
Ссылка: https://getcomposer.org/doc/04-schema.md#psr-4
Насчет бекслеша ты тоже прав - если его не указать то он будет брать любые неймспесы начинающиеся со слова: https://getcomposer.org/doc/04-schema.md#psr-4
>>609768
Как это невозможно? Я разбираюсь и в том, и в том.
>>609769
Если они работают по 16 часов то они что-то делают неправильно. Надо не больше работать, а больше брать за час.
>>609779
Госдеп через американские браузеры лодку раскачивает видимо. Ну или ты зайдя на медузу, установил расширение либо разрешил отправлять уведомления. Если это Хром то в настройках можно поискать список сайтов, и отозвать разрешение. Если это расширение то открой список расширений.
Или это обычная реклама на сайте. Я такую штуку не видел потому точно угадать не могу.
>>609785
Я тоже так хочу, только брать заказы на западе и перепродавать тут.
> а некоторое разграничение зоны ответственности все-таки должно быть.
Это выглядит как «не хочу учиться». Не хочешь - не учись, но возьмут того кто хочет. Тем более в кризис (если ты из России) я бы не советовал быть таким разборчивым.
>>609761
Вообще-то если один человек делает и фронтенд и бекенд, то нет проблемы взаимодействия и непонимания.
Разделение бывает, но не везде и не всегда. Обычно разделение идет там, где простая верстка, ее сваливают верстальщикам так как они дешевле обходятся. Но в сложном приложении если тебе надо добавить какую-то фичу, то быстрее сдеалть все самому, а не ждать пока верстальщик что-то поменяет на фронтенде.
>>609763
позор автору урока. Но и ты должен настороженно относиться к информации скаких-то левых сайтов и уроков и если что, смотреть официальную документацию.
Ссылка: https://getcomposer.org/doc/04-schema.md#psr-4
Насчет бекслеша ты тоже прав - если его не указать то он будет брать любые неймспесы начинающиеся со слова: https://getcomposer.org/doc/04-schema.md#psr-4
>>609768
Как это невозможно? Я разбираюсь и в том, и в том.
>>609769
Если они работают по 16 часов то они что-то делают неправильно. Надо не больше работать, а больше брать за час.
>>609779
Госдеп через американские браузеры лодку раскачивает видимо. Ну или ты зайдя на медузу, установил расширение либо разрешил отправлять уведомления. Если это Хром то в настройках можно поискать список сайтов, и отозвать разрешение. Если это расширение то открой список расширений.
Или это обычная реклама на сайте. Я такую штуку не видел потому точно угадать не могу.
>>609785
Я тоже так хочу, только брать заказы на западе и перепродавать тут.
Нет даже проверки на длину: http://ideone.com/rcSOSS
Алсо паста.
### Номера телефонов
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
это не ссаные задачи. Это проекты среднего уровня, где можно многому научиться
Я тоже "разбираюсь" и в том и в том, но делать и то и то и это для большого проекта одному человеку - не эффективно. Такое заставляют делать только очень жадные владельцы говноконторок и заказчики.
двачую
>>609380
bump
Там вроде все правильно, но меня смущает смешивание jquery и обычного js. Может есть какой-то принцип разграничения, паттерн, или что-то в этом роде?
>>609855
>Это выглядит как «не хочу учиться».
Не хотел бы, не решал бы твои всратые задачи.
Я всего лишь сказал, что мне не эстетически не нравится реализация ООП в js и выразил сомнение в востребованности серьезных приложений на js. Ну и сложные вещи явно делают не стажеры, я тебе не верю, можешь не пробовать меня переубедить.
>И никаких подробностей: ни что ты пишешь в адресной строке браузера, ни как настроен Апач. Без подробностей трудно что-то сказать.
>
>Алсо зачем браться за фреймворк если ты даже виртуальный хост на Апаче пока настроить не можешь.
Мальчеги, вы надо мной что ли издеваетесь) Я конечно девушка знатная, сиськи большие, жопа вот это вот все, но я уже два года делаю сайты на похапе и у меня прекрасно работает локалка. А вот фреймворк не разворачивается не знаю почему, собственно поэтому и был задан вопрос, как установить уии2. Зачем делать из меня дуру, не понимаю. Причем такая тупость в ответ на вопрос в этом треде постоянно встречается, вы видимо привыкли к нубским вопросам школьников.
Блин, я никак не могу понять, почему у меня не работает указание количества цифр в регулярном выражении?
$regexp = '/^8([0-9]{3}-()\\s)([0-9]{5}-()\\s)$/'; - так не работает.
$regexp = '/^8([0-9-()\\s]+)([0-9-()\\s]+)$/'; так работает, но нет ограничения на количество цифр в номере.
Вроде всё просмотрел в том уроке - не нахожу дополнительных указаний для этого.
Я-то просто проверил те номера, проверил некоторые из тех, которые есть в твоей пасте, - просто похожие, подобного типа.
С этим было всё в порядке.
Чуть позже напишу проверку из массива, спасибо.
- ChWUSES???
- ChEMGR!
- ChSSU...
- OnChEM)))
- ChActMBx, if(f.value.length>0 && arMailBoxes[f.value] && arMailBoxes[f.value]['server_type']=='smtp') email_domain_select.options[ix] = new Option(arMailBoxes[f.value]['domains'][ix], arMailBoxes[f.value]['domains'][ix]);
omg, wtf?
Если такое пишут те йоба-стажеры битрикса, на которых молится оп, тогда я спокоен. Я тоже могу устраиваться в битурекс.
Но не хочу.
>сиськи большие, жопа вот это вот все
Весишь-то сколько? Может там сплошной жир, это не считается.
>фреймворк не разворачивается не знаю почему, собственно поэтому и был задан вопрос, как установить уии2. Зачем делать из меня дуру
кекс
>В прошлый раз я этого точно не делала.
В душе не ебу, что ты делала в прошлый раз. Может это был первый юи, не второй?
В какой директории установлено приложение, дырка? Дай полный путь, C:\\???\example.com
Это важно, потому что корневая директория должна быть именно в папке C:\\путь к зампу\example.com\web, не C:\\путь к зампу\example.com как у тебя сейчас.
Это сделано специально, чтобы защитить важные файлы от доступа из интернета. Доступной должна быть только папка web.
Это делается в конфиге апача, как написано здесь: http://www.yiiframework.com/doc-2.0/guide-start-installation.html#recommended-apache-configuration
Как это сделать на xampp сборочке не знаю, гугли.
Чтобы не быть голословным, только что тоже поставил второй юи. Композер между прочим потребовал npm и bower пакеты, пришлось ставить плагин для композера. Об этом в мануале по установке об этом сказано:
>composer global require "fxp/composer-asset-plugin:~1.1.1"
> installs the composer asset plugin which allows managing bower and npm package dependencies through Composer. You only need to run this command once for all.
Это было сделано?
Дальше, когда я устанавливал этот плагин, композер потребовал у меня auth-токен гитхаба. Как получить токен, написано здесь
https://github.com/blog/1509-personal-api-tokens
Ну и на всякий случай уточню, что
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
здесь basic нужно заменить на свою папку, в данном случае C:\\путь к зампу\example.com
Название сайта example.com вместо basic.
Папка example.com/web должна быть доступна из веб, это нужно настроить в конфиге апача/зампа.
У меня встал уй, пикрелейтед.
Правда там какой-то ворнинг, из-за него 500 статус, надо разобраться...
>сиськи большие, жопа вот это вот все
Весишь-то сколько? Может там сплошной жир, это не считается.
>фреймворк не разворачивается не знаю почему, собственно поэтому и был задан вопрос, как установить уии2. Зачем делать из меня дуру
кекс
>В прошлый раз я этого точно не делала.
В душе не ебу, что ты делала в прошлый раз. Может это был первый юи, не второй?
В какой директории установлено приложение, дырка? Дай полный путь, C:\\???\example.com
Это важно, потому что корневая директория должна быть именно в папке C:\\путь к зампу\example.com\web, не C:\\путь к зампу\example.com как у тебя сейчас.
Это сделано специально, чтобы защитить важные файлы от доступа из интернета. Доступной должна быть только папка web.
Это делается в конфиге апача, как написано здесь: http://www.yiiframework.com/doc-2.0/guide-start-installation.html#recommended-apache-configuration
Как это сделать на xampp сборочке не знаю, гугли.
Чтобы не быть голословным, только что тоже поставил второй юи. Композер между прочим потребовал npm и bower пакеты, пришлось ставить плагин для композера. Об этом в мануале по установке об этом сказано:
>composer global require "fxp/composer-asset-plugin:~1.1.1"
> installs the composer asset plugin which allows managing bower and npm package dependencies through Composer. You only need to run this command once for all.
Это было сделано?
Дальше, когда я устанавливал этот плагин, композер потребовал у меня auth-токен гитхаба. Как получить токен, написано здесь
https://github.com/blog/1509-personal-api-tokens
Ну и на всякий случай уточню, что
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
здесь basic нужно заменить на свою папку, в данном случае C:\\путь к зампу\example.com
Название сайта example.com вместо basic.
Папка example.com/web должна быть доступна из веб, это нужно настроить в конфиге апача/зампа.
У меня встал уй, пикрелейтед.
Правда там какой-то ворнинг, из-за него 500 статус, надо разобраться...
Stack trace:
#0 {main}
И в логах апача тоже PHP Warning: Module 'curl' already loaded in Unknown on line 0
Я кстати раньше замечал это, но не обращал внимания, вроде не мешало.
Предлагаю ОПу как обычно обоссать меня и подсказать как это исправить.
Это наверное надо что-то поправить в php.ini, только не знаю что. Может я его два раза прописал?
А хороший фреймворк этот yii2. Другие молчат в тряпочку, а этот отслеживает такие вещи, выбрасывает исключения знаешь ли.
А, уже разобрался, действительно модуль был 2 раза подключен. На убунте какая-то странная структура кофигов php.
Файлов php.ini не счесть, так еще в папке /etc/php5/mods-available для каждого модуля отдельный файл. Черт ногу сломит.
> блаблабла я девочка
и что? Тут половина треда девочки, по крайней мере в душе, зачем в каждом посте напоминать?
>>609883
Процесс установки Юи 2 описан в документации https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/start-installation.md
Какой из вариантов ты делаешь? На каком шаге проблемы?
> а вот сама папка фреймворка не разворачивается
Что значит не разворачивается? архиватор не может распаковать архив? При открытии в браузере какого-то URL (какого?) Апач выдает ошибку 403?
Лезть в конфиг Апача может и не надо, а вот если ошибку выдает Апач, то стоит посмотреть в логе Апача подробности.
>>609885
Нет подробностей = нет советов
>>609888
> '/^8([0-9]{3}-()\\s)([0-9]{5}-()\\s)$/'; - так не работает.
У тебя там 9 цифр всего разрешено в номере (включая восьмерку).
> так работает, но нет ограничения на количество цифр в номере.
Да, надо его добавить. Можно сделать такую регялрку: сначала 8 или +7, за ними ровно 10 цифр между которыми любое число пробелов, скобок, минусов.
>>609892
Да, названия все ужасные. Ну и сам Битрикс с 3-мерными массивы типа $DASDAD['USER']['RIGHTS']['CAN_SOMETHING'] это ад (еще и капс-локом зачем-то). Люди делают популярную CMS а о читабельности и удобстве не задумываеися. Видимо студентам которые они набирают не до этого: им бы сессию сдать.
>>609940
Погугли по тексту ошибки https://www.google.ru/search?q=PHP+Warning:+Module+%27curl%27+already+loaded&newwindow=1&gbv=1&sei=mqZ5VoCCJsrmywOv6YTADg
Пишут что причина в том что расширение (curl) уже вкомпилировано в PHP и ты пытаешься второй раз его загрузить через php.ini
> А хороший фреймворк этот yii2. Другие молчат в тряпочку, а этот отслеживает такие вещи, выбрасывает исключения знаешь ли.
Это не он, это PHP.
> блаблабла я девочка
и что? Тут половина треда девочки, по крайней мере в душе, зачем в каждом посте напоминать?
>>609883
Процесс установки Юи 2 описан в документации https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/start-installation.md
Какой из вариантов ты делаешь? На каком шаге проблемы?
> а вот сама папка фреймворка не разворачивается
Что значит не разворачивается? архиватор не может распаковать архив? При открытии в браузере какого-то URL (какого?) Апач выдает ошибку 403?
Лезть в конфиг Апача может и не надо, а вот если ошибку выдает Апач, то стоит посмотреть в логе Апача подробности.
>>609885
Нет подробностей = нет советов
>>609888
> '/^8([0-9]{3}-()\\s)([0-9]{5}-()\\s)$/'; - так не работает.
У тебя там 9 цифр всего разрешено в номере (включая восьмерку).
> так работает, но нет ограничения на количество цифр в номере.
Да, надо его добавить. Можно сделать такую регялрку: сначала 8 или +7, за ними ровно 10 цифр между которыми любое число пробелов, скобок, минусов.
>>609892
Да, названия все ужасные. Ну и сам Битрикс с 3-мерными массивы типа $DASDAD['USER']['RIGHTS']['CAN_SOMETHING'] это ад (еще и капс-локом зачем-то). Люди делают популярную CMS а о читабельности и удобстве не задумываеися. Видимо студентам которые они набирают не до этого: им бы сессию сдать.
>>609940
Погугли по тексту ошибки https://www.google.ru/search?q=PHP+Warning:+Module+%27curl%27+already+loaded&newwindow=1&gbv=1&sei=mqZ5VoCCJsrmywOv6YTADg
Пишут что причина в том что расширение (curl) уже вкомпилировано в PHP и ты пытаешься второй раз его загрузить через php.ini
> А хороший фреймворк этот yii2. Другие молчат в тряпочку, а этот отслеживает такие вещи, выбрасывает исключения знаешь ли.
Это не он, это PHP.
>Пока Ваш сайт не станет беспокоить Вас не передних страницах, я не стал бы волноваться.
>На вскидку, похоже на муху в PHP, а таковые - всегда есть были и будут в логах PHP/Apache/MySQL.
>Если нет ничего подозрительного в логах посещения сайта, не вижу причин для волнений.
Лысый человек тупой, или ему просто не хотелось долго и нудно расписывать клиенту как исправить эту ситуацию, поэтому отмазался увлекательной историей про "муху"?
Разобрался уже.
>Это не yii2 выбрасывает исключение, это PHP.
Та не, этот ворнинг о повторном подключении модуля у меня в логах апача появляется только при перезагрузке, а юй орет красными буквами каждый раз при запросе к странице. Делал на слиме, никаких сообщений не отображалось (да-да, они у меня отключены).
И это же ворнинг, а не исключение, исключение бросает именно уй yii\base\ErrorException
Ну и уж точно 500 статус отдает не php.
На гугл это ты хорошо делаешь что посылаешь, чтобы люди учились самостоятельно решать проблемы. Но с большой долей вероятности гуглер наткнется не на правильный ответ, а на кулстори про муху >>609967
Вообще для себя сделал вывод, что нужно забыть про рунет.
Кто не знает английского, срочно учите, потому что на русском языке вообще нет материалов.
Кстати ты изучаешь jQuery, а ты прочел полезные замечания перед задачами? https://gist.github.com/codedokode/ce30e7a036f18f416ae0#dom--jquery
Там например написано как из объекта jQuery получить DOM элемент.
> а meta[property=og:image] выдает syntax error, поэтому приходится брать значение атрибута в кавычки.
Из-за двоеточия наверно. Тут написано
https://drafts.csswg.org/selectors-3/#attribute-selectors
> Attribute values must be CSS identifiers or strings. [CSS21]
strings заключается в кавычки ( http://www.w3.org/TR/CSS21/syndata.html#strings ). Посмотрим определение identifiers:
http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
> In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F".
Таким образом без кавычек можно писать только идентификаторы. Двоеточие надо либо экранировать
[name=og\:image]
(возможно бекслеш придется написать дважды так как он спецсимвол в строчном литерале JS) либо писать кодом
[name=og\123456 image]
либо в кавычках
[name="og:image"]
Проще всегда ставить кавычки, по моему.
> А как узнать, что элемент принадлежит форме? Некоторые элементы типа button вполне могут быть не привязаны к форме, находиться вне ее (неё?).
Вообще есть DOM-свойство form указывающее на DOM элемент формы:
if (input.form) ...
> Если элемент лежит внутри формы, он однозначно к ней относится? Если так, тогда
Да, хотя в HTML5 появился атрибут (Не путай с DOM свойством! Аналогично DOM свойство value и атрибут value это разные вещи с разным смыслом) form для связи элемента с формой явно: http://htmlbook.ru/html/input/form
Но в этой задаче не требуется проверять что элемент принадлежит форме.
Задача про вывод картинок верная. Заметь что эти задания очень практичные - тебе может понадобиться извлечь какую-то информацию например из таблицы на странице, и тут надеюсь тебе пригодится полученный опыт.
> names = names.sort();
sort это мутатор, он не создает новый массив, а сортрует на месте. Ну-ка перечитай список методов массивов и создают ли они новый массив.
В общем, верно. В этой и предыдущей задаче для извлечения массива атрибутов, возможно, стоило бы использовать map:
http://api.jquery.com/map/
http://api.jquery.com/jquery.map/
Кстати ты изучаешь jQuery, а ты прочел полезные замечания перед задачами? https://gist.github.com/codedokode/ce30e7a036f18f416ae0#dom--jquery
Там например написано как из объекта jQuery получить DOM элемент.
> а meta[property=og:image] выдает syntax error, поэтому приходится брать значение атрибута в кавычки.
Из-за двоеточия наверно. Тут написано
https://drafts.csswg.org/selectors-3/#attribute-selectors
> Attribute values must be CSS identifiers or strings. [CSS21]
strings заключается в кавычки ( http://www.w3.org/TR/CSS21/syndata.html#strings ). Посмотрим определение identifiers:
http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
> In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F".
Таким образом без кавычек можно писать только идентификаторы. Двоеточие надо либо экранировать
[name=og\:image]
(возможно бекслеш придется написать дважды так как он спецсимвол в строчном литерале JS) либо писать кодом
[name=og\123456 image]
либо в кавычках
[name="og:image"]
Проще всегда ставить кавычки, по моему.
> А как узнать, что элемент принадлежит форме? Некоторые элементы типа button вполне могут быть не привязаны к форме, находиться вне ее (неё?).
Вообще есть DOM-свойство form указывающее на DOM элемент формы:
if (input.form) ...
> Если элемент лежит внутри формы, он однозначно к ней относится? Если так, тогда
Да, хотя в HTML5 появился атрибут (Не путай с DOM свойством! Аналогично DOM свойство value и атрибут value это разные вещи с разным смыслом) form для связи элемента с формой явно: http://htmlbook.ru/html/input/form
Но в этой задаче не требуется проверять что элемент принадлежит форме.
Задача про вывод картинок верная. Заметь что эти задания очень практичные - тебе может понадобиться извлечь какую-то информацию например из таблицы на странице, и тут надеюсь тебе пригодится полученный опыт.
> names = names.sort();
sort это мутатор, он не создает новый массив, а сортрует на месте. Ну-ка перечитай список методов массивов и создают ли они новый массив.
В общем, верно. В этой и предыдущей задаче для извлечения массива атрибутов, возможно, стоило бы использовать map:
http://api.jquery.com/map/
http://api.jquery.com/jquery.map/
> То через пять строк я уже не буду помнить, какая переменная обычная, а какая jqery, к какой из них можно применить метод attr например. Можно конечно насильно потом пропустить через $(...)
Лучше не смешивать в коде их. А например стараться использовать в основном jQuery объекты. Ну и еще могла бы помочь jsDoc ( http://usejsdoc.org/about-getting-started.html ):
/xx
x @param {jquery} a
x @param {Node} b
x/
function doSmth(a, b)
Увы, в JS нет тайп-хинтов как в PHP. Но есть версия Typescript с типизацией:
function doSomething(a: jquery, b: Node) {
Она при компиляции проверяет типы и не даст передать что-то не то.
Как видишь, использование $ это что-то вроде костыля вместо тайп-хинтов или типизации. Если это простой код завязанный на jquery, может это и оправданно, но в общем мне эта идея не нравится. Потому что непонятно как выделять объекты других классов.
По задаче:
> div.views-count_post
Div наверно тут лишний, не несет никакой пользы
> // к числу привести, или к строке?
без разницы мы все равно это выводим в консоль
В общем, решено верно.
> То через пять строк я уже не буду помнить, какая переменная обычная, а какая jqery, к какой из них можно применить метод attr например. Можно конечно насильно потом пропустить через $(...)
Лучше не смешивать в коде их. А например стараться использовать в основном jQuery объекты. Ну и еще могла бы помочь jsDoc ( http://usejsdoc.org/about-getting-started.html ):
/xx
x @param {jquery} a
x @param {Node} b
x/
function doSmth(a, b)
Увы, в JS нет тайп-хинтов как в PHP. Но есть версия Typescript с типизацией:
function doSomething(a: jquery, b: Node) {
Она при компиляции проверяет типы и не даст передать что-то не то.
Как видишь, использование $ это что-то вроде костыля вместо тайп-хинтов или типизации. Если это простой код завязанный на jquery, может это и оправданно, но в общем мне эта идея не нравится. Потому что непонятно как выделять объекты других классов.
По задаче:
> div.views-count_post
Div наверно тут лишний, не несет никакой пользы
> // к числу привести, или к строке?
без разницы мы все равно это выводим в консоль
В общем, решено верно.
Насчет typescript, это майкрософт делает расширение JS для проверки типов, смотри как интересно: http://www.typescriptlang.org/Tutorial
Там и синтаксис для классов есть.
прочем на практике не стоит его использовать, так как не все его знают, да и нужен этап компиляции.
>У тебя там 9 цифр всего разрешено в номере (включая восьмерку).
Ничего не меняется, если я пишу и вот так:
'/^8([0-9]{3}-()\\s)([0-9]{7}-()\\s)$/';
Сейчас пока сделал вот так всё, с помощью массива и очистки номера, как мы делали, когда палиндром очищали: http://ideone.com/VoniLC
Ещё сейчас сделаю проверку всех возможных номеров из твоей пасты, ещё попробую поставить \\d и \\D в регулярку. В принципе, это вообще может быть выходом, не подумал сразу.
>> так работает, но нет ограничения на количество цифр в номере.
>Да, надо его добавить. Можно сделать такую регялрку: сначала 8 или +7, за ними ровно 10 цифр между которыми любое число пробелов, скобок, минусов.
Буду пробовать, спасибо.
Мне очень нужно стать материально обеспеченным. Я не хочу подрабатывать и дальше горе-дизайнером и "контент-менеджером" на фрилансе. Хочу обладать полезными знаниями которые хорошо оплачиваются. Съехать от родителей и начать уже самому нормально развиваться.
20 лет. Немного учил джаваскрипт, ушел не так далеко от Hello, world!, где-то в районе калькуляторов и какое из вводимых чисел больше (можно смеяться). Совсем школьником игрался с сайтом, но это больше с подгоном картинок, цветами и перераспределением кнопочек. Понимаю, что от школьного уровня далеко не ушел, но немного позанимавшись недавно почувствовал, что именно этим я бы и хотел жить. Может меня привлекло то, что PHP учить немного легче, ну и что с этого? Единственная проблема - не могу нормально начать заниматься. Передо мной стоит стена, которая постоянно мне мешала, только в этот раз я очень хочу через неё пробиться.
В общем, тут сидите Вы, люди которые этим уже живут, занимаются просто для себя или зарабатывают на жизнь. Прошу Вас обосрать меня, подбодрить или быть реалистами.
Спасибо.
>В общем, тут сидите Вы, люди которые этим уже живут и зарабатывают на жизнь
кек
Тут кроме опа-дровосека нет грамотных разрабов. Из тех кто работает хоть где-то только пара говночистов битрикса и вордпресса.
>Единственная проблема - не могу нормально начать заниматься
Ты ждешь что сейчас кто-то скажет что-то волшебное, и ты "начнешь нормально заниматься"?
Скорее всего это один файл на который стоят ссылки. Также для удобства у каждого расширения свой конфиг.
Тебе стоит стараться не править системные конфиги, а сделать свой и дописывать свои параметры туда. Тогда сразу будет видно где твое, а где не твое.
Более того, странно что у тебя такая ошибка, неужели это во встроенных конфигах что-то неправильно?
>>609969
В слиме может быть костыль вставлен или ты запускал его когда ошибки не было.
> исключение бросает именно уй yii\base\ErrorException
Фреймворки часто преобразуют ошибки/варнинги в исключения.
> Но с большой долей вероятности гуглер н
Я проверил что ищется по моей ссылке
> Кто не знает английского, срочно учите,
хорошая мысль
Нет. Жду то, о чем просил в самом конце. В волшебные слова и таблетки не верю.
> -()\\s
Что это значит? Что оно должно делать?
> с помощью массива и очистки номера,
Чтобы лучше изучить регулярки, сделай проверку без очистки.
Также, твой код ничего не пишет в этом случае - почему? http://ideone.com/QLmdqk
>>609985
В этом треде мы изучаем PHP. Мы не занимаемся мотивацией и не оказываем психологическую поддержку. Не хочешь учить - стой перед стеной дальше.
>Что это значит? Что оно должно делать?
Так не обращать внимание на разные знаки: минус, скобка вправо, скобка влево, пробел.
Это я делал до того, как стал просто от них очищать номер.
Я вот не пойму, почему я не могу в регулярке их просто указать и тут же указать количество возможных цифр - не работает это у меня, как ни вертел.
>Чтобы лучше изучить регулярки, сделай проверку без очистки.
Вот у меня застопорилось как раз на этом месте: не могу указать количество цифр вместе с лишними символами. Просто не пойму, что я ещё не учитываю, всё же вроде указываю...
>Также, твой код ничего не пишет в этом случае - почему? http://ideone.com/QLmdqk
Да, там можно поставить 8|+7 в начале регулярки, из массива убрать "+".
Но опять же проблема с количеством символов остаётся в простом виде, который я сначала сделал и который не учитывает количество цифр.
>Да, там можно поставить 8|+7 в начале регулярки, из массива убрать "+".
Аа, нет, так тоже не работает...
Тупость моя не знает границ, однако...
ты что-то не так понял
> [0-9]{3}-()\\s
Это значит: ровно 3 цифры, за ними минус, за ними ровно один пробельный символ.
А как же скобки? Скобки тут спецсимвол и просто группируют пустое пространство внутри. Надо писать \\( чтобы указать символ скобки
> Вот у меня застопорилось как раз на этом месте: не могу указать количество цифр вместе с лишними символами. Просто не пойму, что я ещё не учитываю, всё же вроде указываю..
Ты не понял как работают выражения. Конструкция
AB
значит «A, за которой идет B»
A|B значит «либо A либо B»
[...] значит «любой один из символов в скобках»
Круглые скобки помогают группировать конструкции:
(A|B)C - A или B, за ними идет C
AB+ = А, за ней одна или больше B: ABBB
(AB)+ = ABABABAB
Перечитай-ка урок.
ты что-то не так понял
> [0-9]{3}-()\\s
Это значит: ровно 3 цифры, за ними минус, за ними ровно один пробельный символ.
А как же скобки? Скобки тут спецсимвол и просто группируют пустое пространство внутри. Надо писать \\( чтобы указать символ скобки
> Вот у меня застопорилось как раз на этом месте: не могу указать количество цифр вместе с лишними символами. Просто не пойму, что я ещё не учитываю, всё же вроде указываю..
Ты не понял как работают выражения. Конструкция
AB
значит «A, за которой идет B»
A|B значит «либо A либо B»
[...] значит «любой один из символов в скобках»
Круглые скобки помогают группировать конструкции:
(A|B)C - A или B, за ними идет C
AB+ = А, за ней одна или больше B: ABBB
(AB)+ = ABABABAB
Перечитай-ка урок.
Не пойму в чем ошибка. Можно делать операции непосредственно в echo?
Можно так реализовать:
$a = $word1 [mt_rand(0,3)];
$b = $word1 [mt_rand(0,6)];
$c = $word1 [mt_rand(0,9)];
echo "$a $b $c";
но зачем объявлять лишние переменные и плодить строки кода.
>Тебе стоит стараться не править системные конфиги, а сделать свой и дописывать свои параметры туда.
А куда сохранить этот файл, чтобы php его "подцепил"? В ту же папку, что и главный php.ini? Он лежит в /etc/php5/apache2/
Если да, то под каким именем?
>Более того, странно что у тебя такая ошибка, неужели это во встроенных конфигах что-то неправильно?
Да нет, это я наверное неправильно что-то сделал. Гуглил, бездумно выполнял советы дебилов из гугла. Вот наверное одним из советов было "прописать что-то в php.ini". Сделал, не заработало. Пошел дальше гуглить, сделал по другому "рецепту". Заработало. Но теперь стало выдавать ошибку о том, что модуль подключен два раза.
Сейчас уже разобрался, действительно в php.ini было
extension=/usr/lib/php5/20121212+lfs/curl.so
И в файле /etc/php5/mods-available/curl.ini
; configuration for php CURL module
; priority=20
extension=curl.so
Приоритет еще какой-то, господи.
Короче удалил строку из главного php.ini, вроде ошибка пропала. Но чувствую себя бабуином. Неужели нигде нет четенькой инструкции по настройке веб-сервера? Я где-то выше спрашивал, но никто не обратил внимания на пост >>608572
Полный список настроек - в документации.
Апач:
https://httpd.apache.org/docs/2.4/configuring.html
https://httpd.apache.org/docs/2.4/mod/
PHP: мануал http://php.net/manual/ru/ini.php
Mysql: my.ini http://dev.mysql.com/doc/refman/5.7/en/option-files.html
На digital ocean бывают полезные краткие туториалы, например https://www.digitalocean.com/community/tutorials/how-to-configure-the-apache-web-server-on-an-ubuntu-or-debian-vps
> А куда сохранить этот файл, чтобы php его "подцепил"
посмотри главный файл, там скорее всего есть инструкция, которая подключает конфиги из папки с именем заканчивающимся на .d - в нее можно и класть.
> Можно делать операции непосредственно в echo?
Нет
> в чем ошибка
PHP видит только переменную, то есть
echo "... $word1 ... ";
И думает что ты пытаешься вывести массив. надо так:
echo ".. {$word1[$index]} ... ";
Но любые выражения там писать нельзя. Мануал http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
Понял, спасибо.
http://ideone.com/XxRlmP - вот что у тебя бы получилось в таком случае.
Я реализовал через array_rand неделю назад: http://ideone.com/JelkIk
И нахрен я это запостил? Только всё удовольствие обломал анону.
Извините, не буду так больше делать.
Ты хотел помочь, спасибо. А еще я узнал новую инструкцию.
Плачу сижу...
Какой же я тупоооооой...
В третий раз перечитываю http://archive-ipq-co.narod.ru/l1/regexp.html и не могу я сделать эту ссаную проверку номера со скобками, дефисами и пробелами, как надо...
Никак я не пойму, как сделать, чтобы в регулярном выражении искались все указанные символы, но чтобы регулярка учитывала количество цифр...
Без подсказки не судьба...
Перечитал подсказки ОПа мне - снова расплакался, потому что я ни хера не понимаю уже...
Без рефлексии пожалуйста, у нас тут не тред оказания психотерапевтической помощи.
Подскажи, пожалуйста, какая регулярка нужна для этой задачи:
>Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — праивльный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).
Выше делал ерунду с проверкой через массив с очисткой номера от ненужных символов, но как-то можно сделать через саму регулярку.
Вот как это можно сделать? Никак не додумаюсь.
>Подскажи, пожалуйста, какая регулярка нужна для этой задачи:
Та, которая отфильтровывает неправильные телефонные номера.
Какую-нибудь совсем прозрачную подсказку прошу - как минимум.
'/^8|\\+7((\\d{10}-\\(\\)\\s)?$/' - вот почему не работает это?
Как вообще указать в регулярке, что символ должен находиться в любом месте текста?
Как избавиться от последовательности, которая образуется, когда символы один за другим указываешь? Всё заключать в скобки?
>Как вообще указать в регулярке, что символ должен находиться в любом месте текста?
Наверное никак, но от тебя это и не требуется.
Это же очевидно. Перечитай http://learn.javascript.ru/closures затем попробуй решить и не забудь проверить в проверялке http://dkab.github.io/jasmine-tests/
Что же требуется от меня? Как я могу знать, сколько скобок может поставить юзер? Может, он поставит не код в скобки, а сам номер?
(new yii\web\Application($config))->run();
Разве нельзя было взять в переменную, а потом у этого объекта вызвать метод?
>>610283
Почему если не получается заработать денег их не выдают просто так?
Ну вот предположим пользователь может ввести либо 911 либо (911) и оба этих номера должны быть правильными. Очевидно, что эту скобка должна идти в регулярке перед и после этих цифр с указанием повторений от нуля до одного раза "{0,1}" либо короткий вариант "?" что означает, что она может быть, а может и не быть в тексте. То есть конкретно для случая выше мне нужно будет написать регулярку вида:
//(?911//)?
Доступно объяснил?
Потому что и ты не поможешь мне с регуляркой, и большинство тех, кто прошёл эти задачи, не помогут тебе.
Тут только ОП и пара анонов могут помочь. Остальные просто пройдут мимо.
А всё потому, что ты и сам не помоагешь мне с регуляркой.
Круговорт.
Так там точно так же и "-" может идти, как быть в этом случае? Для всех возможных элементов в номере это прописывать?
Это доступно, спасибо. Но это я и так делал, такие дела.
>Так там точно так же и "-" может идти, как быть в этом случае?
Для этого есть [] только не забудь про экранирование, особенно тире, которое внутри квадратных скобок, если её не экранировать, будет означать символьный класс.
Слеш не в ту сторону.
>>610293
Это простая задача, нечего здесь помогать. Прочитай еще раз теорию, пятый, десятый если нужно.
Программирование это умение думать логически (и изредка абстрактно).
Ты должен грамотно сформулировать условие задачи, это уже половина решения.
С этим номером телефона следующая ситуация:
8-(911)-506 56 56
Сначала идет либо цифра 8, либо +7. Если ты читал теорию, то ты знаешь, что в регулярных выражениях есть оператор "или". И оп выше в треде тебе его писал.
Дальше дефис, он может быть, а может не быть. В регулярных выражениях есть оператор "символ слева может быть один раз либо 0". Если ты читал теорию...
Дальше скобка открывающая может быть, может не быть.
Дальше ровно три цифры. Если ты читал теорию, ты знаешь, как указать количество подряд идущих символов.
Затем скобка закрывающая может быть, может не быть.
Затем дефис может быть, может не быть. Затем 7 цифр, между которыми могут быть пробелы, а могут не быть.
Хорошо, спасибо.
Я просто запутался и стал думать, что нужно отслеживать ввод скобок в любом месте номера.
Также всё равно туплю с дефисами и пробелами - ведь они могут быть в любом месте основного номера.
Но тут уже буду разбираться сейчас.
У меня гипертестируемость уже.
Я смотрю, многие делают задачи и даже не парятся, работает или не работает правильно.
Необязательно. Если расположить дефис в начале или конце, то он будет воспринят как есть. [-az] либо a, либо -, либо z.
Круглые скобки внутри квадратных тоже не нужно экранировать.
Когда я сомневаюсь, нужно ли что-то экранировать, я это экранирую. Так надежнее и вреда никакого.
Я когда сомневаюсь, смотрю документацию. Но это дело вкуса конечно.
решил побыстрому написать краулер, пилю второй день, такова прохладная:
всплыла хуева туча подводных
ссылки оказалось могут быть типа
#
..
/sasay
sasay
http://sasay
причем ссылки типа http тоже могут быть внешними, ебанись дрючился с регулярками/ифами
дак вот, вроде работает, удивляюсь как получилось не запутаться среди десятков форичей/ифов O_o сейчас смотрю код, зверею нах, невозможно полностью его понять как-бы, а ток мелкими кусочками, это норма вообще?
притом стараюсь код комментировать (отбивать tabami/пробелами не пошло чет, notapad и так подсвечивает где закрывается }
нуна функции юзать или как?
или это просто скрипт сам пос ебе трудоемкий?
cлава аллаху вроде как пашет :)
вопрос в нагрузку (внимание возможно выйти из стоя):
есть массив со ссылками
паршу по ним ссылки
как автоматом зациклить, тоесть
чтобы парсились ссылки по ссылкам, патом ссылки по найденным ссылкам и так далее
зы: обезьяна ебучая, стремная капча из 80х опять
решил побыстрому написать краулер, пилю второй день, такова прохладная:
всплыла хуева туча подводных
ссылки оказалось могут быть типа
#
..
/sasay
sasay
http://sasay
причем ссылки типа http тоже могут быть внешними, ебанись дрючился с регулярками/ифами
дак вот, вроде работает, удивляюсь как получилось не запутаться среди десятков форичей/ифов O_o сейчас смотрю код, зверею нах, невозможно полностью его понять как-бы, а ток мелкими кусочками, это норма вообще?
притом стараюсь код комментировать (отбивать tabami/пробелами не пошло чет, notapad и так подсвечивает где закрывается }
нуна функции юзать или как?
или это просто скрипт сам пос ебе трудоемкий?
cлава аллаху вроде как пашет :)
вопрос в нагрузку (внимание возможно выйти из стоя):
есть массив со ссылками
паршу по ним ссылки
как автоматом зациклить, тоесть
чтобы парсились ссылки по ссылкам, патом ссылки по найденным ссылкам и так далее
зы: обезьяна ебучая, стремная капча из 80х опять
> найди готовую библиотеку
библиотека === готовый скрипт (если по простому), верно?
них не нашел, какие то отрывочные вскукареки на ТОСТЕРЕ и ХАБРА_ОБЩЕСТВЕ_ГОМОСЕКОВ из гугла - результата не дали
>Нет времени
постарайся уж пояснить мань, больше мне обсудить всю эту малафью нескем
попробую патом толкнуть его за доширак, каким-нить лалкам-сеошникам))
Это не скрипт трудоёмкий, это ты переменные называешь как 15л етний мудак.
Например https://packagist.org/packages/symfony/dom-crawler
>>610352
Чтобы скрипт исполнялся по расписанию, используй cron (не знаю, есть ли версии для винды).
a) планировщик cron
б) функция sleep в бесконечном цикле
https://secure.php.net/manual/ru/function.sleep.php
ньюфаг пишуший краулер
>б) функция sleep в бесконечном цикле
По моему извращение какое-то. Всё-таки пхп это не жаваскрипт.
бегает по ссылкам из массива START
1) сохраняет внешние
2) по внутренним переходит и сохраняет с них внешние
нужно чтобы по внешним ссылкам переходил и делал шаг 1) 2) и так дрючился себе
пока пришло в голову, только добавлялить сразу внешние ссылки в конец массива START
(незнаю сработает или нет)
а также сохранять их все в левый txt а в самом конце почтить дубли
нужно это например, челу из web который просил парсер мыл с германских сайтов (подключив крайлер он мог бы очень нехуевинько расширить базу таргетов для парсинга, за пару кликов)
Увидевшие эту регулярку сойдут с YMA: http://ideone.com/2vUD2N
Все номера из пасты ОПа рассматривает правильно.
Дошло только тогда, когда стал каждый шаг в создании регулярки проверять, такой вот тугодум.
Не нужно брать каждый символ в квадратные скобки.
Квадратные скобки (символьный класс) - это список символов, которые могут находиться на данной позиции.
/4[5c8#y]9/ означает "сначала должна идти 4, на второй позиции один любой символ из перечня 5с8#y, третьим символом должна быть девятка".
Регулярка длинная и нечитабельная из-за копипасты.
Повторяющиеся куски можно нужно заменить на (повторяющийся набор символов){кол-во повторов}.
Смотри, после кода страны и города идут 7 цифр, между которыми могут быть скобки, дефисы или пробелы.
Опиши одну такую комбинацию, а потом просто укажи, что она повторяется 7 раз.
("дефис от 0 до 1 раза", "открывающая скобка от 0 до 1 раза", "закрывающая скобка от 0 до 1 раза", "цифра 1 раз"){7}
Что-то внутри меня бунтует против объявления переменных без указания типа данных и пока кажется странным синтаксис языка.
Вот в таком выражении:
>{1}
нет никакого смысла. Выражение ищется ровно один раз по умолчанию что с этим квантификатором, что без него. И не нужно городить вот такие регулярки:
[abc]\\)?[abc]\\)?[abc]\\)?
Когда можно обернуть повторяющийся код в скобки и поставить после него квантификатор:
([abc]\\)?){3}
Тебе надо получше разобраться в регулярках, так как пока ты их не понимаешь. Не беда, если будешь решать все задачи, то разберешься.
Те возможности, что есть в регулярках, описаны в уроке. Тебе надо подумать как их применить к твоей задаче.
> Как вообще указать в регулярке, что символ должен находиться в любом месте текста?
Никак. Но ты можешь сделать конструкцию такого вида:
AX?B
Это значит символ A, за ним может идти один символ X, а может не идти, за ним символ B. Таким образом эта регулярка найдет текст AB и AXB.
> '/^8|\\+7((\\d{10}-\\(\\)\\s)?$/' - вот почему не работает это?
Потому что ты ставишь символы наугад, не пытаясь даже разобраться как это работает. Давай попробуем разобрать эту регулярку. Во-первых тут видна конструкция A|B, то есть регулярка ищет соответствие одному из выражений:
^8
или
\\+7((\\d{10}-\\(\\)\\s)?$
Это явно неправильно, ты должен был использовать круглые скобки чтобы сгруппировать 8 и +7 вместе.
Первое выражение ищет любой текст где в начале стоит восьмерка. Второе чуть сложнее, давай разберем и его. Оно ищет такую последовательность:
- +7
- за ней идет ошибочная конструкция, так как в ней 2 открывающих скобки и только одна закрывающая. Если мы уберем лишнюю скобку, получится:
\\+7(\\d{10}-\\(\\)\\s)?$
Выражение в скобках \\d{10}-\\(\\)\\s ищет такую последовательность символов:
- ровно 10 цифр
- один минус
- одна откр. скобка
- одна закр. скобка
- один пробельный символ
Но после скобок стоит знак вопроса - значит их содержимое может быть, а может не быть в тексте. Поулчается все выражение \\+7(\\d{10}-\\(\\)\\s)?$ ищет либо:
+7 в конце строки
+7, за ней 10 цифр, за ними минус, скобки, пробел и конец строки
Выглядит как случайный набор символов. Такое ощущение, что ты просто наугад их ставишь в надежде что оно заработает. Так ничего не получится. Надо разбираться в регулярных выражениях и понимать все конструкции, которые описаны в уроке.
Я думаю, что для начала мы можем упростить задачу. Попробуй написать такие регулярки:
- начало строки, далее 8 или +7, за ними ровно 10 цифр, за ними конец строки
Эта регулярка ищет номера вида 81234567890, то есть написанные без лишних символов.
- После этого напиши другую регулярку, которая ищет текст содержащий любое число минусов, пробелов, скобок в любом порядке вроде "- - ()-"
- После этого напиши регулярку, которая ищет ровно 3 цифры, между которыми может быть любое число пробелов, минусов, скобок
После этого попробуй объединить эти регулярки в ту, что проверяет номер на правильность.
Если что-то непонятно, задавай конкретные вопросы. Также, пробегись по уроку и убедись что ты понимаешь все описанные там конструкции.
И не проси готовых ответов, так ты ничему не научишься.
Тебе надо получше разобраться в регулярках, так как пока ты их не понимаешь. Не беда, если будешь решать все задачи, то разберешься.
Те возможности, что есть в регулярках, описаны в уроке. Тебе надо подумать как их применить к твоей задаче.
> Как вообще указать в регулярке, что символ должен находиться в любом месте текста?
Никак. Но ты можешь сделать конструкцию такого вида:
AX?B
Это значит символ A, за ним может идти один символ X, а может не идти, за ним символ B. Таким образом эта регулярка найдет текст AB и AXB.
> '/^8|\\+7((\\d{10}-\\(\\)\\s)?$/' - вот почему не работает это?
Потому что ты ставишь символы наугад, не пытаясь даже разобраться как это работает. Давай попробуем разобрать эту регулярку. Во-первых тут видна конструкция A|B, то есть регулярка ищет соответствие одному из выражений:
^8
или
\\+7((\\d{10}-\\(\\)\\s)?$
Это явно неправильно, ты должен был использовать круглые скобки чтобы сгруппировать 8 и +7 вместе.
Первое выражение ищет любой текст где в начале стоит восьмерка. Второе чуть сложнее, давай разберем и его. Оно ищет такую последовательность:
- +7
- за ней идет ошибочная конструкция, так как в ней 2 открывающих скобки и только одна закрывающая. Если мы уберем лишнюю скобку, получится:
\\+7(\\d{10}-\\(\\)\\s)?$
Выражение в скобках \\d{10}-\\(\\)\\s ищет такую последовательность символов:
- ровно 10 цифр
- один минус
- одна откр. скобка
- одна закр. скобка
- один пробельный символ
Но после скобок стоит знак вопроса - значит их содержимое может быть, а может не быть в тексте. Поулчается все выражение \\+7(\\d{10}-\\(\\)\\s)?$ ищет либо:
+7 в конце строки
+7, за ней 10 цифр, за ними минус, скобки, пробел и конец строки
Выглядит как случайный набор символов. Такое ощущение, что ты просто наугад их ставишь в надежде что оно заработает. Так ничего не получится. Надо разбираться в регулярных выражениях и понимать все конструкции, которые описаны в уроке.
Я думаю, что для начала мы можем упростить задачу. Попробуй написать такие регулярки:
- начало строки, далее 8 или +7, за ними ровно 10 цифр, за ними конец строки
Эта регулярка ищет номера вида 81234567890, то есть написанные без лишних символов.
- После этого напиши другую регулярку, которая ищет текст содержащий любое число минусов, пробелов, скобок в любом порядке вроде "- - ()-"
- После этого напиши регулярку, которая ищет ровно 3 цифры, между которыми может быть любое число пробелов, минусов, скобок
После этого попробуй объединить эти регулярки в ту, что проверяет номер на правильность.
Если что-то непонятно, задавай конкретные вопросы. Также, пробегись по уроку и убедись что ты понимаешь все описанные там конструкции.
И не проси готовых ответов, так ты ничему не научишься.
> В чем смысл подобной "оптимизации"?
не знаю, наверно не хотят загрязнять глобальные переменные или желание не создавать ссылку на объект в переменной, чтобы к нему нельзя было обратиться напрямую.
> Разве нельзя было взять в переменную, а потом у этого объекта вызвать метод?
Можно
>>610313
Хорошая мысль. Но в квадратных скобках всего несколько спецсимволов требующих экранирования и их можно запомнить, вот они
\ ^ [ ] -
>>610324
Не надо парсить DOM регулярками, используй DOM + XPath или библиоткуи вроде phpQuery
не надо писать код работы с курлом напрямую, используй какую-нибудь библиотеку-HTTP клиент
Не надо писать простыню кода, разбивай на функции
Называй переменные нормально
делай проверку вызовов функций на ошибки.
Вместо fopen/fwrite/fclose есть file_put_contents
Тебе бы надо сам язык подучить сначала, потому что иначе выходит плохо читаемый код с ошибками. ты читал мануал по curl_exec?
> В чем смысл подобной "оптимизации"?
не знаю, наверно не хотят загрязнять глобальные переменные или желание не создавать ссылку на объект в переменной, чтобы к нему нельзя было обратиться напрямую.
> Разве нельзя было взять в переменную, а потом у этого объекта вызвать метод?
Можно
>>610313
Хорошая мысль. Но в квадратных скобках всего несколько спецсимволов требующих экранирования и их можно запомнить, вот они
\ ^ [ ] -
>>610324
Не надо парсить DOM регулярками, используй DOM + XPath или библиоткуи вроде phpQuery
не надо писать код работы с курлом напрямую, используй какую-нибудь библиотеку-HTTP клиент
Не надо писать простыню кода, разбивай на функции
Называй переменные нормально
делай проверку вызовов функций на ошибки.
Вместо fopen/fwrite/fclose есть file_put_contents
Тебе бы надо сам язык подучить сначала, потому что иначе выходит плохо читаемый код с ошибками. ты читал мануал по curl_exec?
>>>610372
братишки, поч так?
https://ideone.com/weWPtu
нуна добавлять в конец массива значения (изнутри этого массива), так нельзя?
Разумеется, обратную связь надо учитывать. Если ты посмотришь историю, то увидишь что у некоторых паст уже куса правок и дополнений.
>>610363
Отрицательных паддингов не бывает.
Отрицательные маргины - можно. А зачем они тебе понадобились? Они точно нужны или ты хочешь сделать костыль потому что не понимаешь как работает CSS? Если второе, советую порешать наши задачки на HTML/CSS из ОП поста, они может помогут разобраться.
>>610372
Спамер? катись-ка в /wrk отсюда. Если кто-то рассылает спам значит он продает никому не нужную ерунду которую кроме него берут из того же источника и продают еще 50 человек и спам ему вряд ли поможет.
Справедливости ради, кроме нелегальных спамеров есть еще и так называемые легальные - например фейсбук, твиттер. Они рассылают бессмысленные уведомления («знакомы ли вы с ололошем ололошевым?» или «почитайте этих интересных блогеров из госдепа») ради того чтобы люди кликали по ним, переходили на сайт и накручивали посещаемость (больше просмотров = больше денег от рекламы).
Вторые ничем не лучше первых. Вообще, это интересно как «белые» компании перенимают «черные» методы. Аналогично некоторые «белые» программы от яндекса или мейл ру используют почти «черные» методы распространения, в довесок к какой-нибудь программе.
Спасибо, ОП, я как раз шёл по предложенному тобой сейчас алгоритму: постепенно и посимвольно проверял работу разных конструкций в регулярном выражении. Думаю, стоило бы этот алгоритм и в урок добавить - направление для обучения регуляркам.
>>610397
Спасибо, уясню это и чуть позже попробую сократить, теперь это уже всё понятно.
>>610399
Да, это осталось, забыл поменять на [\\d{3}]?
Про повторяющийся в регулярке код теперь знаю, спасибо.
не годится. Слишком длинная регулярка, я не могу ее прочесть и проверить правильнгая ли она или нет. Да и ты сам наверно не можешь.
Код не должен быть таким. Код должен быть простым чтобы сразу было видно правильный он или нет.
Попробуй использовать тут повторение, чтобы убрать копипасту.
Ну например выражение
ABCABCABC
можно заменить на
(ABC){3}
{3} значит выражение в круглых скобках повторяется 3 раза.
Далее:
- [\\s]? - это то же самое что \\s?, квадратные скобки нужны когда мы хотим написать «один из указанных символов», а у тебя всего 1 символ и есть
- [\\s]?[\\-]?[\\s]?[\\(]? - тут квадратные скобки лишние, это равноильно \\s?-?\\s?\\(?. Но и так слишком длинно. Попробуй заменить это на такое выражение:
«любое число пробелов, скобок, минусов в любом порядке»
[0-9]{1} - то же самое что [0-9], писать еще {1} никакого смысла нет.
не годится. Слишком длинная регулярка, я не могу ее прочесть и проверить правильнгая ли она или нет. Да и ты сам наверно не можешь.
Код не должен быть таким. Код должен быть простым чтобы сразу было видно правильный он или нет.
Попробуй использовать тут повторение, чтобы убрать копипасту.
Ну например выражение
ABCABCABC
можно заменить на
(ABC){3}
{3} значит выражение в круглых скобках повторяется 3 раза.
Далее:
- [\\s]? - это то же самое что \\s?, квадратные скобки нужны когда мы хотим написать «один из указанных символов», а у тебя всего 1 символ и есть
- [\\s]?[\\-]?[\\s]?[\\(]? - тут квадратные скобки лишние, это равноильно \\s?-?\\s?\\(?. Но и так слишком длинно. Попробуй заменить это на такое выражение:
«любое число пробелов, скобок, минусов в любом порядке»
[0-9]{1} - то же самое что [0-9], писать еще {1} никакого смысла нет.
> забыл поменять на [\\d{3}]?
Неправильно. Внутри квадратных скобок { и } не имеют специального значения. Выражение
[\\d{3}]
значит «одна любая цифра или одна любая фигурная скобка»
неа
>Если кто-то рассылает спам значит он продает никому не нужную ерунду
смотрите, кажется очередной маня-мирок лопается :)
а вдруг предлагает услуги для организаций (оборудование/аутсорс), да что угодно может быть
интернет магазин по продаже трав уведомляет что готов продавать травы производителей
производитель уведомляет интернет магазины что готов поставлять им травы
взаимовыручка, всем хорошо
Это именно спам. Если у тебя есть интересное предложение для компании, ты не парсишь мыла без разбора, ты заходишь на сайт компании, осмысленно выбираешь нужный адрес и шлешь индивидуальное предложение.
А когда ты шлешь шаблонное сообщение на все мыла без разбора - это спам.
Алсо статья по теме с точки зрения того кто этот спам получает: http://habrahabr.ru/company/mosigra/blog/272287/
> интернет магазин по продаже трав уведомляет что готов продавать травы производителей
Ох лол, какое уникальное предложение. Интуиция подсказывает мне что есть еще 20 точно таких же магазинов которые перепродают товар одного и того же производителя. Раз они взялись за спам, значит не очень-то нужны их услуги. Потому что если бы они были нужны их бы находили через гугл или может контекст.
в foreach только 1 значение выводится
stout посмотри
https://ideone.com/weWPtu
а должно быть 2, в массив же добавили значение в конец, а форич его не выводит
задача: все как в примере - добавлять значения в массив (изнутри массива)
https://ideone.com/L7cKDc Всё добавляется. То, что у тебя foreach Не выводит добавленное значение, то так и должно быть, ведь на момент запуска цикла там было лишь одно значение.
Что там за ересь? Чего квадратные скобки там делают в имени массива?
Я был зарегистрирован на хабре и много лет они не рассылали никакого спама. Но в определенный момент, они выросли и начали нанимать (видимо) менеджеров по развитию. Что делает такой менеджер первым делом? Правильно, начинает рассылать спам. Это самый простой способ накрутить посещаемость и создать видимость полезности своей работы. Да и ничего другого они все равно ничего не умеют.
Хабр начал рассылать спам под видом писем «смотрите какие интересные статьи вышли на этой неделе». Вы что, дауны? Если бы я хотел почитать ваши статьи, я бы зашел и почитал.
Это именно спам, как не смотри. Они рассылают мне то, что я никогда не просил мне присылать. Почему их не вносят в черные списки?
Конечно, методы борьбы тут нужны в первую очередь технические. Нужно сделать какую-то кнопку вроде «никогда не показывать письма от этого получателя».
Также хорошо бы переделать почтовый протокол - чтобы всякие организации не могли делать рассылки без предварительного согласия пользователя.
лалка такой) тебе 16 лет?
понимаеш пытаться всю эту хуйню подгрести под свое сформировавшееся мнение, это глупо и ты всегда будеш неправ, все ситуации очень разные
например у тебя есть интерент магазин и нет бюджета, как вариант, иначе соснешь у богатеньких еблоидов
и вручную это накладно/не возможно
>>610498
ну охуеть теперь)
ты мимо пхп-макака проспамся по 500к организациям, посмотрим станеш нужен или нет (скорее всего да)
споры уровня б
>>610507
просто иди нахуй)
>>610506
все верно, я сразу делал var_dump()
задача: добавлять/выводить в массив ссылки, появившееся внутри этого массива
>ведь на момент запуска цикла
ну поидее массив по порядку перебирает и во время выполнения в конец добавляются значения, по логике должен их тоже обработать
Ну так используй обычный цикл for и внутри после добавления элемента уменьшай счетчик на 1. Правда этот метод не подходит для ассоциативных массивов.
Ты же школьник судя по посту. Что ты забыл в нашем треде? Уходи в /wrk. Это тред про прграммирование, а не про рассылку спама.
научи спамить. как кнопки автоматом тыкать? вроде есть какое-то приложение в браузере?
> у тебя есть интерент магазин и нет бюджета
Обычно дело не в этом, а в том что у тебя нет ничего уникального. Кроме тебя есть еще 20 человек которые предлагают то же самое с тем же уровнем сервиса. Потому и никаких причин выбрать тебя нету.
Что и подтверждает мою изначальную идею что спамом занимаются те кто пытаются впарить никому не нужные услуги и товары. И скорее всего их конкуренты готовы предложить эти же товары дешевле, у них лучше сервис и тд.
Например я покупаю товары в интернет-магазинах и я нахожу их без всякого спама. Просто они предлагают более удобные и выгодные условия, чем их конкуренты.
да похуй мне на эти рассылки. хз почему у тебя так бомбит срака.. просто краулер пишу (а про емейлы написал - как пример использования краулера на практике)
можно не емейлы, а данные какие-то типо отзывов парсить или создать свою поисковую систему например
>>610532
нах тебе спамить? я новичок, но чем могу помогу конечно
temper data в лисе, запускаеш - заполняеш форму - перехватыеш (смотриш какие переменные нужно заполнить)
посылаеш на ссылку которая в action пост/гет запрос с заполненными переменными они же поля и кнопка сама щелкается
сори что написал иди нахуй, прост показалось что ты агришся
так можно добавлять значения в массив (они добавятся в конец) - в специалисте показывал учитель эту фишечку
Написал небольшой скрипт который работает со сторонним api. Посылается запрос с id объекта, в ответе - информация об этом объекте. Один запрос - один ответ с информацией об одном объекте. Так вот, нужно иметь возможность получать информацию о нескольких десятках\сотнях объектах за раз.
Через jqeruy я сделал последовательный перебор по массиву с id, где рекурсивно вызывается функция которая запускает через ajax скрипт который по переданному id получает инфу об объекте через апи. При успешном выполнении ajax снова вызывается эта функция, но уже со след id в массиве, пока они не закончатся. В принципе, все работает. Но меня терзают смутные сомнения, что это немного не правильно, выполнять это на стороне клиента(через ajax). Верно? Или лучше выполнять все на стороне сервера? И как это делается? Насколько я понимаю нужно как-то разбивать скрипт на отдельные подскрипты, ведь на хостинге время выполнения одного скрипта обычно ограниченно минутой-две, а задержки при запросах и при большом количестве объектов вообще могут занимать очень много времени. Как вообще решаются такие задачи на стороне сервера?
вот этому мудрецу чая,
через for рили работает
https://ideone.com/weWPtu
а анти-спам кун, лучше прячся под шконку, найду и заспамлю нах, бу!
В общем то многое из написанного адекватно, но вот это...
> Н.Касперская:
> ....
> Более того, сейчас всё переходит на шифрованное соединение, и сайты типа Фейсбука не передают свой сертификат государству. Вообще говоря, передача сертификатов государству, мне кажется, должна стать их обязанностью, если они работают на территории страны. Пусть передают свой сертификат и продолжают работать.
Вообще, конечно ситуация не очень правильная. Человек регистрируется в фейсбуке, и вся его информация идет в США, доступна американским службам, а нашим - нет. Обидно. Но ведь если передать сертификат государству, лучше не станет. Теперь данные будут доступны сразу 2 спецслужбам - и у них и у нас, с точки зрения пользователя это хуже.
Как с этим бороться? Есть только один способ. Надо создавать отечественные сервисы, и избегать использования американских технологий вроде cloudflare, adsense или google analytics. Ну к примеру, вконтакте - при его использовании NSA остается с носом (хотя раньше там по моему стояли иностранные системы аналитики, но я уже плохо помню. сейчас вроде нет).
Анон, посоветуй где почитать про CSS. Хочу научиться верстать.
Т.е. когда я пишу какой-то html, потом описываю какой то css, блоки уезжают не туда куда я хочу. Начинаю тыкать всякие float:left и тд.
Что почитать, чтобы знать что вот этот блок мне нужно сюда, значит я должен написать вот это и тд.
СПС.
htmlbook.ru,
htmlacademy.ru, http://softwaremaniacs.org/blog/category/primer/ ,
https://gist.github.com/codedokode/58ebc90bd006baf4b35c
Поддвачну вопрос. Но больше интересуют всякие мастерские трюки и методы хорошей верстки. Быдловерсткой владею достаточно уверенно, могу даже сверстать с макета, но времени уходит довольно много, и порой приходится использовать какие-то костыли. Короче, хочется поднять свой уровен.
>«никогда не показывать письма от этого получателя».
Вроде на Яндекс.Почте такое появилось недавно. Плюс тупо можно отписаться от новостей и оповещений сайта.
>htmlbook.ru,
Ой, бля. Задрачив азбуку до дыр ты нихуя не станешь образованным интеллектуалом.
бот?
>>610590
https://2ch.pm/wrk/res/415040.html (М)
конкретно тут https://htmlacademy.ru
прям за пару дней врубишся
610590-кун
https://github.com/someApprentice/Students/
https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L38-L39
Это правильно?
>>607098
>$someMapper = new SomeMapper($pdo);
У тебя было написано, что TableDataGateway что-то напоминающие DataMapper, значит ли это что в него можно также передавать параметр $pdo?
И еще: Его обязательно создавать сразу после настроек автозагрузки?
Мне так стыдно за свою наглость. Я просто хотел побыстрей выучить php
То-то я смотрю, на срилансе количество заказов вроде перенести сайт со сранного викса на вордпресс становится все больше и больше.
>на хостинге время выполнения одного скрипта обычно ограниченно минутой-две
чтобы выключить лимит времени
в шапку
set_time_limit(0);
https://github.com/francoispluchino/composer-asset-plugin
Вроде позволяет загружать фронтенд-пакеты типа jquery или bootstrap через композер.
Но не понятно как ими пользоваться, они же попа дают в папку vendor. Может у композера появляется еще какая-то команда для "публикации" этих ассетов?
Нет, все неправильно.
> https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L4
> extends TableDataGateWay {
Gateway, а не GateWay - будь внимательнее. На линуксе имена файлов чувствительны к регистру и твой код не заработает.
> protected $student;
>\tprotected $hash;
>\tprotected $salt;
>\tprotected $token;
зачем в классе для работы с БД эти свойства? Что они должны хранить?
Я тебе специально напомню что TDG это не объект который хранит информацию о одном студенте. Это объект который их загружает и сохраняет в базу в любых количествах.
Если проводить аналогии, представь порт. Корабль - это база данных. Модель студента - это контейнер с грузом. TDG это кран, который погружает и разгружает контейнеры.
> \tprotected $errors = array();
зачем это тут?
> public function __construct($student, $hash, $salt, $token) {
Объясни, почему нам для создания TDG нужно передать эти 4 переменные. Ты передаешь студента в конструктор - значит твой класс может сохранить в базу только одного этого студента? Какое-то странное решение. Не лучше ли сделать класс который может многократно сохранять и загружать данные?
> https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L37
> public function getPdo() {
Это неправильно. PDO это зависимость класса StudebntGateway.
Во-первых, почему класс TDG сам пытается создавать свои зависимости, а не получает их например через конструктор? Перечитай ка урок про DI: https://gist.github.com/codedokode/e1d31a31b37d5f635057
Во-вторых, файл init.php нельзя подключать второй раз. Это же инициализация, она делается только один раз в самом начале.
Также, ты читал урок про паттерны работы с БД? Там есть пример реализации класса Gateway: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md#table-data-gateway
Сравни пример со своим кодом.
> И еще: Его обязательно создавать сразу после настроек автозагрузки?
Не обязательно. Но мне кажется что в init.php его создавать удобнее так как это делается один раз и не надо копипастить код создания в несколько разных мест.
Ну и я не вижу никакой наглости, просто надо понимать что у меня сейчас очень много дел и я могу не успеть ответить. И соответственно задать вопросы ты всегда можешь, но гарантий что на него сразу ответят, нет. Потому организуй свою работу так, чтобы не зависеть от этого. В реальной работе программиста такое часто бывает, что например старший разработчик занят или уехал, и не может оперативно ответить на вопрос.
Нет, все неправильно.
> https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L4
> extends TableDataGateWay {
Gateway, а не GateWay - будь внимательнее. На линуксе имена файлов чувствительны к регистру и твой код не заработает.
> protected $student;
>\tprotected $hash;
>\tprotected $salt;
>\tprotected $token;
зачем в классе для работы с БД эти свойства? Что они должны хранить?
Я тебе специально напомню что TDG это не объект который хранит информацию о одном студенте. Это объект который их загружает и сохраняет в базу в любых количествах.
Если проводить аналогии, представь порт. Корабль - это база данных. Модель студента - это контейнер с грузом. TDG это кран, который погружает и разгружает контейнеры.
> \tprotected $errors = array();
зачем это тут?
> public function __construct($student, $hash, $salt, $token) {
Объясни, почему нам для создания TDG нужно передать эти 4 переменные. Ты передаешь студента в конструктор - значит твой класс может сохранить в базу только одного этого студента? Какое-то странное решение. Не лучше ли сделать класс который может многократно сохранять и загружать данные?
> https://github.com/someApprentice/Students/blob/master/app/Model/Gateway/StudentGateway.php#L37
> public function getPdo() {
Это неправильно. PDO это зависимость класса StudebntGateway.
Во-первых, почему класс TDG сам пытается создавать свои зависимости, а не получает их например через конструктор? Перечитай ка урок про DI: https://gist.github.com/codedokode/e1d31a31b37d5f635057
Во-вторых, файл init.php нельзя подключать второй раз. Это же инициализация, она делается только один раз в самом начале.
Также, ты читал урок про паттерны работы с БД? Там есть пример реализации класса Gateway: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md#table-data-gateway
Сравни пример со своим кодом.
> И еще: Его обязательно создавать сразу после настроек автозагрузки?
Не обязательно. Но мне кажется что в init.php его создавать удобнее так как это делается один раз и не надо копипастить код создания в несколько разных мест.
Ну и я не вижу никакой наглости, просто надо понимать что у меня сейчас очень много дел и я могу не успеть ответить. И соответственно задать вопросы ты всегда можешь, но гарантий что на него сразу ответят, нет. Потому организуй свою работу так, чтобы не зависеть от этого. В реальной работе программиста такое часто бывает, что например старший разработчик занят или уехал, и не может оперативно ответить на вопрос.
У тебя должен быть организован пайплайн, то есть какие-то скрипты которые собирают и склеивают статику. Заодно можно решить и другие задачи: минификация, генерация PNG для SVG, склеивание спрайтов, и тд.
Обычно для этого используют gnunt, gulp (новее). Я всегда использовал самописные bash скрипты, по моему они лучшеи удобнее, а у описанных выше инструментов неадекватный способ конфигурирования, но популярен именно gulp.
В том же Юи есть вроде assets которые позволяют «опубликовать» файлы из непубличных папок.
О боже, нужно ведь всего лишь скопировать несколько файлов из закрытой директории в публичную, даже тут столько мороки.
Про юи знаю, именно он меня заставил поставить плагин для композера. Я думал, что теперь можно спокойно ставить все фронтенд пакеты в любом самописном проектике, на слиме например. А тут оказывается нужно опять пердолиться с какими-то непонятными грунтами/гульпами, либо писать баш-скрипты.
Ну офигеть теперь.
Тогда возвращайся в каменный век и скачивай библиотеки руками, как индус.
А! Вспомнил. В композере есть хуки. Ты можешь назначить вызов php скрипта после любой установки или обновления пакетов. Соответственно можешь попробовать на коленке слепить скрипт публикации файлов.
https://getcomposer.org/doc/articles/scripts.md
Какие-то настройки, связанные с тем куда и что копировать, можно засунуть в сам composer.json
Так не идентичную же копию сделать, а просто сделать похожий сайт. Хотя я еще ни одного нормального сайта сделанного на том же виксе менеджером васяном не видел. Все они выглядят как говно, которые раньше клепали школьники на юкозе.
Чё ты обзываешься, питер пен бесхвостый?
Надо будет, разберусь и в грунтах, и в исходных кодах линукса.
Только мне почему-то кажется неадекватным усложением для решения задачи копирования файлика из одной папки в другую пользоваться двумя менеджерами пакетов и самописными говноскриптами.
парсер с сохранением какой-то там структуры, и шоб в excel нах, 15$
гей-шлюха-кун уссыкается от смеха наверное
Ха. Это верно практически для любой задачи.
Если бы было так все просто, то я бы уже давно стал миллионером нихуя при этом не делая.
Ты просто не хочешь ничего делать. Чтобы зарабатывать на этом рынке надо быть умнее и гибче других. Либо брать и выполнять сотнями такие заказы (100 × 15 = $1500, а ведь это предварительная цена), либо собирать и перепродавать их за меньшие деньги.
Либо учись и занимайся чем-нибудь поинтеллектуальнее.
Да, похуй вообще. Маленький опыт - значит никакого опыта. Просто начинай ебашить, если не бросишь, то работу всегда найдешь.
Так я и не про себя писал. С заказами проблем нет, но из-за ебучей лени не получается нормально работать . Просто имел в виду, что это самое дно, таким заниматься. В начале еще можно, но потом. А свою ахуительную арифметику 100 × 15 = $1500 оставь наивным новичкам мечтающим начать зарабатывать в интернете. Я уж и не говорю про то, что в 90% таких "проектах" заказчики конченные долбоебы-перекупы, и с которых кроме геморроя нихуя не заработаешь.
мимо-макак-срилансер
а, кажется понял: типа на сайте конкурентов выложены в табличном виде каталоги их продукции
и этот чел хочет чтобы кто-то извлек это дело и схоронил в ексель.
это в общем-то действительно не сложно, и тот очкозавр указал 2 дня специально с запасом, явно можно сделат быстрее
меня больше всего напрягает во фрилансе, что нужно больше потратить времени чтобы понять чего хочет заказчик.
вот я отвечаю на мутное задание, выставляю от фонаря цену и срок, потому что не ебу чего от меня хотят.
ок, заказчик со мной выходит на связь и говорит: я тебя выбрал потому что ты самый лучший/дешевый.
а я такой: да я бы хотел уточнить: а чо ты собственно хочешь?
... два часа тупых препирательств
выясняется, что нужно совсем другое, на что нужно потратить в десять раз больше времени/денег, либо я вообще не могу такое сделать.
после чего заказчик в гневе ставит мне отрицательный отзыв
занавес
ОП, решил я переписать свой файлообменник сначала и убрать все лишнее\переписать все что мне кажется кривым. Комменты пока не переписал, нужно свежим взглядом все просмотреть, потому что у меня там походу знатные велосипеды понаписаны.
Интересует правильно ли я организовал работу с UserHelper'ом, он у меня взял на себя также взял функции LoginHelper'а - это правильно, или это нарушение правила single responsibility?
Ну и вообще ты говорил что у меня проблемы с архитектурой и ООП, посмотри стало ли лучше, и что еще надо изменить очень хочу закончить уже этот файлообменник ударными темпами
Из того что пока вижу надо доделать автентификацию при удалении файлов и пользователей с комментариями, и возможно доделать валидацию
у меня срака бомбанет от такого (уже бомбит)
надеюсь возьмут куда-нить на постоянку или запилю ёба -проекты свои
Маленький опыт я приплёл к тому, чтобы показать что мне не надо проходить ньюфаг учебник из шапки (может задания потягать от туда и не более, синтаксис и на пхп.нет могу выучить).
Ох, лол как же мне это знакомо. Только я обычно не довожу дело до сделки с незнакомыми мне людьми, и отзыв они поставить не могут.
Сейчас в основном работаю со старыми заказчиками, которых наработал во время фриланса.
Но это для меня скорее хобби, чем заработок денег. Но заработать можно, только бы не ленится бля.
Вот сократил с учётом рекомендаций: http://ideone.com/wzPQ7W
>Но и так слишком длинно. Попробуй заменить это на такое выражение:
>«любое число пробелов, скобок, минусов в любом порядке»
Я вдоль и поперёк прочитал страницу с уроком по регулярным выражениям, но ничего там не нашёл специфического, чтобы можно было именно таким выражением посчитать.
Эта вот конструкция не замещает такое выражение: (\\s?\\)?\\s?\\-?\\s?\\)?\\s?\\(?\\s?[0-9]){7} ?
Но никак не продумаю сокращение. Там должен \\s быть с обеих сторон от символов скобок и минуса, затем должна идти цифра.
Пробую так сделать - не работает: (\\s?(\\)?|\\-?|\\)?|\\(?)\\s?[0-9]){7}.
Суть этой конструкции: символ пробела может быть, а может и не быть, дальше могут быть или не быть или ), или (, или -, затем опять символ пробела может быть или не быть, а затем идёт цифра. Что здесь-то у меня не так?
Просто скажи мне. ладно еще контент спарсить file_get_content, но со структурой и как это в ехел конвертировать??? Ща опустим цену в 15 баксов. Допустим это будет стоить 3000 штуки баксов и срок месяца три - я бы еще мог не полениться и что-то там погуглить.
явно не в ручную сохранять, а именно прога, которая берет, парсит и сама сохраняет.
top-menu ul {
margin-top:20px;
margin-bottom:20px;
}
.top-menu li {
\tdisplay: inline-block;
\tpadding: 0px 20px;
\tlist-style-position: inside;
\tfont: 10px NexaLight;
}
.top-menu li:not(:last-child) {
border-right:1px solid #767676;
}
.top-menu li.current_page_item {
\tborder-bottom:1px solid red;
}
хочешь поговорить о стимуляции дырочек? :3
А как это делать? Находишь ссылку на странице, залазишь в базу данных, проверяешь нет ли там такой ссылки, если нет, то удаляешь?
Это обычно вирусы выводят, то есть где-то в коде сайта спрятано. А вставляют туда код через уязвимости в CMS и плагинам к ним.
По хорошему надо найти уязвимость, закрыть (например обновить компонент или сделать исправление), очистить сервер и закачать сайт заново.
>>610860
Ты не пробовал зайти на фриланс сайт и посмотреть задачи? там все опубликовано. Сделай анализ, посчитай статистику и напиши потом результаты.
>>610850
А ты CSS знаешь? Мы не делаем за других их работу.
Я сомневаюсь что человеку которому лень погуглить, кто-то заплатит даже 200 долларов в месяц, не то что 1000.
Я попробовал только что, раз уж они тут завели беседу о фрилансе.
Почти сразу наткнулся на задачу про калькулятор калорий и цен для какой-то пиццерии или закусочной. Прям как в твоем задании про гамбургеры.
Так что оказывается они довольно практичные (задобрил)
Как делается подобный пикрелейтед калькулятор?
Это оно аяксом при выборе из списка гоняет запрос на сервер, а потом джаваскриптом берет значения из формы и вычисляет результат?
А безопасно ли это? Ну вот допустим чувак выбирает фаршированную курицу, с сервера приходит какая-то цена, типа 100 рублей за 100 грамм. Куда сохранить это значение? Если куда-то в html, то хитрый юзер может взять и руками отредактировать html текущей страницы, вместо 100 рублей поставить 1 рубль и отправить заказ по такой цене.
Может в localstorage?
Кешировать ли результаты? Например юзер передумал и взял грудку индейки вместо куриной. А потом обратно куриную. Может сохранять куда-то все эти промежуточные результаты, чтобы не дергать сервер?
(я не собираюсь брать этот заказ, не стукай, мне просто интересно, в какую сторону копать, чтобы научиться такое делать)
У меня складывается впечатление что фриланс только для опытных разработчиков, без опыта там нечего ловить кроме заданий уровня наполнить контентом cms или поправить верстку. Лучше попробую устроиться в какую-нибудь скромную контору за еду и года за два прокачаться до нужного уровня, а там посмотрим.
Да, я цсс знаю, и это не работу, маня, это для партфалио. Не знаешь вордпресс, тогда нахуй иди.
Курю сейчас уроки по Laravel и вот не могу понять каким магическим образом какой то класс видит что для конструктора другого класса нужен класс3 и потом где-то ищет его реализацию и создает объект и отправляет его в тот второй класс.
Как реализуется поиск этого всего?
Посоны, никто не знает что ли? Задача ведь достаточно распространенная.
у кого-нить был опыт использования multi-curl ?
я седня приуныл и нихуя не пишу
написавший-краулер-кун, пишите если нуна кому может будет, залью
Ща, погоди, начну к вам приставать с регулярками.
Итак, нужен скрипт для проверки на ошибки, вторая задача от ОПа на регулярки.
>нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия
>«жи» или «ши» написано с буквой ы
>в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
>в тексте есть слова «а» или «но» без запятой перед ними.
>В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).
Алгоритм такой. Составляем регулярное выражение, в котором ищутся следующие сочетания символов: "\\,[а-я]", "\\;[а-я]", "\\![а-я]", "\\?[а-я]", "\\:[а-я]", "(ж|ш(ы))", "(координально|сдесь|зделал|зделаю|зделан)", "\\,а", "\\,но". Далее с помощью функции preg_split и этого регулярного выражения находим в тексте все ошибки, засовываем разбитый ими текст в массив $errors. Далее в echo нам нужно вывести соседние элементы в массиве и между ними часть регулярного выражения, которая и разбила текст на эти вот фрагменты.
Правильный ли подход?
Ни черта не работает у меня. Наверное, потому что не могу логически и абстрактно мыслить, такие дела.
>Ни черта не работает у меня. Наверное, потому что не могу логически и абстрактно мыслить, такие дела.
Нет более жалкого зрелища, чем жалеющий себя человек. Завязывай с этим, никто этого не любит.
Хочешь, я тебя пожалею?
Это я подтрунивал над словами анона, который говорил выше, что для программирования надо логически и абстрактно мыслить. У меня тупо опыта нет, я с нуля это всё прохожу, впервые столкнулся с этим, какой там "мыслить абстрактно".
>Будут больше спрашивать по sql,
>но я там так себе секу
Ну ты провалишь собеседование. От нас то ты чего хочешь? Платиновый вопрос, как выучить язк программирование за сутки? Ну никак.
Нет. Есть какой-то универсальный вопрос? Ну типа, ебаните левосторонне соединения, используя подзапросы, а еще это все после того, как создадите cte
Опиши реализацию MVCC в InnoDB, например.
Перечисли правила ACID.
Использование EXPLAIN для анализа запросов.
Нормич ебанул. Но лады.
http://ideone.com/hTlU2P - как вытащить соответствующую часть регулярки и поместить её в echo?
Я буду бампать до посинения или пока рак на горе не свистнет
http://php.net/manual/ru/function.preg-match-all.php Юзай эту функцию. Используй массив вхождений и подмаски.
Скачать файл по удаленной ссылке на свой сервер, сохранить его под другим именем и вывести ссылку на этот файл уже на своем сервере.
Все верно, если хуй забивать не будешь через два года можешь стать гуру вордпересса. Или ты хотел все и сразу? Несмотря на кажущуюся простоту и низкий порог вхождения нормальный скил появится только со временем, чем ты будешь выгодно отличаться от 95 % аудитории русского сриланса, криворуких необучаемых уебков, которые ебашат свой криворукий код, по принципу "главное чтобы хоть как-то работало", даже не утруждая себя убрать свой же закомментированный мусор или элементарно отформатировать и причесать его. Если уж решил встать на эту скользкую дорожку, то с самого начала приучай себя все делать по канонам php и апи вордпресса. Даже если на это потребуется в несколько раз больше времени. Не будь уебком! А то реально заебало после вас, хуесосов, брать такие проекты.
>то-есть сайт один и тот же
> в самом сайте сделал детект мобильного устройства в хеддере и редирект на m.site. И тут же получил удар в спину циклическую переадрессацию.
Еба, ты сам догадаешься почему тебя зацикливает?
А, ну да, точно, спасибо, через неё всё можно попробовать.
А то я навертел штyк 10 регекспов и разных массивов с preg_split. Работает, конечно, но это не дело.
bump вопросу
Я знаю почему зацикливается, но задача такая стоит - редирект на m. но второго сайта на m. с подключением к той же базе нет, то-есть в моем распоряжении только один домен.
передай с редиректом post/get перменную
if ($_POST['mobli'] = 'moblie';) { /тута пусто/}
else { /тута код редиректа (незабудь добавить передачу переменной)/}
ну не бери хуле. я вообще считаю, кто пилил сайт, тот его и должен поддерживать а ковырять чужое легаси - зашквар.
Ты че несешь вообще, поехавший? Какая база, какой домен, какие алиасы?
На домене example.com в хедере должен стоять редирект, который должен срабатывать при твоем условии, на домене m.example.com в хедере не должно быть никаких редиректов. Это единственное верное решение, вот и сделай это. А не еби мозги.
Промазал темой
https://jsfiddle.net/r9r6n0mh/1/ забыл про дату. Вот так правильнее.
Кстати, ОП, у тебя там в 15 задании написано:
>(которые являются объекты)
и еще переменная c в примере кода вроде напечатана в русской раскладке.
https://jsfiddle.net/410np1m2/ и 16 задача.
if ($var = $obj->items[$item]) ...
Но в вызове функций оно не пашет:
if (isset($var = $obj->items[$item])) ... //ошибка
Есть ли аналог? А то получаются костыли вроде:
if (isset($obj->items[$item]) && is_array($obj->items[$item]) && !empty($obj->items[$item])) ...
http://integer64.github.io/site-layout/
По 12 заданию, сделал 2 варианта:
0. С id, потому что адаптивность более проще сделать.
1. Без id, тут уже для большой универсальность, надо бы еще использовать JavaScript. Я не стал заморачиваться и сделал через position:absolute; top:192px;.
Цель - вкатиться в фриланс/удалёнку
Получается же, любой хуй может ввести код. Помню преподаватель говорил, когда я у него спрашивал, но я что-то забыл это.
Вот, например, вступление в php написано довольно доступно и с примером: http://phpclub.ru/detail/article/phpintro .
Пыху учи, время рельсов уже прошло.
прогонять через функцию, которая обрезает что-то вроде ';><
https://secure.php.net/manual/ru/function.filter-input.php
>>611715
cпасибо, для освежить голову при практике ок
Ты должен обрабатывать данные так, чтобы это было безопасно.
Нет единого способа, для каждого случая обычно свой способ экранирования.
Если ты работаешь с базой - используй подготовленные запросы и плейсходеры, никогда не вставляй данные прямо в SQL запрос!
Погугли на тему «SQL инъекции» чтобы узнать подробнее.
Тут описано про плейсхолдеры: http://habrahabr.ru/post/148701/
Если ты выводишь на страницу - используй htmlspecialchars, вот урок: https://github.com/codedokode/pasta/blob/master/security/xss.md
Если подставляешь данные в яваскрипт - используй json_encode.
>>611723
> прогонять через функцию, которая обрезает
Это в общем неправильно. Что если эти символы нужны? Алсо вырезать только указанные тобой символы недостаточно.
Не надо изобретать велоспеды - способы защиты от инъекций давно уже придуманы.
Всё вроде бы проверяет, находит и выводит.
Однако столкнулся с тем, что если пересекаются символы от предыдущей ошибки и от следующей, то не выводит символы перед ошибкой у крайней ошибки.
То есть из куска текста "Такая,знаете ли,мура" выведет "Такая,знаете" и ",мура ", если не поставить количество символов от 3 до 5 - то есть если не избежать этого пересечения элементов. Тогда получится во втором элементе " ли,мура ".
Как-нибудь можно это всё сделать более хорошо и правильно?
Да, было бы хорошо добавить обучающих материалов в шапку, часто просят. Но они должны быть качественные.
Эта статья по моему очень старая, года так из 2000. Все уже поменялось несколько раз.
По ссылке:
> В MySQL отсутствуют:
> Поддержка вложенных запросов, типа SELECT * FROM table1 WHERE id IN (SELECT id FROM table2).
Неверно. Возможно так и было, но лет 10 назад, я не знаю.
> Не реализована поддержка транзакций
Есть
> Нет поддержки триггеров и хранимых процедур.
Триггеры есть, процедуры - не знаю так как никогда не пользовался
> В нескольких словах – на PHP можно сделать все, что можно сделать с помощью CGI–программ
Что такое CGI программы? Непонятно
> <?
Надо использовать длинный тег
> PRINT "Привет, ".$_POST['name'];
htmlspecialchars
> mail($_POST['email'], $subj, $text);
Нет проверки что в email один адрес, и вообще это по сути спам-скрипт которым можно воспользоваться.
> mysql_connect
> Вот и все, коммерческий продукт практически готов.
Ну вы поняли
Да, было бы хорошо добавить обучающих материалов в шапку, часто просят. Но они должны быть качественные.
Эта статья по моему очень старая, года так из 2000. Все уже поменялось несколько раз.
По ссылке:
> В MySQL отсутствуют:
> Поддержка вложенных запросов, типа SELECT * FROM table1 WHERE id IN (SELECT id FROM table2).
Неверно. Возможно так и было, но лет 10 назад, я не знаю.
> Не реализована поддержка транзакций
Есть
> Нет поддержки триггеров и хранимых процедур.
Триггеры есть, процедуры - не знаю так как никогда не пользовался
> В нескольких словах – на PHP можно сделать все, что можно сделать с помощью CGI–программ
Что такое CGI программы? Непонятно
> <?
Надо использовать длинный тег
> PRINT "Привет, ".$_POST['name'];
htmlspecialchars
> mail($_POST['email'], $subj, $text);
Нет проверки что в email один адрес, и вообще это по сути спам-скрипт которым можно воспользоваться.
> mysql_connect
> Вот и все, коммерческий продукт практически готов.
Ну вы поняли
По запросу asset management первой ссылкой нагуглил вот такую симпатичную и судя по кол-ву установок популярную библиотеку https://github.com/kriswallsmith/assetic
Почему бы ее не использовать? Зачем такие сторонние от php вещи как grunt или gulp? Тем более я так понял они тянут за собой установку npm, и вообще это нодовские фишки.
Короче я буду использовать эту библиотечку, пока меня кто-то не переубедит.
Хочу ставить бутстрап и джейквери композером, не хочу кочать орхивы.
> Под минификацией подразумевается удаление лишних переносов и комментариев?
Не только. В случае JS там часто еще имена переменных сокращаются до 1 буквы, иногда одни конструкции преобразуются в другие. Получается нечитаемая каша, но она меньше весит.
Вообще, мне это не очень нравится например тем что затрудняет отладку. Также, если у тебя настроен сбор JS ошибок то стектрейсы будут бессмысленные типа
Error ... in function a() in line 1
я подозреваю с gzip сжатием разница между минифицированным и неминифиированнм кодом не очень большая.
Склеивание = склеивание в 1 файл ради ускорения загрузки.
Подробнее про клиентскую оптимизацию можно почитать тут:
http://ruhighload.com/index.php/2009/06/07/%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%81%D0%BA%D0%BE%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D0%B8/
http://speedupyourwebsite.ru/books/speed-up-your-website/
> Почему бы ее не использовать?
Используй, хотя если тебе надо просто скопировать 2 папки из vendor в public можно и без нее. Но полезно конечно ознакомиться.
Не забудь настроить автоматическое обновление файлов после любых действий композера. Не забудь настроить gitignore. Не забудь написать в ридми.
> Зачем такие сторонние от php вещи как grunt или gulp?
Ну они популярные просто среди фронтендщиков.
> Под минификацией подразумевается удаление лишних переносов и комментариев?
Не только. В случае JS там часто еще имена переменных сокращаются до 1 буквы, иногда одни конструкции преобразуются в другие. Получается нечитаемая каша, но она меньше весит.
Вообще, мне это не очень нравится например тем что затрудняет отладку. Также, если у тебя настроен сбор JS ошибок то стектрейсы будут бессмысленные типа
Error ... in function a() in line 1
я подозреваю с gzip сжатием разница между минифицированным и неминифиированнм кодом не очень большая.
Склеивание = склеивание в 1 файл ради ускорения загрузки.
Подробнее про клиентскую оптимизацию можно почитать тут:
http://ruhighload.com/index.php/2009/06/07/%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%81%D0%BA%D0%BE%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D0%B8/
http://speedupyourwebsite.ru/books/speed-up-your-website/
> Почему бы ее не использовать?
Используй, хотя если тебе надо просто скопировать 2 папки из vendor в public можно и без нее. Но полезно конечно ознакомиться.
Не забудь настроить автоматическое обновление файлов после любых действий композера. Не забудь настроить gitignore. Не забудь написать в ридми.
> Зачем такие сторонние от php вещи как grunt или gulp?
Ну они популярные просто среди фронтендщиков.
> https://github.com/MindiMakridi/filehosting/blob/master/composer.json#L10
> "MyModels\\": "models/"
Неудачное название. My... обычно пишут просто как пример. Тебе надо назвать неймспейс либо просто Model, либо по названию твоего приложения, например Filehost\Model\File.
> https://github.com/MindiMakridi/filehosting/tree/master/public/files
Для дополнительной надежности запрети выполнение PHP скриптов в этой папке через .htaccess. Полагаться только на него впрочем не стоит, так как на некоторых хостингах это не сработает.
https://github.com/MindiMakridi/filehosting/tree/master/public/models
Почему код в публичной папке? Удаляй.
https://github.com/MindiMakridi/filehosting/tree/master/public/thumbs
Если картинки тут генерируются автоматически, может ее в gitignore? И папку files тоже наверно (за искл. файла htaccess).
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L2
> error_reporting(0);
Объясни почему ты включил режим «игнорировать все ошибки»? Я не могу представить ни одной ситуации где нам надо было бы игнорировать ошибки. Это абсолютно неправильный код.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L4
Конфиг надо подключать без once, так надежнее
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L14
> use($userName, $pass, $host, $dbName)
Как-то нехорошо что тут столько глобальных переменных с параметрами. Надо их либо сложить в массив $config['user'], либо использовать $app->config('db.user', '12121') в конфиге. Мне кажется, удобнее всего сложить переменые в масиив.
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L23
> $app->container->singleton('maxSize'
Синглтон предназначен для объектов, а не всего попало. Для хранения макс. размера можно задействовать $app->config('maxsize') например.
Также, 1 Мб != 1000000 байт.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L40
> $files = $app->filesMapper;
> $files = $files->fetchLastUploadedFiles();
Не используй 1 переменную для хранения не связанных значений разного типа.
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L64
> $path = __DIR__ . "/files/{$id}$filename";
Что если $id = '..' ?
Что если filename = '.htaccess' ?
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L66
> $filename = mb_substr($filename, stripos($filename, $id)+strlen(strval($id)));
Почему смешиваешь mb- и не mb-функции? Я вообще не понимаю что делает эта строчка. Но интуиция мне подсказывает что искать id в имени - странная идея так как оно там может встретиться несколько раз.
Лучше это переписать через регулярку.
> header("Content-disposition:attachment;");
Зачем ; ?
> readfile($path);
Это годится на первое время, но неэффективно и надо будет переделать либо на X-SendFile, либо на трбк с htaccess.
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L81
> if(file_exists($dir."/files/".$filename)){
Мне не нравится что у тебя по всему коду разбросано получение путей. Это все надо собрать и вынести в методы в каком-то классе.
> catch (MyModels\PreviewGenerationException $e) {
> header("HTTP/1.0 500 Internal Server Error");
Зачем перехватываешь исключение? Слим сам перехватывает исключения, выводит заглушку, логгирует детали.
> die("error");
Не используй die в слиме.
> header("HTTP/1.0 404 Not Found");
В Слиме есть функция для этого
> $id = $_POST['id'];
Используй $app->request, почему используешь POST?
> catch(Exception $e){
> $app->render('error.html', array('errorMessage'=> $e->getMessage()));
Зачем пользователю показывать детали ошибки на английском языке? он их не поймет, а хакер получит ценную информацию.
Не вижу где происходит валидация данных при загрузке файла и добавлении комментария.
> https://github.com/MindiMakridi/filehosting/blob/master/models/File.php#L45
> public function setMaxSize($size){
Зачем эта функция? зачем файлу знать какой макс. размер загрузки?
> public function setPath($rootDirectory)
> $this->path = $rootDirectory . "/files/{$this->id}{$this->filename}";
это выглядит странно, если учесть что эта функция вызывается на странице просмотра файла. По логике, при просмотре файла мы ничего в нем не меняем, мы только читаем и выводим информацию из базы, верно? Тогда почему ты при просмотре файла вызываешь setPath? Почему ты при просмотре меняешь информацию? По моему это нелогично.
Также, есть такое правило:
https://github.com/codedokode/pasta/blob/master/good-code.md#Результат-функции
> Функция или метод должны либо вернуть точный и актуальный результат, либо выбросить исключение если они не могут это сделать по каким-то причинам.
Проверь все свои функции, соответствуют ли они этому правилу? Например функция getPath() в файле, она всегда вернет точный результат или только если перед этим вызвать setPath? А если не вызвать?
> public function prepareToUpload($postData, $token){
Этого не должно быть в модели файла. Модель хранит информацию о файле а не занимается копированием файлов.
> if (preg_match("/php|html/i", $extension)) {
В чем смысл этой проверки? Что если файл имеет имя example.php.llllll ? Апач тогда может воспринять его как php файл.
> throw new \Exception("No file selected", 1);
Не стоит исплоьзовать исключения для валидации. Тем более ты используешь общий класс Exception, как у тебя отличить ошибьку валидации от например ошибки PDO?
> $this->setUploadtime(date("Y-m-d H:i:s"));
Почему дату передаещь строкой, а не в общепринятом формает?
> static function generateToken()
Почему это в классе File? Алсо 10 символов слишком мало.
> https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L31
> catch (\Exception $e) {
> $this->DBH->rollBack();
Тут незачем ради 1 запроса делать транзакцию.
> throw new \Exception("Something went wrong", 1);
Ты теряешь информацию об ошибке. Вместо информации что именно не так ты выкидываешь бессмысленное сообщение. Как ты будешь исправлять ошщибку если увидишь в логе Something went wrong ?
Я вижу что ты пока не разобрался с исключениями. Это плохо. Задай уточняющие вопросы если ты что-то не понял, и переделай правильно работу с исключениями.
> https://github.com/MindiMakridi/filehosting/blob/master/models/File.php#L84
> $this->path = $rootDirectory . "/files/{$this->id}{$this->filename}";
Не надо в базе хранить полный путь от корня диска. Надо хранить в базе относительно корня сайта, так как при переносе на другой сервер пути там будут другие и все сломается.
> https://github.com/MindiMakridi/filehosting/blob/master/composer.json#L10
> "MyModels\\": "models/"
Неудачное название. My... обычно пишут просто как пример. Тебе надо назвать неймспейс либо просто Model, либо по названию твоего приложения, например Filehost\Model\File.
> https://github.com/MindiMakridi/filehosting/tree/master/public/files
Для дополнительной надежности запрети выполнение PHP скриптов в этой папке через .htaccess. Полагаться только на него впрочем не стоит, так как на некоторых хостингах это не сработает.
https://github.com/MindiMakridi/filehosting/tree/master/public/models
Почему код в публичной папке? Удаляй.
https://github.com/MindiMakridi/filehosting/tree/master/public/thumbs
Если картинки тут генерируются автоматически, может ее в gitignore? И папку files тоже наверно (за искл. файла htaccess).
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L2
> error_reporting(0);
Объясни почему ты включил режим «игнорировать все ошибки»? Я не могу представить ни одной ситуации где нам надо было бы игнорировать ошибки. Это абсолютно неправильный код.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L4
Конфиг надо подключать без once, так надежнее
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L14
> use($userName, $pass, $host, $dbName)
Как-то нехорошо что тут столько глобальных переменных с параметрами. Надо их либо сложить в массив $config['user'], либо использовать $app->config('db.user', '12121') в конфиге. Мне кажется, удобнее всего сложить переменые в масиив.
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L23
> $app->container->singleton('maxSize'
Синглтон предназначен для объектов, а не всего попало. Для хранения макс. размера можно задействовать $app->config('maxsize') например.
Также, 1 Мб != 1000000 байт.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L40
> $files = $app->filesMapper;
> $files = $files->fetchLastUploadedFiles();
Не используй 1 переменную для хранения не связанных значений разного типа.
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L64
> $path = __DIR__ . "/files/{$id}$filename";
Что если $id = '..' ?
Что если filename = '.htaccess' ?
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L66
> $filename = mb_substr($filename, stripos($filename, $id)+strlen(strval($id)));
Почему смешиваешь mb- и не mb-функции? Я вообще не понимаю что делает эта строчка. Но интуиция мне подсказывает что искать id в имени - странная идея так как оно там может встретиться несколько раз.
Лучше это переписать через регулярку.
> header("Content-disposition:attachment;");
Зачем ; ?
> readfile($path);
Это годится на первое время, но неэффективно и надо будет переделать либо на X-SendFile, либо на трбк с htaccess.
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L81
> if(file_exists($dir."/files/".$filename)){
Мне не нравится что у тебя по всему коду разбросано получение путей. Это все надо собрать и вынести в методы в каком-то классе.
> catch (MyModels\PreviewGenerationException $e) {
> header("HTTP/1.0 500 Internal Server Error");
Зачем перехватываешь исключение? Слим сам перехватывает исключения, выводит заглушку, логгирует детали.
> die("error");
Не используй die в слиме.
> header("HTTP/1.0 404 Not Found");
В Слиме есть функция для этого
> $id = $_POST['id'];
Используй $app->request, почему используешь POST?
> catch(Exception $e){
> $app->render('error.html', array('errorMessage'=> $e->getMessage()));
Зачем пользователю показывать детали ошибки на английском языке? он их не поймет, а хакер получит ценную информацию.
Не вижу где происходит валидация данных при загрузке файла и добавлении комментария.
> https://github.com/MindiMakridi/filehosting/blob/master/models/File.php#L45
> public function setMaxSize($size){
Зачем эта функция? зачем файлу знать какой макс. размер загрузки?
> public function setPath($rootDirectory)
> $this->path = $rootDirectory . "/files/{$this->id}{$this->filename}";
это выглядит странно, если учесть что эта функция вызывается на странице просмотра файла. По логике, при просмотре файла мы ничего в нем не меняем, мы только читаем и выводим информацию из базы, верно? Тогда почему ты при просмотре файла вызываешь setPath? Почему ты при просмотре меняешь информацию? По моему это нелогично.
Также, есть такое правило:
https://github.com/codedokode/pasta/blob/master/good-code.md#Результат-функции
> Функция или метод должны либо вернуть точный и актуальный результат, либо выбросить исключение если они не могут это сделать по каким-то причинам.
Проверь все свои функции, соответствуют ли они этому правилу? Например функция getPath() в файле, она всегда вернет точный результат или только если перед этим вызвать setPath? А если не вызвать?
> public function prepareToUpload($postData, $token){
Этого не должно быть в модели файла. Модель хранит информацию о файле а не занимается копированием файлов.
> if (preg_match("/php|html/i", $extension)) {
В чем смысл этой проверки? Что если файл имеет имя example.php.llllll ? Апач тогда может воспринять его как php файл.
> throw new \Exception("No file selected", 1);
Не стоит исплоьзовать исключения для валидации. Тем более ты используешь общий класс Exception, как у тебя отличить ошибьку валидации от например ошибки PDO?
> $this->setUploadtime(date("Y-m-d H:i:s"));
Почему дату передаещь строкой, а не в общепринятом формает?
> static function generateToken()
Почему это в классе File? Алсо 10 символов слишком мало.
> https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L31
> catch (\Exception $e) {
> $this->DBH->rollBack();
Тут незачем ради 1 запроса делать транзакцию.
> throw new \Exception("Something went wrong", 1);
Ты теряешь информацию об ошибке. Вместо информации что именно не так ты выкидываешь бессмысленное сообщение. Как ты будешь исправлять ошщибку если увидишь в логе Something went wrong ?
Я вижу что ты пока не разобрался с исключениями. Это плохо. Задай уточняющие вопросы если ты что-то не понял, и переделай правильно работу с исключениями.
> https://github.com/MindiMakridi/filehosting/blob/master/models/File.php#L84
> $this->path = $rootDirectory . "/files/{$this->id}{$this->filename}";
Не надо в базе хранить полный путь от корня диска. Надо хранить в базе относительно корня сайта, так как при переносе на другой сервер пути там будут другие и все сломается.
Но ни одно решение у меня не работает! Например это http://stackoverflow.com/questions/17708562/zip-all-files-in-directory-and-download-zip-generated#answer-19451938 со слегка расширенным классом. Что за нахуй вообще? Ошибок никаких нет, но после выполнения скрипта архива в папке нет! В качестве пути указываю полный путь к папке вроде /var/user/yoba/hui/pizda/djigurda
Не работаю и другие решения http://stackoverflow.com/questions/4914750/how-to-zip-a-whole-folder-using-php#answer-4914807 ЧЗХ?
if($zip->close())
{
//успех
}
Даже это условие выполняется. Но архива-то нет! Да и с права доступа проблем быть не должно, потому что другой скрипт через file_put_contents создает файлы, которые нужно заархивировать.
http://stackoverflow.com/questions/4914750/how-to-zip-a-whole-folder-using-php#answer-4914807
Если брать этот пример. Уже изучил все переменные в процессе выполнения скрипта. Все ок.
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
Рекурсивно считывает файлы в папке - чек
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
Получает имя файла и путь к файлу -чек
$zip->addFile($filePath, $relativePath);
Добавляет файл в архив - чек
$zip->close()
Корректно создает архив - чек.
Где архив бля?
потому что я еще не дошел давно проходил да и что с этими регулярными выражениями сложного? это ж как таблица умножения, просто подобрать правильно выражения, все логично и если вникнуть достаточно просто
я не тот кун, но в курсе про всю эту малафью, учитель из специалиста всё пояснял
>htmlspecialchars
да и подобное значение есть у фильт инпут вроде бы
Просто у меня проблемы были с пониманием последовательности в выражении - это и просил объяснить. В том уроке ещё конкретные примеры простые и понятные, а задачи достаточно серьёзные для новичка, я только две сделал пока что, да и то жду разгрома от ОПа.
Ох щи, там всё правильно, я подскользнулся.
>Не лучше ли собирать все в один на продакшене?
А потом ещё и обфусцировать всё. И в идеале получать ya.ru где всего 1 строчка кода, ага.
Запусти апачмонитор хоть, консоль малоинформативна.
Ещё можно для поиска учитывать пробелы с обеих сторон от тире, когда его ставят в тексте всё равно как "-". А для поиска дефиса исключать возможность пробелов с обеих сторон.
очевидно же
google => список файлов php => http://www.php.su/scandir
на выходе массив со списком, если нужны все файлы, добавь
foreach ($files1 as $value)
{
echo "$value";
}
Доступ к папке запрещен, 403 статус, forbidden.
Не знаешь не отвечай. "Очевидно", даун блять.
Это я хз, бро, сам доделываю сейчас задачи на регулярки. И не вполне себя уверенно чувствую с ними.
по твоему можно получить полный список файлов любого ресурса? читни про 403 - http://www.wikireality.ru/wiki/403_Forbidden
просто нет прав
нужно открыть папку для чтения
если нет возможности изменить права, то
1) если есть живые страницы - выдернуть все внутренние ссылки содержащие /files
2) дирбрут - по базе подставлются разные распространенные именя и проверяются ответы в заголовке (есть дофига готовых)
даун ты
Это проблемы тех, кто не хочет перекатываться. Тред уйдёт в бамплимит сегодня или завтра, все сообщения будут утеряны. Скажите спасибо Абу, который тут не хочет увеличивать бамплимиты.
Ты прав.
>>htmlspecialchars
> да и подобное значение есть у фильт инпут вроде бы
Первое нельзя заменить вторым, так что совет неправильным. Я же написал, часто бывает нужно пропускать все символы и filter_input тут не справится так как он умеет только вырезать.
Мне вообще этот filter_input не нравится тем что его суют везде не думая.
>Поясните за кодакадеми
Говнище.
>стоит ли вкатиться туда
Как хочешь, знаний там чуть больше нуля.
>лучше идти по мануалу опа?
Мануал опа лучше.
Иди ты нахуй. Запили свою имиджборду, там и увеличивал свои лимиты, дебил.
Ясн, спс.
А аналоги еще какие-нибдь есть, чтобы получше ее? Мануал опа само собой, там мемчики есть, всё для братишек.
Я где-то встречал отчет анона о том, что он какие-то ранги получает за обучение питону и жабаскрипту, там выполняет задачи и получает какие-то ачивки, что-то такое. Ну и там все языки есть, рнр тоже.
Ты можешь учиться там, хуже не будет, это известный сайт. Но последний раз когда я смотрел их курс, там был очень базовый уровень. Для ознакомления годится, но дальше придется что-то еще читать.
Ну и курс там по моему короткий, его можно за несколько дней по моему пройти, сам понимаешь что за такое время всерьез изучить целый стек веб-технологий невозможно.
Там ближе к концу больше текста. Будет время - переделаю картинки в SVG, там текст есть, если Гугл захочет, проиндексирует, нет так нет.
>>607991
Этот код все еще слишком большой. Надо упростить дальше:
> $paymentTotal = $paymentTotal + $debt;
> echo "{$month} месяц спустя: долг = {$
Это повторяется 2 раза, надо бы избавиться от повтора
>>608006
> $paymentTotal = $paymentTotal + $monthlyPayment;
> echo "($month) месяц спустя: долг = {$creditBalance} руб
Это повторяется, надо бы избавиться от повтора.
>>608016
Надо еще дальше сократить.
>>608152
Закрывающей скобки нет в конце конструктора
https://github.com/lexdss/BookShop
По ссылке ничего нету. Не могу проверить потому.
>>608301
дамп надо в проект вкладывать, и как анон написал, в ридми кратко написать как установить проект.
>>608314
Не беда, показывай код на проверку и не спеши удалять и когда руки дойдут, я тебе дам советов по улучшению.
>>608322
для этого не нужны магические методы. Надо просто передалать роутер чтобы для URL вида /cat/:something он вызывал CategoryController#showCategoryAction($slug) и передавал слуг категории (:something) в экшен. Роутер не обязан работать по фиксированной схеме когда вторым идет действие, его можно настраивать произвольно.
>>608434
По адаптивной верстке изучи теорию (@media запросы), посмотри образцы адаптивных сайтов (гугли «примеры адаптивных сайтов») и сделай сам хотя бы одну адаптивную страницу - этого хватит.
>>608455
А, хорошая книга, у меня в бумажной версии даже есть.
Доработай роутер чтобы он определял в какой папке находится и убирал из URL начало если оно совпадает с именем папки. Или просто сделай себе локальный сайт http://local.local/...
>>608800
Не знаю. В Оп посте есть книги но не для начинающих.
>>608819
> Вот как мне вывести в переменную результат функции и потом вывести в echo эту переменную?
Функция должна вернуть результат ретурном: return ...; А в месте вызова ты сохраняешь результат в переменную:
$x = func();
Перечитай мой урок про функции, там упомянут return. Важная вещь, надо разобраться.
>>608867
> Странно, что я не могу оттуда выцепить $month никак, пробовал по-разному.
Переменные которые созданы в функции (локальные), удаляютяс при выходе из нее и недоступны снаружи. А внешние (глобальные) переменные недоступны в функции. Потому все что ты хочешь передать в или из функции надо делать через аргументы в скобках или return.
Если тебе надо вернуть несколько значений из функции, собери их в массив с понятными именами ключей и верни массив через return.
>>608870
Зато градиент под цвет иконок на айфоне.
>>608903
Почитай мануал php по этим функциями и константам или погугли эти названия.
> Чему равен Q_PATH?
Надо искать место где определена эта константа через define.
Судя по вопросам, тебе рановато изучать MVC. Тебе надо сначала с основами PHP разобраться.
>>609660
5.6
>>609667
При чем тут роутер? Подумай сам куда поставить получение данных для меню, чтобы они получались в любом случае. Где-то в начале приложения наверно надо.
>>609691
Виджет это что-то вроде маленького контроллера со своим вью, и они специально для этого предназначены, так что это ок. Не ок это когда код прямо во вью лепят.
Доработай роутер чтобы он определял в какой папке находится и убирал из URL начало если оно совпадает с именем папки. Или просто сделай себе локальный сайт http://local.local/...
>>608800
Не знаю. В Оп посте есть книги но не для начинающих.
>>608819
> Вот как мне вывести в переменную результат функции и потом вывести в echo эту переменную?
Функция должна вернуть результат ретурном: return ...; А в месте вызова ты сохраняешь результат в переменную:
$x = func();
Перечитай мой урок про функции, там упомянут return. Важная вещь, надо разобраться.
>>608867
> Странно, что я не могу оттуда выцепить $month никак, пробовал по-разному.
Переменные которые созданы в функции (локальные), удаляютяс при выходе из нее и недоступны снаружи. А внешние (глобальные) переменные недоступны в функции. Потому все что ты хочешь передать в или из функции надо делать через аргументы в скобках или return.
Если тебе надо вернуть несколько значений из функции, собери их в массив с понятными именами ключей и верни массив через return.
>>608870
Зато градиент под цвет иконок на айфоне.
>>608903
Почитай мануал php по этим функциями и константам или погугли эти названия.
> Чему равен Q_PATH?
Надо искать место где определена эта константа через define.
Судя по вопросам, тебе рановато изучать MVC. Тебе надо сначала с основами PHP разобраться.
>>609660
5.6
>>609667
При чем тут роутер? Подумай сам куда поставить получение данных для меню, чтобы они получались в любом случае. Где-то в начале приложения наверно надо.
>>609691
Виджет это что-то вроде маленького контроллера со своим вью, и они специально для этого предназначены, так что это ок. Не ок это когда код прямо во вью лепят.
> Как её передать, если прямое обращение к Hamburger.SIZE_SMALL дает нам undefined?
Ты не там ее создаешь. Это надо писать сразу после функции:
Hamburger.SIZE_SMALL = 'small';
А не где ты это написал. То есть чтобы это свойство было создано до вызова функции.
>>609727
Ты ничего не изобретаешь, ты изучаешь то что изобрели другие.
>>610077
не знаю. Может у них есть мобильная версия? Если нет то нет.
https://jsfiddle.net/dp5pgo94/1/
Ок, почти верно. А что если мы укажем n больше чем число городов? https://jsfiddle.net/4akump8y/1/
> Uncaught TypeError: Cannot read property 'city' of undefined
Я думаю брать первые N лучше через slice, а потом делать цикл.
Нет, так не пойдет. Конструктор у тебя гигантский, там куча кода и я не могу это читать. Надо вынести методы вроде addTopping наружу из функции-конструктора. Также, ты каждый раз при создании объекта пересоздаешь эти методы, какой в этом чсмысл есди можно сделать их один раз на прототипе?
Мне кажется ты не читаешь учебник learn.javascript.ru внимательно. Там есть глава про прототипы - прочти и сделай методы через прототипы.
> if (size != Hamburger.SIZE_SMALL && size != Hamburger.SIZE_BIG) {
Лучше иметь список возможных размеров и проверять по нему. Так проще добавлять новые размеры и опции.
> for (var i = 0; i < this._toppings.length; i++) {
> if (topping == this._toppings) {
> throw new Error("Топинг уже добавлен");
Это надо вынести в отдельнуюфункцию так как это явно отдельное действие, поиск в массиве.
> if (this._size == Hamburger.SIZE_SMALL) {
> calories += 20;
Неудобно добавлять размеры. Сделай справочники размеров, добавок, начинок, и например каждый помести в свою функцию. Чтобы достаточно было добавить в одном месте а не лазать по всему коду.
>>610398
> Что-то внутри меня бунтует против объявления переменных без указания типа данных
Норм. У нас можно указывать тип аргументогв фукнкций, а в PHP7 еще и тип возврата и тип полей объектов.
Неправильно использовать тут while. У тебя цикл со счетчиком, для него придуман for. Зачем ты переписал его через while? Это запутывает код и требует больше времени чтобы понять как он работает. Неправильно. Код должен быть как можно более понятным и очевидным.
> while (mb_substr($text, $i, 1) == mb_substr($text, -$i -2, 1)){
А где проверка что мы дошли до середины строки?
> $i++;
> $b++;
зачем 2 одинаковых переменных?
> if ($b == $lenght - 1){
Почему -1? Комментарий бы написал хотя бы.
> (mb_substr($text, $i, 1) == mb_substr($text, -$i -2, 1)
Почему ты сравниваешь первый символ с начала со вторым с конца?
На слове «поп» не работает: http://ideone.com/eDDH16
>>610474
Строки надо писать в кавычках. Почему без кавычек?
>>610553
По хорошему тут нужна очередь фоновых задач например на gearman
>>610810
>>«любое число пробелов, скобок, минусов в любом порядке»
> Я вдоль и поперёк прочитал страницу с уроком по регулярным выражениям, но ничего там не нашёл специфического, чтобы можно было именно таким выражением посчитать.
Давай упростим задачу. Как бы ты записал «ровно один минус, скобка или пробел»? То есть один любой символ из указанных?
> Эта вот конструкция не замещает такое выражение: (\\s?\\)?\\s?\\-?\\s?\\)?\\s?\\(?\\s?[0-9]){7} ?
Нет, это не то. У тебя там заложен определенный порядок символов и слишком громоздко
По коду: выражение слишком громлоздкое и возможно ловит не все варианты. Ты пробовал подставлять все номера что я дал?
https://jsfiddle.net/dp5pgo94/1/
Ок, почти верно. А что если мы укажем n больше чем число городов? https://jsfiddle.net/4akump8y/1/
> Uncaught TypeError: Cannot read property 'city' of undefined
Я думаю брать первые N лучше через slice, а потом делать цикл.
Нет, так не пойдет. Конструктор у тебя гигантский, там куча кода и я не могу это читать. Надо вынести методы вроде addTopping наружу из функции-конструктора. Также, ты каждый раз при создании объекта пересоздаешь эти методы, какой в этом чсмысл есди можно сделать их один раз на прототипе?
Мне кажется ты не читаешь учебник learn.javascript.ru внимательно. Там есть глава про прототипы - прочти и сделай методы через прототипы.
> if (size != Hamburger.SIZE_SMALL && size != Hamburger.SIZE_BIG) {
Лучше иметь список возможных размеров и проверять по нему. Так проще добавлять новые размеры и опции.
> for (var i = 0; i < this._toppings.length; i++) {
> if (topping == this._toppings) {
> throw new Error("Топинг уже добавлен");
Это надо вынести в отдельнуюфункцию так как это явно отдельное действие, поиск в массиве.
> if (this._size == Hamburger.SIZE_SMALL) {
> calories += 20;
Неудобно добавлять размеры. Сделай справочники размеров, добавок, начинок, и например каждый помести в свою функцию. Чтобы достаточно было добавить в одном месте а не лазать по всему коду.
>>610398
> Что-то внутри меня бунтует против объявления переменных без указания типа данных
Норм. У нас можно указывать тип аргументогв фукнкций, а в PHP7 еще и тип возврата и тип полей объектов.
Неправильно использовать тут while. У тебя цикл со счетчиком, для него придуман for. Зачем ты переписал его через while? Это запутывает код и требует больше времени чтобы понять как он работает. Неправильно. Код должен быть как можно более понятным и очевидным.
> while (mb_substr($text, $i, 1) == mb_substr($text, -$i -2, 1)){
А где проверка что мы дошли до середины строки?
> $i++;
> $b++;
зачем 2 одинаковых переменных?
> if ($b == $lenght - 1){
Почему -1? Комментарий бы написал хотя бы.
> (mb_substr($text, $i, 1) == mb_substr($text, -$i -2, 1)
Почему ты сравниваешь первый символ с начала со вторым с конца?
На слове «поп» не работает: http://ideone.com/eDDH16
>>610474
Строки надо писать в кавычках. Почему без кавычек?
>>610553
По хорошему тут нужна очередь фоновых задач например на gearman
>>610810
>>«любое число пробелов, скобок, минусов в любом порядке»
> Я вдоль и поперёк прочитал страницу с уроком по регулярным выражениям, но ничего там не нашёл специфического, чтобы можно было именно таким выражением посчитать.
Давай упростим задачу. Как бы ты записал «ровно один минус, скобка или пробел»? То есть один любой символ из указанных?
> Эта вот конструкция не замещает такое выражение: (\\s?\\)?\\s?\\-?\\s?\\)?\\s?\\(?\\s?[0-9]){7} ?
Нет, это не то. У тебя там заложен определенный порядок символов и слишком громоздко
По коду: выражение слишком громлоздкое и возможно ловит не все варианты. Ты пробовал подставлять все номера что я дал?
>>«любое число пробелов, скобок, минусов в любом порядке»
> Я вдоль и поперёк прочитал страницу с уроком по регулярным выражениям, но ничего там не нашёл специфического, чтобы можно было именно таким выражением посчитать.
Давай упростим задачу. Как бы ты записал «ровно один минус, скобка или пробел»? То есть один любой символ из указанных?
> Эта вот конструкция не замещает такое выражение: (\\s?\\)?\\s?\\-?\\s?\\)?\\s?\\(?\\s?[0-9]){7} ?
Нет, это не то. У тебя там заложен определенный порядок символов и слишком громоздко
По коду: выражение слишком громлоздкое и возможно ловит не все варианты. Ты пробовал подставлять все номера что я дал?
>>610916
Либо аяксом либо заложить все данные в страницу и считать без обращения к серверу, если ты не боишься что конкуренты увидят цену и формулу расчета. Второй вариант как-то надежнее мне кажется хотя имеет недостаток: если на сервере поменять данные то клиенты до перезагрузки старницы будут видеть старые цифры. Это конечно плохо для бизнеса.
> Ну вот допустим чувак выбирает фаршированную курицу, с сервера приходит какая-то цена, типа 100 рублей за 100 грамм. Куда сохранить это значение?
Никуда
> Кешировать ли результаты?
зачем? Это сильно усложняет код, да и я не думю что у тебя будет по миллиону заказов в день обрабатываться. Запомни: кеш это костыль когда нормальные метоыд не работают, тебе он не нужен.
> , вместо 100 рублей поставить 1 рубль и отправить заказ по такой цене.
Надо оправлять на сервер не цену, а число и тип блюд, а цену считать на сервере. Тогда не обманешь.
> У меня складывается впечатление что фриланс только для опытных разработчиков
Возможно. Но ты ведь наш курс еще не прошел? Не делал файлообменник, не делал задачу на JS SPA? На SQL, на CSS, на JS?
>>«любое число пробелов, скобок, минусов в любом порядке»
> Я вдоль и поперёк прочитал страницу с уроком по регулярным выражениям, но ничего там не нашёл специфического, чтобы можно было именно таким выражением посчитать.
Давай упростим задачу. Как бы ты записал «ровно один минус, скобка или пробел»? То есть один любой символ из указанных?
> Эта вот конструкция не замещает такое выражение: (\\s?\\)?\\s?\\-?\\s?\\)?\\s?\\(?\\s?[0-9]){7} ?
Нет, это не то. У тебя там заложен определенный порядок символов и слишком громоздко
По коду: выражение слишком громлоздкое и возможно ловит не все варианты. Ты пробовал подставлять все номера что я дал?
>>610916
Либо аяксом либо заложить все данные в страницу и считать без обращения к серверу, если ты не боишься что конкуренты увидят цену и формулу расчета. Второй вариант как-то надежнее мне кажется хотя имеет недостаток: если на сервере поменять данные то клиенты до перезагрузки старницы будут видеть старые цифры. Это конечно плохо для бизнеса.
> Ну вот допустим чувак выбирает фаршированную курицу, с сервера приходит какая-то цена, типа 100 рублей за 100 грамм. Куда сохранить это значение?
Никуда
> Кешировать ли результаты?
зачем? Это сильно усложняет код, да и я не думю что у тебя будет по миллиону заказов в день обрабатываться. Запомни: кеш это костыль когда нормальные метоыд не работают, тебе он не нужен.
> , вместо 100 рублей поставить 1 рубль и отправить заказ по такой цене.
Надо оправлять на сервер не цену, а число и тип блюд, а цену считать на сервере. Тогда не обманешь.
> У меня складывается впечатление что фриланс только для опытных разработчиков
Возможно. Но ты ведь наш курс еще не прошел? Не делал файлообменник, не делал задачу на JS SPA? На SQL, на CSS, на JS?
Что в документации написано? Что гугл выдает по запросу «lavarel ioc» ?
>>611235
https://jsfiddle.net/b4zscb0s/1/
> function PowerStation(powerProduction) {
> function SolarPanel(powerProduction) {
Это же однотипные классы. Почему нет наследования? Разве не логично наследовать их от общего предка? Ты знаком с абстрактными классами, наследованием?
> this.addElements = function() {
А почему нет addElement? мне кажется по 1 добавлять гораздо удобнее так как ты выбираешь как именно и что добавлять.
Алсо где проверка что мы добавляем разрешенный элемент а не что попало?
Методы надо вынести из конструкторов в прототипы.
> if (this._elements instanceof PowerStation) {
А что если нет? Что в этом случае?
> this.getPowerProductionDuringTheDay = function() {
> this.getPowerProductionDuringTheNight = function() {
> this.getPowerConsumptionDuringTheDay = function() {
> this.getPowerConsumptionDuringTheNight = function() {
Тут копипаста, избавься. Странно ты вроде не новичок, ты не знаешь как у нас относятся к копипасте? это зло.
Вообще, я подумал что вместо 2 функций можно сделать одну и параметр для указания дня/ночи.
> resultString = "нужно закупить энергии на: ";
Это не годится. Текстовую строку нельзя обработать программно. Надо возвращать результаты в машинопонятном виде, а в текст преобразовыват уже при выводе на экран.
>>611266
> "\\,[а-я]", "\\;[а-я]", "\\![а-я]", "\\?[а-я]", "\\:[а-я]
Это можно объеинить вместе. Также, надо писать ё отдельно так как в Юникоде она идет отдельно от а-я. также, добавь латинницу и цифры. А лучше вообще использовать \\w
> "\\,а", "\\,но".
Это можно объединить. запятую экранировать не надо. Также, тут надо искать отстусиве запятой перед а, а не наличие.
> Правильный ли подход?
Нет, лучше использовать preg_match_all которая найдет все совпадения с регуляркой.
>>611302
Используй preg_match или preg_match_all, они ищут первое или все совпадения с регуляркой и помещают в массив, они описаны у меня в уроке.
>>611341
Ищи HTTP клиент
>>611366
Лучше бы адаптивную верстку.
>>611419
Не факт.
Что в документации написано? Что гугл выдает по запросу «lavarel ioc» ?
>>611235
https://jsfiddle.net/b4zscb0s/1/
> function PowerStation(powerProduction) {
> function SolarPanel(powerProduction) {
Это же однотипные классы. Почему нет наследования? Разве не логично наследовать их от общего предка? Ты знаком с абстрактными классами, наследованием?
> this.addElements = function() {
А почему нет addElement? мне кажется по 1 добавлять гораздо удобнее так как ты выбираешь как именно и что добавлять.
Алсо где проверка что мы добавляем разрешенный элемент а не что попало?
Методы надо вынести из конструкторов в прототипы.
> if (this._elements instanceof PowerStation) {
А что если нет? Что в этом случае?
> this.getPowerProductionDuringTheDay = function() {
> this.getPowerProductionDuringTheNight = function() {
> this.getPowerConsumptionDuringTheDay = function() {
> this.getPowerConsumptionDuringTheNight = function() {
Тут копипаста, избавься. Странно ты вроде не новичок, ты не знаешь как у нас относятся к копипасте? это зло.
Вообще, я подумал что вместо 2 функций можно сделать одну и параметр для указания дня/ночи.
> resultString = "нужно закупить энергии на: ";
Это не годится. Текстовую строку нельзя обработать программно. Надо возвращать результаты в машинопонятном виде, а в текст преобразовыват уже при выводе на экран.
>>611266
> "\\,[а-я]", "\\;[а-я]", "\\![а-я]", "\\?[а-я]", "\\:[а-я]
Это можно объеинить вместе. Также, надо писать ё отдельно так как в Юникоде она идет отдельно от а-я. также, добавь латинницу и цифры. А лучше вообще использовать \\w
> "\\,а", "\\,но".
Это можно объединить. запятую экранировать не надо. Также, тут надо искать отстусиве запятой перед а, а не наличие.
> Правильный ли подход?
Нет, лучше использовать preg_match_all которая найдет все совпадения с регуляркой.
>>611302
Используй preg_match или preg_match_all, они ищут первое или все совпадения с регуляркой и помещают в массив, они описаны у меня в уроке.
>>611341
Ищи HTTP клиент
>>611366
Лучше бы адаптивную верстку.
>>611419
Не факт.
Форматирование что-то печальное. Поставь нормальный редактор себе и пиши в нем.
> if(variable.length!==undefined && type!="[object Array]"){
> return "array-like";
Недостаточно. Надо бы еще проверять что length это число и что есть свойства 0, 1... А то получается так: https://jsfiddle.net/qe9aojjz/1/
Объект определяется как array-like
>>611509
В общем верно, но тут есть подвох:
> for(var key in obj){
> copy[key] = obj[key];
Если кто-то добавит в прототип Object свойство или метод, оно тоже скопируется. Потому иногда добавляют проверку через hasOwnProperty (погугли), хотя конечно лучше не расширять стандартные прототипы.
>>611518
16 задача
Нет правильного определения массив это или объект.
// Должно вернуть {a:1}, возвращает [a:1]
console.log(deepCopy({a:1}));
// Должно быть false
console.log('length' in deepCopy({}));
Вот тут ошибки.
Вообще ты молодец, мало кто до 16 задачи доходит. Надеюсь ты дальше за ДОМ и jQuery возьмешься, они очень важны.
>>611556
Это плохой код так как усложняет читаьельность. Это 2 действия и их надо писать в 2 строки.
> Но в вызове функций оно не пашет:
isset просо нужа ссылка по моему
> Есть ли аналог? А то получаются костыли вроде:
А зачем столько проверок? Ты что сам не знаешь что у тебя в переменной?
В твоем случае надо писать так, c использованием правильного ООП:
if ($obj->getCountOfItems() > 0)
Форматирование что-то печальное. Поставь нормальный редактор себе и пиши в нем.
> if(variable.length!==undefined && type!="[object Array]"){
> return "array-like";
Недостаточно. Надо бы еще проверять что length это число и что есть свойства 0, 1... А то получается так: https://jsfiddle.net/qe9aojjz/1/
Объект определяется как array-like
>>611509
В общем верно, но тут есть подвох:
> for(var key in obj){
> copy[key] = obj[key];
Если кто-то добавит в прототип Object свойство или метод, оно тоже скопируется. Потому иногда добавляют проверку через hasOwnProperty (погугли), хотя конечно лучше не расширять стандартные прототипы.
>>611518
16 задача
Нет правильного определения массив это или объект.
// Должно вернуть {a:1}, возвращает [a:1]
console.log(deepCopy({a:1}));
// Должно быть false
console.log('length' in deepCopy({}));
Вот тут ошибки.
Вообще ты молодец, мало кто до 16 задачи доходит. Надеюсь ты дальше за ДОМ и jQuery возьмешься, они очень важны.
>>611556
Это плохой код так как усложняет читаьельность. Это 2 действия и их надо писать в 2 строки.
> Но в вызове функций оно не пашет:
isset просо нужа ссылка по моему
> Есть ли аналог? А то получаются костыли вроде:
А зачем столько проверок? Ты что сам не знаешь что у тебя в переменной?
В твоем случае надо писать так, c использованием правильного ООП:
if ($obj->getCountOfItems() > 0)
>> $paymentTotal = $paymentTotal + $debt;
>>echo "{$month} месяц спустя: долг = {$
>Это повторяется 2 раза, надо бы избавиться от повтора
Ох щи, бро, ОП, разве куда-то ещё можно сократить? Там же все обязательные элементы стоят уже? Или ты имеешь в виду, что из разных частей нужно вытащить их и сделать общим для if и else? Там, где мы считаем для суммы больше, чем выплата в месяц, и там, где сумма долга меньше выплаты в месяц.
Честно говоря, не представляю, как это сделать, я в растерянности.
>>612623 >>612624
>Давай упростим задачу. Как бы ты записал «ровно один минус, скобка или пробел»? То есть один любой символ из указанных?
Например, вот так: "/^\\-|\\)|\\s$/". Но там в какой-то моменты может быть вот такое место в номере: "...9 ) - 8888..." То есть там сразу пять символов появляются, это меня запутало. Впрочем, сейчас я уже понял, как это должно выглядеть, позже переделаю. Планирую завершить регулярные выражения и снова все задачи пройти перед повторением, писать их не глядя.
>> Эта вот конструкция не замещает такое выражение: (\\s?\\)?\\s?\\-?\\s?\\)?\\s?\\(?\\s?[0-9]){7} ?
>Нет, это не то. У тебя там заложен определенный порядок символов и слишком громоздко
Да, спасибо, с этим тоже понял, как быть, - в скобках с обеих сторон пробелы, а внутри разные символы, затем уже цифры.
>По коду: выражение слишком громлоздкое и возможно ловит не все варианты. Ты пробовал подставлять все номера что я дал?
Да, все номера из твоей пасты показывает правильно.
А это ты сделал?
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
как в примере?
Алсо, у тебя включено отображение ошибок?
В мануале пишут:
> If you have created a zip file and added a file to it without error, yet the ZipArchive::close call fails (with ER_TMPOPEN: "Failure to create temporary file") and the zip file is not created, check to see if your ZipArchive::open call specifies a pathname containing nonexisting directories. If you expect a containing hierarchy of one or more directories, you must create them yourself before using using ZipArchive. You can write a simple function to recurse using dirname to find each parent directory, creating those that don't exist by using mkdir when leaving the recursion.
Апач не запускают через клик по httpd. Чтобы увидеть причины, запускай его из командной строки а не кликом. Гайд по командной строке и ответы по установке апача есть в ОП посте.
По коду в таблице utf-8 либо вставив символ.
if ($char == '-'_) ...
if ($char == "\x12\x34") ... где 12 34 - шестнадцатеричный код тире в кодитровке utf-8. Коды можно глянуть тут http://unicode-table.com/ru/
Все в новый тред >>612122 (OP)
fgp
Вы видите копию треда, сохраненную 20 января 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.