Это копия, сохраненная 2 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>612122 (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
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Не придирайся к знанию английского языка.
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Не придирайся к знанию английского языка.
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Оп исправил почти все твои замечания
http://integer64.github.io/site-layout/
Задача 10:
>>Почему width 100%?
Гугль дал такое решение для адаптивности картинок
Задача 11:
>>перемещаться с клавиатуры, клавишами Tab, Shift + Tab, стрелками, пробелом.
Реализовал, добавил для checkbox на :focus бордер тень,что бы было видно.
Задача 12:
Переделал, совсем без id у меня не получилось, надо было как то input с label связать. Может быть есть другое решение.
Связал вкладки и контент вкладок через data-атрибуты. Хотелось бы в CSS полноценные регулярные выражения, тогда решение было бы более эстетичное.
Возник вопрос по поводу длинны названия вкладки: три раза прочитал, так и не понял что требуется, разжуй пожалуйста, для самых глупеньких вроде меня.
Будет ли такая проверка однозначно устанавливать идентичность файлов при совпадении их хэшей? Алсо, если файлов много - случаются пиздец тормоза, а скрипт все-таки не бесконечно работать может.
Юкинон!
Далее попробую с помощью функций вывести кусок текста с ошибкой, а не с помощью регулярок.
>>619815
Сюка, аж в голос!... Действительно же, блиять...
Но, кстати, нет: там нам надо будет искать именно отсутствие пробела и отсутствие букв перед "а" или "но". Иначе придётся делать регулярки с другими символами (конца предложения, например) или полагаться на ту регулярку, которая просто ищет отсутствие пробела после знака препинания.
Это не по заветам ОПа.
>>619902
> без троллинга, щюточек и петросянства
Извини, но нет.
Например, стоп-слова для чата, форума или просто блога (матюки убирать либо заменять их словами "розочка" и т.п., ну ты понял). Унификация данных для платёжных систем (когда номер карты вводят с дефисами или без, а биллинг требует какого-то стандарта в передаче данных) или чтобы просто удобнее хранить его в БД. Проверка на вредоносные скрипты или спам, возможно, - регулярка не позволяет ввести <script> или http (я пока не знаю, именно ли регулярки надо использовать в этом случае).
Короче, применений много может быть.
И не такие они и сложные, кстати, проблемы у того же меня больше с массивами и циклами.
>>619907
В прошлый раз сначала перекатились, а потом ОП там отвечал.
>...маете?А в это... - Пропущен пробел перед союзом "а".
>...учает,а также... - Пропущен пробел перед союзом "а".
И в то же время:
>...маете?А в эт... - Пропущен пробел после знака препинания.
>...учает,а такж... - Пропущен пробел после знака препинания.
Короче, что-то не то у меня в регулярке опять.
А ведь только что сказал, что не так и сложно...
Аа, я торможу, это вторая регулярка с поиском отсутствия пробелов после знаков препинания находит то же самое, что нашла первая.
Надо просто исключение добавить в регулярку с поиском пробелов.
задача "на словах ты лев толстой". Вроде, всё работает, но не уверен, что такое решение просили. Посмотрите, кто-нибудь?
Перекатываал последние 8 тредов - я. ОП по традиции слоупочит. А раньше, так тред раза 3 за 900 постов уходил.
Херась, отличное решение с разными хорошими добавлениями!
>$word3 = $list3[mt_rand(0,4)];
Небольшая опечатка, там тоже 5 ведь элементов.
и правда, не заметил. Спасибо!
нет, кстати, всё же у меня было правильно: там 5 элементов - 0,1,2,3,4. В других по шесть
Аа, бро, извини, постоянно забываю об этом - что с "0" надо начинать отсчёт...
Хочу за мидла сразу сойти. Хотя знаний толком нет, но действие происходит в мухосрани, там небось все такие.
О, опять этот толстяк вылез. Это ты в прошлом треде был тянкой-мидлом, которая не могла найти работу?
Нет. Что такого толстого в вопросе о типичном собеседовании на мидла?
А зарплату тебе будут платить за то что ты собеседование прошел? Ты же понимаешь, что тебе нужно будет выполнять какие-то задачи, а если не сможешь, то пойдешь нахуй. Как ты без знаний будешь работать?
Не бейте лучше обоссыте.
Да в процессе разберусь. Я же умный программист, но с опытом в других(байтоебских) областях.
Есть куча текстовых файлов, в каждом из них на каждой новой строке есть запись вида "имя:значение".
Вопрос:
Как сделать так, чтобы открыть каждый файл, найти значение по имени, а затем по всем составить таблицу?
Потому-что нет такого индекса в GET. Продампай $_GET и посмотри что там тебе приходит в запросе.
{
margin: 0;
padding:0;
}
И самому спокойно выставлять нужныее отступы где они нужны.
На картинке с котиком: в чём отличие var_dump(); от $VAR_DUMP? о_0
Это же не константа, раз у неё знак доллара в начале?
Ну вот я например делал его 6 задание. И мне пришлось обнулять внутрнний отступ у <ul>, внешние отступы у <p> и внешние отступы у <h1>. Не легче было просто прописать вначале файла чтобы у всех элементов был нулевой отступ и самому делать их такими как мне надо, а не такими как задумано браузером?
а если у тебя не 3 тега, а 10 или 20, а может их сотня и у всех маргин 0 и паддинг 0?
Если я буду верстать страницу с четко нарисованного psd макета с конкретными размерами, то очевидно все отступы я буду брать оттуда, а не пользоваться предустановленными
Нет ни константы, ни переменной VAR_DUMP, это типа показано как не надо писать.
Вроде, сделал, что мне надо.
Только теперь надо в цикл пустить (имена файлов от 1 до 50) создание ячеек таблицы. А выходит только первый файл. ЧЯДНТ?
[CODE]<?php
for ($i = 1; $i <= 50; $i++) {
$file = $i . ".txt";
$ar = file($file);
$a = substr($ar[0], 9);
$b = substr($ar[4], 21);
$c = substr($ar[5], 6);
$d = substr($ar[3], 9);
$e = substr($ar[6], 14);
$f = substr($ar[1], 5);
echo "<table><tr><td>$a</td><td>$b</td><td>$c</td><td>$d</td><td>$e</td><td>$f</td>";
for ($i = 9; $i <= 68; $i=$i+3) {
$str = substr($ar[$i-1], 3);
$strWithoutChars = preg_replace('/[^0-9]/', '', $str);
echo "<td>" . $strWithoutChars . "</td>";
echo "<td>" . substr($ar[$i], 11) . "</td>";
echo "<td>" . substr($ar[$i+1], 14) . "</td>";
}
echo "</tr></table>";
}
?>[/CODE]
Вроде, сделал, что мне надо.
Только теперь надо в цикл пустить (имена файлов от 1 до 50) создание ячеек таблицы. А выходит только первый файл. ЧЯДНТ?
[CODE]<?php
for ($i = 1; $i <= 50; $i++) {
$file = $i . ".txt";
$ar = file($file);
$a = substr($ar[0], 9);
$b = substr($ar[4], 21);
$c = substr($ar[5], 6);
$d = substr($ar[3], 9);
$e = substr($ar[6], 14);
$f = substr($ar[1], 5);
echo "<table><tr><td>$a</td><td>$b</td><td>$c</td><td>$d</td><td>$e</td><td>$f</td>";
for ($i = 9; $i <= 68; $i=$i+3) {
$str = substr($ar[$i-1], 3);
$strWithoutChars = preg_replace('/[^0-9]/', '', $str);
echo "<td>" . $strWithoutChars . "</td>";
echo "<td>" . substr($ar[$i], 11) . "</td>";
echo "<td>" . substr($ar[$i+1], 14) . "</td>";
}
echo "</tr></table>";
}
?>[/CODE]
Строки выбираю, если ты об этом.
Просто, надо как-то сделать цикл, а он не идет.
Или, проще, как в excel'e выровнять данные, которые в столбик, в строчку? Я помню, что так можно, но забыл, как. Гугл не помог.
Ручки кривые, да и надо же на раз, чтобы вручную данные не вытаскивать.
POST-запросом через cURL отправить данные на какой-то урл с идентификационным токеном, а далее обрабоать полученный ответ-правильно я себе всё представляю?
Вкудахте вообще тухло, стаковерфло? где ещё
Петушиную свою конфу в телеграмме не предлагать, там филиал би, причем самой мерзкой его стороны.
>стаковерфло
Да, единственно адекватное и где могут реально помочь. Русскую версию не читал, но осуждаю.
Можешь ещё toster.ru попробовать, но там большая часть вопросов уровня "как вкатиться в 30 лет" и "по какой книжке учить джаву, чтобы заработать мильён", почти как pr в общем лол.
Если ответом является первая строчка в гугле-поделом.
И прочитай хотя бы одну книгу про PHP на англ.-потом сразу легче станет.
Я не ОП, но могу попробовать ответить. Что именно в индексах тебе не понятно?
Но получилось только с использованием margin у <p> по-другому вообще никак. Почему ОП написал, что нужно ее делать без margin для абзацев? Какое тогда еще может быть решение?
http://integer64.github.io/site-layout/exercise/exercise8/index.html
можешь мое решение поковырять, Оп вроде одобрил
Как правильно делать на CSS на коммерческих сайтах, картиночки справой стороны или снизу у которых текст, типа 15 лет на рынке, самая лучшая методика, профессиональные кадры и т.д., такое кажется тизерами называется, такие есть и в шаблоне ОПа, там где андроид нарисован и другие картиночки. Так вот, как их правильно делать, просто как отдельными картинками и рядом текст? Или как фоновое изображение в дивах? Стоит ли делать из них специальный текст, текст из иконок?
Решать задачу просто три раза посчитав, сказано, нельзя.
Задачу про Айфон в кредит уже сделал?
Вот вводишь решение в функцию, как у ОПа в учебнике, а потом просто для каждого банка подставляешь их переменные в вывод функции (разные проценты в месяц, разные цифры для обслуживания кредита и т.п.).
Но сначала надо дождаться ответа ОПа насчёт задачи про калькулятор кредита на Айфон.
Я что-то не помню, чтобы кто-то показывал его недавно, я бы не пропустил, потому что выМучил этот калькулятор наизусть пару недель назад.
Айфон вчера делал, только не сохранил решение и теперь надо заново делать. Логично ты расписал, сейчас вкину своё решение на айпад
Потому что в браузере много предустановленных отступов и полей: в списках, таблицах, итд. Если их все убрать, то текст со стандартными тегами будет идти сплошной стеной.
Да и быдлокодисто как-то получается. Там, где тебе надо, там и убирай.
> Если я буду верстать страницу с четко нарисованного psd макета с конкретными размерами, то очевидно все отступы я буду брать оттуда
- сколько я не видел примеров верстки с css ресетом, никто все отступы не восстаналивал
- глупо наверно сбросить отступы чтобы потом восстановить их назад на куче тегов
- дизайнер не может на макете угадать что на страницу добавят через текстовый редактор администраторы
- завтра появится какой-нибудь новый тег, и ты для него сбросишь отступы и не вернешь назад.
- послезавтра твой коллега захочет что-то добавить на страницу и будет неприятно удивлен тем что отступов нету
Потому логика тут такая: большинство сайтов динамические, тексты на них правятся редактором, значит все теги которые могут быть в них использованы должны нормально отображаться. Значит не надо отключать отступы, делать везде одинаковый размер шрифта и тд.
так подойдут или нет?
> И мне пришлось обнулять внутрнний отступ у <ul>, внешние отступы у <p> и внешние отступы у <h1>.
Надо обнулять не у всех тегов ul, а только у тех которые нужны. Так как иначе твой стиль будет влиять на ul в тексте который добавит администратор и на ul которые в будущем добавит твой коллега-верстальщик.
Надо избегать таких вещей. пиши стили так, чтобы они влияли только на твои теги, помни что твоя верстка может быть будет дорабатываться, может быть ее подключат на какую-то другую страницу и тд и надо чтобы было минимум конфликтов с другими блоками на странице.
Один из способов добвиться этого - использовать БЭМ нотацию:
<ul class="menu__list">
<li>Пункт</li>
.menu__list {
padding: 0;
}
.menu__list > li {
...
}
Вот такой стиль позволяет вставить меню в любое место страницы и не влияет на остальные элементы. Получается меню - независимый блок и это облегчает поддержку такой верстки.
В общем, старайся делать все независимыми блоками, особенно когда дойдешь до большого макета.
Если добавить в текст другие стандартные теги, то текст разваливается, нет полей слева. Исправь это: https://jsfiddle.net/rLstv59m/1/
Давай конкретные примеры. По макету из задач на CSS, делается так:
div.features
(4 раза) div.features__item
------h3 Заголовок фичи
------p Текст фичи
------p Текст фичи
Если картинка это часть дизайна сайта то делаешь фоновой картинкой. Если часть контента то img.
Например картинка новости это img. А какое-нибудь украшение которое есть на всех страниых это фон.
>>620311
Доделал задачу про айпад. Уфф, сколько пота сошло. Проверьте, кто-нибудь?
http://ideone.com/gYxgd7
>В гомо банке будем платить 12 месяцев
>В мягком банке платим 12 месяцев
>В клубничном банке платим 11 месяцев
Хм, ты совсем не понял условия!
Там надо посчитать, сколько именно денег выплатит анон во всех трёх банках, а у тебя там месяцы.
Там надо получать общую выплату - попробуй её получить для всех трёх банков.
Если поставить 1000 вместо 39999, то выдаёт, что выплачивать надо 2 месяца - значит, абсолютно неверно считает, там выплата всего 2030 рублей должна быть в один месяц.
>>620349
>>620347
>>620351
http://ideone.com/bs0K2U
теперь, вроде, всё правильно? спасибо за замечания.
У меня те же чувства вызывает задача на поиск путей. До сих пор с ужасом вспоминаю и по ночам просыпаюсь в холодном поту. Уже наверное больше года прошло.
>В мягком банке платим 60260.891466803 рублей
Нет, бро, считает неверно. Там должно получиться 61270 с копейками.
У тебя отсутствует, получается, прибавка к оставшейся небольшой не выплаченной сумме 3% от остатка (там вроде 264 рубля должно быть) и 1000 за обслуживание кредита.
Также у тебя там точка с запятой стоят за фигурными скобками. Также отсутствует часть в условии - else, там надо её поместить, иначе не по правилам.
Хм, вроде бы алгоритм там у тебя выстроен верно, всё проходит правильно, но вот считает в итоге неверно, как я пояснил.
Сам чё-то туплю, куда девается 1000р и 3% от остатка, всё же должно быть в итоге.
При этом если подставить 1000 вместо 40000 в сумму кредита - считает верно, выдаёт 2030.
Бро, сам сейчас сижу и разбираюсь, куда у тебя девается 1000р и 3% от остатка. Тем более, что считает верно на небольшой сумме.
Всё-таки скину свой вариант, потому что ты же всё там выстраиваешь верно, прошел несколько раз по твоему коду. Вместе сейчас попробуем найти, где там ошибка.
Вот мой вариант: http://ideone.com/7FJfGm
>>620445
Тот случай, когда совсем уж непонятно, чому неправильно. Думаю, и анончику это на пользу пойдёт.
Это я скинул скрипт для Айфона только, но в Айпаде как раз у тебя Мягкий банк должен эти же цифры выдать.
>>620457
Благодарю, анон, нашёл ошибку, расписав свою программу по месяцам по мягкому банку и сравнив с твоим.
11 месяц спустя: долг = 4138.1720657184 руб, выплачено всего 55000 руб.
12 месяц спустя: долг = 262.31722768997 руб, выплачено всего 60000 руб.
13 месяц спустя: долг = 0 руб, выплачено всего 61270.186744521 руб.
у меня же 12 месяц пропускался засчёт того, что я уводил при сумме меньшей, чем 5000 в if {} и там добивал всю сумму. Сейчас буду думать, как исправить
>>620457
Исправил в if ($summa * $percent + $comission < $payback). Теперь работает как надо! Аноны, спасибо большое, всё теперь понятно
http://ideone.com/bs0K2U
>у меня же 12 месяц пропускался засчёт того, что я уводил при сумме меньшей, чем 5000 в if {} и там добивал всю сумму.
Вот в том-то и дело, что это правильный алгоритм: при сумме меньшей или равной 5000 нужно просто выплачивать общий долг и вот эту сумму. Но эта "меньшая сумма" должна перед этим пройти прибавление 3% и 1000 за сервис.
Вроде у тебя так и было.
Где ошибка - не пойму, хоть ты тресни.
Нет, у меня было раньше
if ($summa < $payback), т.е. я уводил в сторону сразу при сумме 5000, без добавления 3% и 1000 за сервис. Я исправил на ($summa * $percent + $comission < $payback) и заработало.
Хм, я закрыл вкладку с форком твоего кода, но пытался подставить перед этим в скрипт это, почему-то не получилось.
Ну вот, отлично, значит.
Вот сейчас форкнул так, как я делал, алгоритм же один, - всё заработало.
http://ideone.com/o4iw1M
Чёрт знает, почему прежде не получалось.
ОП не одобрит оформление кода, там не по правилам же }; и отсутствие else {}.
Ну если в ифе происходит выход из цикла или return, то else писать необязательно, без него даже лучше т.к меньше кода.
Да я уже понял, что проебался с };, у себя в phpstorm убрал всё и получше оформил.
А по поводу else, для чего он в моём случае? В задании не было сказано, что его обязательно использовать.
Поддвачну. Это надо в шапку добавить. Намного меньше тупых вопросов будет, если люди внемлют этому совету. Половина вопросов в этом треде решается простым дампом. Надо бы использовать это как универсальный ответ на любой вопрос вида "анончики чому у меня не работает код?", как в видеорелейтед https://www.youtube.com/watch?v=t2F1rFmyQmY
Иногда надо давать себе перерыв
Можешь почитать, если хочешь, но он у них очень базовый и скорее годится для ознакомления. Ну если ты считаешь что этого курса достаточно, ты ведь без проблем решишь наши задачи, правда?
нахуй пошел, пидор, создавай свой тред и катись отсюда, мудила.
Начни с этой статьи http://ruhighload.com/post/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%D0%B8+%D0%B2+MySQL
Вообще оптимизация - сложная тема, надо понимать как устроена БД, как хранятся данные, как выполняется запрос. Приготовься искать и читать дополнительную литературу если хочешь разобраться.
Почитай также про бинарный поиск и двоичные деревья - это связанные темы.
Чем это лучше моего варианта?
>Будет ли такая проверка однозначно устанавливать идентичность файлов при совпадении их хэшей? Алсо, если файлов много - случаются пиздец тормоза, а скрипт все-таки не бесконечно работать может.
двачую
Двачую!
Берём функцию preg_split, подставляем в неё регулярки для разбивания текста на куски до ошибки и после ошибки.
Далее с помощью функции mb_substr от конца первого куска отсчитываем десять символов назад и десять символов вперёд, также отсчитываем десять символов от начала второго куска.
Соединяем куски просто при выводе в echo и внутрь вставляем ту ошибку из массива ошибок, которая всему этому соответствует.
Звучит вроде вполне правдоподобно и вполне реализуемо.
Как там на деле будет - посмотрим.
Задачка на проверку ошибок в тексте. Подскажите, пожалуйста, какие косяки?
ideone, почему-то упорно отказывается подавать что-либо на stdout, поэтому вот тот же скрипт на tutorialspoint: http://goo.gl/v2sfaa
Как я понял, Ideone не позволяет массивы вставлять более современным способом, как array[], только как array().
Пока не удалось запустить твоё решение, пробую поменять.
>>620757
В принципе, да, можно и так, действительно.
Я сделал до этого вот так: https://ideone.com/vSnFKo
Но это неправильно, надо функциями это всё собирать, а не регулярками. Или я уже поехал, возможно.
Косяк сразу - нет ui в конце регулярок, чтобы они работали с русским текстом и вне зависимости от регистра.
Работает неправильно, какой-то сумбур на выходе.
Но это, возможно, из-за того, что я там всё не соединил должным образом.
Ещё и в самих регулярках у тебя там сумбур, бро.
Букву "Ё" надо дополнительно указывать, потому что utf её не воспринимает при перечислении "а-я".
Перед союзами "а" и "но" надо искать отсутствие пробела. Там может быть текст типа "...пришёл домой.А жена-то и говорит..."
И регулярка должна находить эту ошибку не как отсутствие пробела после точки, а отсутствие пробела перед союзом.
Это всё ОП говорил.
>нет ui в конце регулярок
Да, забыл. Cкрипт почему-то без u них работает.
>Букву "Ё" надо дополнительно указывать, потому что utf её не воспринимает при перечислении "а-я".
Да, об этом ОП писал, я забыл.
>Перед союзами "а" и "но" надо искать отсутствие пробела.
Так ищет же их скрипт, в массиве третья регулярка с конца: после не запятой идёт пробел \s. Можешь проверить: http://goo.gl/4HcE0W
>пришёл домой.А жена-то и
За это первая регулярка в массиве отвечает: "После точки, запятой, двоеточия, точки с запятой, восклицательного и вопросительного знаков нужно ставить пробел."
Самое интересное, что без ui нет никаких warnings и вроде как всё работает.
https://stackoverflow.com/questions/3455985/range-out-of-order-in-character-class
Говорят, что нужно дефис экранировать, но мне не помогло.
Я там не понимаю, как запустить.
Тогда жди ОПа.
Вроде показывает ошибки в большом тексте и прежний вариант, вот тут я проверял же: >>620765
Но работает правильно только с большим текстом, вот посмотри сейчас на текст с одной ошибкой и парой слов. ОП обычно так и проверяет, так что инфа соточка, что он бы не одобрил.
>За это первая регулярка в массиве отвечает: "После точки, запятой, двоеточия, точки с запятой, восклицательного и вопросительного знаков нужно ставить пробел."
Я так сделал с самого начала, а ОП не одобрил. Вообще так и говорилось в условии, как ты сделал. Это я могу уже ехать и путать. Я всё это двадцать раз переписывал, потому что с нуля изучаю, могу уже всё путать.
А у тебя, кстати, какая-то база есть - это чувствуется. Что-то уже изучал?
>Я там не понимаю, как запустить.
Просто выбирай Execute. http://goo.gl/QiuyPF
Вроде причесал ещё немного регулярки, жду ОПа. Спасибо за внимание, анон!
>Что-то уже изучал?
Да ничего особо, лабы делаю по плюсам одногруппникам, с PHP так вообще плохо знаком. Ну разве что sed ковырял немного.
>ОП советовал делать так, как везде работает.
Я просто не подумал, что где-то может быть по-другому (в регулярках, различные реализации которых бесчисленны!). Думал, что вот у меня в линуксе проблем с кодировкой нет, значит у всех нет.
Хм, а вот там всё работает и с небольшим текстом, действительно...
Додумался только до такого, всё работает, но не уверен, что это самый изящный вариант:
<?php
$a = 89115668756;
$b = '/^8-?\\s?\\(?\\d{3}\\)?-?\\s?\\d{3}-?\\s?\\d{2}-?\\s?\\d{2}$/';
if (preg_match($b, $a)) {
echo "ok";
} else {
echo "not ok";
}
Во-первых, залей свой код на ideone. Во-вторых, попробуй сделать массив вариантов номера. Например вот так:
$arrayOfPossibleVariants = [
'8 213 23434 34 позвать Любу',
'8 213 2343 434',
'8 213 23434p34',
'8 213 23434 34',
'8(213234-34-34',
'02',
'8(911)-506 56 56'
];
А потом используй foreach для проверки каждого варианта.
foreach ($arrayOfPossibleVariants as $value) {
if(preg_match($regExp, $value)){
echo "{$value} соответствует.\n";
} else {
echo "{$value} не соответствует.\n";
}
}
По регуляркам пусть кто-то другой подскажет, сам жду когда мне подскажут.
А для чего ты указываешь в массиве неправильные варианты? Это я про "позвать Люду". Насколько я понимаю, мой вариант компактнее и правильнее(зачем это делать через массив, если можно в одну строчку уместить? Мой вариант полностью рабочий, просто громоздкий. Но это согласен, пусть тот, кто разбирается выскажется.
залил на ideone
http://ideone.com/538Hqy
>А для чего ты указываешь в массиве неправильные варианты?
Для проверки правильности работы регулярок. Взглянул на регулярку, появились сомнения - добавил парочку элементов массив, проверил сразу несколько вариантов. Вместо того, чтобы строку каждый раз менять для отдельного варианта. Ну а вообще удобнее для таких целей использовать сервисы вроде https://regex101.com/
Интересный сайт, но он ругается на мою формулировку \\( и \\), хотя они указаны у ОПа в уроке и работают хорошо в phpstorm.
Пиши так \( и \). Нет разницы.
На самом деле нет.
посмотрел по треду, кто как решает, кто через двойные массивы(массивы в массиве), кто через foreach, но этого не было в уроках ОПа! Точнее, было только упоминание
Я даже не знаю, как взяться за него. Пооткрывал все решения из треда, сейчас сижу и разбираю ваш код, пытаясь понять, как это работает. Но сам бы не дошёл до всех этих двойных массивов, т.к. учил только по ОПу и такого пока не встречал. Думаю пропущу после разбора этой задачи регулярки, т.к. чувствую пробелы в знаниях
Не-не - даже не думай!
Задача больше на массивы и цыклы, я гарантирую, сношался с ней с 31 декабря до вчерашнего дня, всех затралил в треде.
Зато поймёшь принципы и многое уяснишь.
решаю упражнения отсюда
http://dkab.github.io/jasmine-tests/?spec=6
скажите мне, я уебан кривой или решение и должно таким быть?
*циклы, совсем запрограммировался...
У ОПа это всё есть, надо просто ВСЕ его примеры переводить в Идеоне и там смотреть, когда только изучаешь.
Не надо галопом по Европам, я базарю.
https://ideone.com/3biSgl
Нужно больше текста перед ошибкой и после неё, а то ведь непонятно ничего.
Мне его решение тоже понравилось, моё сложнее и наивнее.
Да, согласен, что больше контекста нужно, заново заливать не буду, всё равно решение не моё.
Твоё через массив в массиве? Ты молодец, раз сам дошёл, но у того очень уж изящно вышло. Тешу себя мыслью, что я пока только первую неделю занимаюсь (до этого программирование в глаза не видел) и всё ещё впереди.
В этом решении куча ошибок. Программа находит ошибки где их нету и не находит где они есть: https://ideone.com/4ytqUN
[a|b] - это неправльно. Это значит не «a или b », а «один из символов a, | или b».
Ну и ошибки что он ожидает всегда ровно 1 пробел после «но».
Вместо alert используй console.log или document.write, а то у людей руки отвалятся эти окна закрывать.
Переменные надо назвать нормально, чтобы они указывали на то, что они значат. Например,
arrArg -> externalArgs
arr -> internalArgs
Сравни сам, насколько понятнее становится.
Вместо reverse + pop ты можешь использовать shift - он снимает элемент из начала массива.
После if всегда стоит писать {} - иначе можно допустить ошибку при правке кода.
Длинные комментарии лучше писать над строчкой, а не справа.
В остальном выглядит верно. Если робот принимает, то все ок.
>>621172
Куча номеров:
----------
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Вместо alert используй console.log или document.write, а то у людей руки отвалятся эти окна закрывать.
Переменные надо назвать нормально, чтобы они указывали на то, что они значат. Например,
arrArg -> externalArgs
arr -> internalArgs
Сравни сам, насколько понятнее становится.
Вместо reverse + pop ты можешь использовать shift - он снимает элемент из начала массива.
После if всегда стоит писать {} - иначе можно допустить ошибку при правке кода.
Длинные комментарии лучше писать над строчкой, а не справа.
В остальном выглядит верно. Если робот принимает, то все ок.
>>621172
Куча номеров:
----------
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Если пробелы в знаниях, надо не пропускать тему, а решить все задачи и попросить дополнительные.
>>621152
preg_match_all там есть в уроке, только он может быть идет ниже чем задача. Прочитай весь урок по регуляркам внимательно и мануал еще глянь.
>>621137
Надо с ним. То, что она идет раньше, будем считать проверкой сообразительности и находчивости анона.
>>621130
Не используй собачку. Отловить вроде можно через свой обработчик ошибок.
>>621125
> Когда будет очищена память и как чистить, если точно не уверен, является ли переменная ресурсом изображения или нет
Если у тебя всего 2 варианта: либо в переменной картинка либо null то проверить можно так:
if ($image) {
... удаляем картинку
$image = null; // обнуляем переменную чтобы второй раз не удалить
}
Если у тебя что-то более сложное то программу надо переделывать. В одной переменной не должны храниться значения разных типов.
>>621056
Можно искать только по своей CMS задачи. Но задачи на CMS обычно низкоквалифицированные и плохо оплачиваемые.
>>621054
Сегодня попробую пройтись по старому треду, а потом в этом.
>>620920
Там на сайте надо писать бекслеш один раз. Мы пишем 2 раза так как мы пишем регулярку внутри строки, а по правилам PHP чтобы вставить в строку бекслеш его надо писать 2 раза:
echo "\\"; -> \
echo "\"; -> ошибка
То есть ты пишешь \\( а движок регулярки получает просто \(
Можно попробовать писать один бекслеш, но гарантировать что все будет работать, я не могу.
мануал http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double
Например чтобы найти регуляркой бекслеш, по правилам регулярок требуется его заэкранировать:
\\
Но если так написать в строке в PHP то он поймет это как 1 бекслеш потому в PHP мы удваиваем каждй бекслеш:
\\\\
Тогда движок регулярок получит \\ на вход.
Если пробелы в знаниях, надо не пропускать тему, а решить все задачи и попросить дополнительные.
>>621152
preg_match_all там есть в уроке, только он может быть идет ниже чем задача. Прочитай весь урок по регуляркам внимательно и мануал еще глянь.
>>621137
Надо с ним. То, что она идет раньше, будем считать проверкой сообразительности и находчивости анона.
>>621130
Не используй собачку. Отловить вроде можно через свой обработчик ошибок.
>>621125
> Когда будет очищена память и как чистить, если точно не уверен, является ли переменная ресурсом изображения или нет
Если у тебя всего 2 варианта: либо в переменной картинка либо null то проверить можно так:
if ($image) {
... удаляем картинку
$image = null; // обнуляем переменную чтобы второй раз не удалить
}
Если у тебя что-то более сложное то программу надо переделывать. В одной переменной не должны храниться значения разных типов.
>>621056
Можно искать только по своей CMS задачи. Но задачи на CMS обычно низкоквалифицированные и плохо оплачиваемые.
>>621054
Сегодня попробую пройтись по старому треду, а потом в этом.
>>620920
Там на сайте надо писать бекслеш один раз. Мы пишем 2 раза так как мы пишем регулярку внутри строки, а по правилам PHP чтобы вставить в строку бекслеш его надо писать 2 раза:
echo "\\"; -> \
echo "\"; -> ошибка
То есть ты пишешь \\( а движок регулярки получает просто \(
Можно попробовать писать один бекслеш, но гарантировать что все будет работать, я не могу.
мануал http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double
Например чтобы найти регуляркой бекслеш, по правилам регулярок требуется его заэкранировать:
\\
Но если так написать в строке в PHP то он поймет это как 1 бекслеш потому в PHP мы удваиваем каждй бекслеш:
\\\\
Тогда движок регулярок получит \\ на вход.
Вам надо чтобы регулярка соответсвовала праивльным и не соответствовала неправильным.
Флаг m в конце для того чтобы ^ и $ обозначали не начало/конец текста, а начало/конец любой строки.
Очень удобно на этом сайте тестировать - там все само обновляется по мере набора текста.
Проверь свою регулярку сначала сам на списке номеров тут >>621353\t или на regex101 по ссылке >>621365
Не забудь что на regex101 бекслеш пишется 1 раз а не два.
Если все ок - сдавай на проверку. Сразу скажу что выглядит сложновато и хотелось бы записать как-то попроще, например:
+7 или 8, за ними ровно 10 цифр между которыми любое число пробелов, минусов, скобок.
А не закладывать вариант что всегда идет ровно 3 цифры, за ними ровно 2 и тд.
>>620903
Совет по именованию:
arrayOfPossibleVariants -> possibleVariants
value -> variant
>>620899
Протестируй свой вариант на примерах номеров.
Также, попробуй переписать проще, например:
+7 или 8, за ними ровно 10 цифр между которыми любое число пробелов, минусов, скобок.
Проверь свою регулярку сначала сам на списке номеров тут >>621353\t или на regex101 по ссылке >>621365
Не забудь что на regex101 бекслеш пишется 1 раз а не два.
Если все ок - сдавай на проверку. Сразу скажу что выглядит сложновато и хотелось бы записать как-то попроще, например:
+7 или 8, за ними ровно 10 цифр между которыми любое число пробелов, минусов, скобок.
А не закладывать вариант что всегда идет ровно 3 цифры, за ними ровно 2 и тд.
>>620903
Совет по именованию:
arrayOfPossibleVariants -> possibleVariants
value -> variant
>>620899
Протестируй свой вариант на примерах номеров.
Также, попробуй переписать проще, например:
+7 или 8, за ними ровно 10 цифр между которыми любое число пробелов, минусов, скобок.
Для заманивания новых анонов и мотивирования старых. А вообще, ОП просто ставит в шапку картинки которые ему нравятся.
>>620787
Твои ссылки на tutorialspoint к сожалению сейчас не открываются, ошибка 504
>>620787
>>620777
Без флага u русские буквы будут работать некорректно, причем там все так хитро что ты можешь даже не сразу это заметить и замучаешься искать в чем причина. Всегда ставь этот флаг если ты используешь utf-8.
Если нужны подробности, то суть в том что в utf-8 русские буквы состоят из 2 идущих подряд байт, а движок регулярок по умолчанию думает что 1 байт = 1 символ и он воспринимает русскую букву как 2 независимых символа.
То есть ты пишешь аб (это кодируется байтами D0 B0 D0 B1), а движок регулярок видит 4 отдельных символа c кодами D0, B0, D0, B1. Так как в тексте «аб» кодируется так же, то это сработает. Но не сработает например если в тексте идет АБ так как оно кодируется как D0 90 D0 91.
А теперь представь что ты пишешь a?. Это значит, может быть русская буква a, может не быть. А что видит движок регулярок?
D0 B0 ?
То есть он видит «идет символ с кодом D0, за ним может быть или не может быть символ B0». В utf-8 не бывает просто байта с кодом D0, за ним всегда что-то идет, и это выражение сработает только если в тексте есть буква a с кодом D0 B0. Очевидно что тут будет ошибка и выражение «a?» будет интерпретироваться как «a», то есть знак вопроса не сработает.
Представь, сколько надо времени чтобы понять почему не работает знак вопроса в на первый взгляд правильной регулярке.
Коды я взял тут: http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
Потому всегда ставь флаг u.
Для заманивания новых анонов и мотивирования старых. А вообще, ОП просто ставит в шапку картинки которые ему нравятся.
>>620787
Твои ссылки на tutorialspoint к сожалению сейчас не открываются, ошибка 504
>>620787
>>620777
Без флага u русские буквы будут работать некорректно, причем там все так хитро что ты можешь даже не сразу это заметить и замучаешься искать в чем причина. Всегда ставь этот флаг если ты используешь utf-8.
Если нужны подробности, то суть в том что в utf-8 русские буквы состоят из 2 идущих подряд байт, а движок регулярок по умолчанию думает что 1 байт = 1 символ и он воспринимает русскую букву как 2 независимых символа.
То есть ты пишешь аб (это кодируется байтами D0 B0 D0 B1), а движок регулярок видит 4 отдельных символа c кодами D0, B0, D0, B1. Так как в тексте «аб» кодируется так же, то это сработает. Но не сработает например если в тексте идет АБ так как оно кодируется как D0 90 D0 91.
А теперь представь что ты пишешь a?. Это значит, может быть русская буква a, может не быть. А что видит движок регулярок?
D0 B0 ?
То есть он видит «идет символ с кодом D0, за ним может быть или не может быть символ B0». В utf-8 не бывает просто байта с кодом D0, за ним всегда что-то идет, и это выражение сработает только если в тексте есть буква a с кодом D0 B0. Очевидно что тут будет ошибка и выражение «a?» будет интерпретироваться как «a», то есть знак вопроса не сработает.
Представь, сколько надо времени чтобы понять почему не работает знак вопроса в на первый взгляд правильной регулярке.
Коды я взял тут: http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
Потому всегда ставь флаг u.
> [а-Я]
Так не надо писать. В юникоде (посмотри сам: http://unicode-table.com/ru/blocks/cyrillic/) большие буквы идут раньше маленьких, отсюда ошибка: ты указал невозможный диапазон символов. Также, буква ё находится там не после е, а вообще отдельно от алфавита.
Надо писать
[а-яА-ЯёЁ]
> "Предложение должно начинаться с большой буквы.",
У тебя там в регулярке флаг i - игнорировать регистр.
> Перед союзами «а» и «но» нужно ставить запятую
там ошибка что после но должен идти пробел. А может идти например какой-то знак.
> \sздел\S
А что если «Зделал» идет в самом начале текста?
>>620761
> Ideone не позволяет массивы вставлять более современным способом, как array[], только как array().
Позволяет: $a = [1, 2,3 ];
> 0 => array
> 1 => array
Можно не писать тут индексы, PHP сам их поставит.
Твои регулярки не сработают если например слово «сдесь» стоит в самом начале текста.
> здела
сработает на правильное слово «разделать медведя»
> Пропущен пробел перед союзом \"а\"."
Надо проверять пропущенную запятую а не пробел
> [^\\s(а|но)]
Это значит любой символ, кроме пробельного, скобок, букв а, н, о, вертикальной черты. В квадр. скобках многие символы теряют свое значение.
> for ($i=0; $i < $possibleErrorsCount; $i++) {
Лучше foreach
> [а-Я]
Так не надо писать. В юникоде (посмотри сам: http://unicode-table.com/ru/blocks/cyrillic/) большие буквы идут раньше маленьких, отсюда ошибка: ты указал невозможный диапазон символов. Также, буква ё находится там не после е, а вообще отдельно от алфавита.
Надо писать
[а-яА-ЯёЁ]
> "Предложение должно начинаться с большой буквы.",
У тебя там в регулярке флаг i - игнорировать регистр.
> Перед союзами «а» и «но» нужно ставить запятую
там ошибка что после но должен идти пробел. А может идти например какой-то знак.
> \sздел\S
А что если «Зделал» идет в самом начале текста?
>>620761
> Ideone не позволяет массивы вставлять более современным способом, как array[], только как array().
Позволяет: $a = [1, 2,3 ];
> 0 => array
> 1 => array
Можно не писать тут индексы, PHP сам их поставит.
Твои регулярки не сработают если например слово «сдесь» стоит в самом начале текста.
> здела
сработает на правильное слово «разделать медведя»
> Пропущен пробел перед союзом \"а\"."
Надо проверять пропущенную запятую а не пробел
> [^\\s(а|но)]
Это значит любой символ, кроме пробельного, скобок, букв а, н, о, вертикальной черты. В квадр. скобках многие символы теряют свое значение.
> for ($i=0; $i < $possibleErrorsCount; $i++) {
Лучше foreach
Нет флага u, из-за этого скорее всего регулярка выдает битые utf-8 последовательности и ideone отказывается их отображать.
Проверить можно, сделав вывод побайтово:
https://ideone.com/z4idwF
В utf-8 русская буква кодируется 2 байтами, первый это D0 или D1, второй - от 80 до FF.
В строке
> Здесь ошибка: d1 80 d0 b0 d1 81 d1 81 d1 83 d0 b4 d0 be d0 ba 21 d0 b7 d0 b0 d0 b0 d1
> Описание: Предложение должно начинаться с большой буквы.
В конце идет D1 и за ней нет ничего, отсюда и проблемы.
Сложновато. Можно лучше сделать так:
- preg_match_all находим все места с ошибками
- функцией типа mb_strpos http://php.net/manual/ru/function.mb-strpos.php по найденной фразе находим ее позицию в тексте (подвох: фраза может встретиться несколько раз)
- имея позицию, можем взять кусок текста например на 10-15 символов раньше
Также, preg_match_all умеет сообщать позицию найденного текста в байтах с помощью флага PREG_DELIM_CAPTURE, но там получится сложный 3-мерный массив.
fl.ru
>>620481
выражение
> $summa x $percent + $comission;
Повторяется 3 раза, убери повторы.
>>620468
Надо еще убрать повторы выражения
> $summa x $percent + $comission
>>620440
Готовые решения не даем.
>>620391
У нас еще есть студенты, файлообменник, и более сложные задачи.
>>620366
Сейчас выглядит верно но надо убрать повторы выражения для расчета процентов.
>>620316
Да.
>>620285
> for(var key in this.getSizes()){
> if(size == key){
Используй оператор in
Лучше переименовать
calculationResult -> result
В остальном все верно.
>>620295
Функцию расчета кредита в одном банке.
fl.ru
>>620481
выражение
> $summa x $percent + $comission;
Повторяется 3 раза, убери повторы.
>>620468
Надо еще убрать повторы выражения
> $summa x $percent + $comission
>>620440
Готовые решения не даем.
>>620391
У нас еще есть студенты, файлообменник, и более сложные задачи.
>>620366
Сейчас выглядит верно но надо убрать повторы выражения для расчета процентов.
>>620316
Да.
>>620285
> for(var key in this.getSizes()){
> if(size == key){
Используй оператор in
Лучше переименовать
calculationResult -> result
В остальном все верно.
>>620295
Функцию расчета кредита в одном банке.
Примерно да. Но почему через curl? Он же неудобный, лучше использовать guzzle например.
>>620151
Гуглил?
>>620132
На макете вряд ли будет отображен текст который позже введет редактор сайта.
>>620039
У тебя очень странная модель. Почему-то объект Employee представляет не одного работника, как можно подумать из названия, а любое их число. Это усложняет программу: представь например что нам надо взять и повысить ранг одному работнику из группы. Логичнее было бы сделать 1 объект = 1 работник. А если хочется их группировать, сделать объект ГруппаРаботников.
Причем что интересно, зарплату он считает с учетом числа людей, а потребление кофе - без.
Также, давай попробуем проверить всегда ли твои объекты сообщают актуальную и точную информацию (как известно, методы и функции всегда должны возвращать точный актаульный результат). Создадим работника, и позже повысим его до босса:
$ivan = new Manager(1, 1, false);
echo "Зарплата Ивана: {$ivan->getSalary()}\n";
$ivan->leader = true;
echo "Зарплата Ивана после повышения: {$ivan->getSalary()}\n";
http://ideone.com/wLCThI
Если все верно то зарплата Ивана должна повыситься. А что? Поле leader публичное, значит автор кода разрешил менять его снаружи, если бы он был против, он бы сделал его private или protected.
У тебя она почему-то не повышается.
Также, проверь, если понизить босса до простого работника, или поменять ранг, правильно ли считается потребление кофе, написание отчетов, зарплата.
> class EmployeeList {
Логичнее было сделать объект Департамент.
Также, держи дополнительное задание:
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коллектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
Примерно да. Но почему через curl? Он же неудобный, лучше использовать guzzle например.
>>620151
Гуглил?
>>620132
На макете вряд ли будет отображен текст который позже введет редактор сайта.
>>620039
У тебя очень странная модель. Почему-то объект Employee представляет не одного работника, как можно подумать из названия, а любое их число. Это усложняет программу: представь например что нам надо взять и повысить ранг одному работнику из группы. Логичнее было бы сделать 1 объект = 1 работник. А если хочется их группировать, сделать объект ГруппаРаботников.
Причем что интересно, зарплату он считает с учетом числа людей, а потребление кофе - без.
Также, давай попробуем проверить всегда ли твои объекты сообщают актуальную и точную информацию (как известно, методы и функции всегда должны возвращать точный актаульный результат). Создадим работника, и позже повысим его до босса:
$ivan = new Manager(1, 1, false);
echo "Зарплата Ивана: {$ivan->getSalary()}\n";
$ivan->leader = true;
echo "Зарплата Ивана после повышения: {$ivan->getSalary()}\n";
http://ideone.com/wLCThI
Если все верно то зарплата Ивана должна повыситься. А что? Поле leader публичное, значит автор кода разрешил менять его снаружи, если бы он был против, он бы сделал его private или protected.
У тебя она почему-то не повышается.
Также, проверь, если понизить босса до простого работника, или поменять ранг, правильно ли считается потребление кофе, написание отчетов, зарплата.
> class EmployeeList {
Логичнее было сделать объект Департамент.
Также, держи дополнительное задание:
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коллектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
Будет ли такая проверка однозначно устанавливать идентичность файлов при совпадении их хэшей? Алсо, если файлов много - случаются пиздец тормоза, а скрипт все-таки не бесконечно работать может. Выше писали про специальные функции для хеша именно файла. Чем это отличается от моего варианта?
>>621357
>Не используй собачку. Отловить вроде можно через свой обработчик ошибок.
Как без нее-то? Если варнинги и нотисы выводятся. Например if ($test = @imagecreatefromjpeg...) else ...
всё равно выплюнет варнинг без собачки, если условие не выполняется. Поэтому я ее давлю, но хочу где-то запомнить.
>свой обработчик ошибок
Эм, чо?
CREATE TABLE
INSERT INTO
UPDATE
SELECT
Решение хорошее, но есть недостаток: у тебя вручную посчитаны индексы массивов:
> mt_rand(0,5)
Надо либо чтобы они считались сами через count либо использовать функцию array_rand.
>>621413
> Тупо md5(file_get_contents(файл))?
md5_file наверно лучше
> Будет ли такая проверка однозначно устанавливать идентичность файлов при совпадении их хэшей?
да
> Алсо, если файлов много - случаются пиздец тормоза, а скрипт все-таки не бесконечно работать может.
Нельзя посчитать хеш без чтения всего файла в память. Впрочем тут есть способы ускорить проверку - например если длина файла не совпадает то дальше можно не сравнивать. Или можно сравнивать блоками по N байт и останавливаеться если не совпали.
> Как без нее-то? Если варнинги и нотисы выводятся.
Проверять что перед тобой JPEG файл прежде чем вызывать imagecreatefromjpeg
Например функцией getimagesize.
А ты читал про нормализацию в SQL? Если нет то прочти, есть статьи где это простыми словами объясняется.
https://github.com/lexdss/shop/blob/master/shop.sql
У таблицы category (и всех остальных) надо указать уникальные индексы для колонок где не может быть повторяющихся значений.
path лучше писать в виде «cort» если там везде в начале стоит /cat. Более того, по моему колонка path просто дублирует значения из code.
Не очень понятно чем поле name отличается от title - надо бы добавить комментарий к полям через конструкицию COMMENT '....'
....
Полностью ответ тут http://pastebin.ru/mzp3Ex5d
Я имею ввиду, сама проверка через хеши - она однозначна и для любых сравнений подходит? Нет там коллизий каких-нибудь хитрых или еще чего?
>Например функцией getimagesize.
Ну это я итак делаю.
>Впрочем тут есть способы ускорить проверку - например если длина файла не совпадает
А если файлов десятки тысяч? По идее, сначала посчитать хэши (зато один раз) будет быстрее, нет?
Отбой тревоги, f5 всё решил.
Оп исправил почти все твои замечания
http://integer64.github.io/site-layout/
Задача 10:
>>Почему width 100%?
Гугль дал такое решение для адаптивности картинок
Задача 11:
>>перемещаться с клавиатуры, клавишами Tab, Shift + Tab, стрелками, пробелом.
Реализовал, добавил для checkbox на :focus бордер тень,что бы было видно.
Задача 12:
Переделал, совсем без id у меня не получилось, надо было как то input с label связать. Может быть есть другое решение.
Связал вкладки и контент вкладок через data-атрибуты. Хотелось бы в CSS полноценные регулярные выражения, тогда решение было бы более эстетичное.
Возник вопрос по поводу длинны названия вкладки: три раза прочитал, так и не понял что требуется, разжуй пожалуйста, для самых глупеньких вроде меня.
И как выкладывать решение задач по MySQL? В каком виде?
Анон учился-учился в нашем треде и нашел работу в итоге. Молодец, что. Заметьте, что анон выбрал сложный путь изучения: не примитивные пиратские видеокурсы по написанию процедурной лапши с устаревшими функциями, а наш тред, ООП, композер, вот все это. Соответсвенно и на работе Symfony и Doctrine, не ерунда какая-то.
Берите пример. Еще впереди несколько дней праздников, хороший повод добить ту задачу про студентов которую вы никак не можете доделать.
>>621442
Есть но вероятность коллизии очень маленькая, скорее тебе на голову микрометеорит упадет и тебя перестанет беспокоить эта проблема. Ведь хеш имеет длину 256 бит и 2 в 256 степени вариантов разных хешей. Это во много раз больше чем число всех файлов на планете.
> А если файлов десятки тысяч? По идее, сначала посчитать хэши (зато один раз) будет быстрее, нет?
Да, это хорошая идея. если ты делаешь ютуб то конечно надо хранить в базе посчитанные хеши, зачем их заново считать?
>>621449
> как выкладывать решение задач по MySQL?
Если SQLfiddle работает то лучше всего на него. Если нет - делай SQL дамп (CREATE TABLE + INSERT + SELECT) и загружай на любой pastebin или ideone.
То есть нужен код на языке SQL, создающий таблицы, вставляющий в них что-нибудь и делающий нужный запрос.
Спасибо за подробные и полезные ответы!
Немножко доработал регулярки:
> Перед союзами «а» и «но» нужно ставить запятую
>там ошибка что после но должен идти пробел. А может идти например какой-то знак.
Написал такую регулярку: /\w\s(а|но)[^w]/gu
Тесты с различными вариантами здесь: https://regex101.com/r/jT4fT6/2
> \sздел\S
>А что если «Зделал» идет в самом начале текста?
Написал такую: /(\s|^)здел\S*/gui
Тесты: https://regex101.com/r/jI7vG3/1
> Возник вопрос по поводу длинны названия вкладки: три раза прочитал, так и не понял что требуется, разжуй пожалуйста, для самых глупеньких вроде меня.
Наверно имеется в виду что там может быть длинная фраза или слово в заголовке вкладки. Верстка должна не ломаться от этого, и разрешается ради этого сделать на уровне CSS какое-то разумное ограничение на размеры заголовка, например обрезать если он длиннее определенной величины.
> Хотелось бы в CSS полноценные регулярные выражения, тогда решение было бы более эстетичное.
Сайты будут грузить процессор сильнее тогда. Не хотеть. И кстати там уже есть селекторы для поиска по атрибуту вроде
~=
*=
^=
|=
$=
Почитай если не слышал https://learn.javascript.ru/css-selectors
(\s|^) -нельзя ли заменить на \b? \b значит граница слова, то есть место где с одной стороны стоит \w а с другой \W (не-\w).
[^w] - где бекслеш? Это не то же самое что \W?
Лучше не полагаться что между словами ровно один пробел.
>>621467 - вопрос про аякс
>>621468 - про поиск грамматических ошибок, композер, поиск пути
>>621469 - поиск пути, константа EMPTY, структура папок в задаче студентов, про неймспейсы
>>621470 - getId3, калькулятор
>>621471 - Кошки-мышки, в общем хорошо решено
>>621472 - https://github.com/fxsloker/Student
Если вы постили в прошлом 2015 году и вас пропустили - напомните о себе в этом треде. Если уже в 2016 то погодите еще пару часиков.
Если старый тред исчез и вы не можете прочесть ответ - попросите ОПа поискать в архиве, напомните о чем шла речь.
>Я бы убрал core, и вместо одной папки models сделал разные папки для разных классов: для валидатров, сущностей, хелперов, классов работы с БД.
Где тут MVC тогда, не понимаю.
MVC не в том что ты создаешь ровно 3 папки, а в том что приложение можно логически разбить на M, V и C.
http://ideone.com/xEl2f5
>>621512 - про ключи в массиве
>>621513 - https://github.com/MindiMakridi/filehosting
>>621514 - что сделать на симфони, исправление опечаток, проверка телефона, кредит
>>621515\t- JS про электросеть, поиск ошибок, Апач на маке
>>621516 - игра в кубики, стихи, кредит
>>621517 - ...
>>621519\t- http://integer64.github.io/ (хорошо сделал)
>>621520\t- первые 3 задачи, поиск ошибок, проблема в phpstorm
Если я не ответил вам или не проверил что-то, пишите в этом треде. Если старый тред утонул и вы не увидели решение, попросите ОПа достать из архива, напомните что за задача была.
>Нельзя в заголовках исплоьзовать что-то кроме ASCII (то есть латинницы). Убери это поле.
Без этого поля файл сохраняется с айди.
>Интересные у тебя геттеры. Зачем это ты исключение выбрасываешь? Я не против, просто хочу понять заечм.
Твой же совет выше по треду, что каждый метод должен либо отдавать значение, либо выбрасывать исключение.
>Это должно быть в другом классе.
Ну токен это же свойство файла. Алсо, куда тогда девать все эти методы? Создать хелпер и туда отправлять все не нашедшие себе места методы?
> Без этого поля файл сохраняется с айди.
В ссылке на скачивание должно быть имя файла в конце. Покажи какая у тебя ссылка.
> Ну токен это же свойство файла.
Это да, но он не обязан их генерировать, он их только хранит.
> Алсо, куда тогда девать все эти методы? Создать хелпер и туда отправлять все не нашедшие себе места методы?
Сделать файловый хелпер, который будет отвечать за валидацию, загрузку файлов, токены, генерацию путей. он может зависеть от маппера для работы с БД.
>>621511
Флаг u почему пропустил?
также,
> switch($test) {
> case preg_match("/[0-9]х?ме[0-1]/", $test)
как это по твоему должно работать? Это ведь примерно равно
if ($test == preg_match("/[0-9]х?ме[0-1]/", $test))
>В ссылке на скачивание должно быть имя файла в конце. Покажи какая у тебя ссылка.
Хм, в самом деле скачивает по имени файла в конце. Хотя может дело было в том, что браузер как-то запоминал прежнее имя, под которым я скачивал файл, потому-что я тестировал разные имена файлов, и для уже скачанных файлов изменения кода не оказывали никакого влияния, они продолжали скачиваться с тем именем, которое было при первой загрузке.
>>621369
>+7 или 8, за ними ровно 10 цифр между которыми любое число пробелов, минусов, скобок.
Я вот написал такой вариант, но понимаю, что он неправильный.
$reg = '/(+7|8)[0-9\\(?\\)?-? ?]{10}'; Как воплотить это
>+7 или 8, за ними ровно 10 цифр между которыми любое число пробелов, минусов, скобок.
Спасибо Оп.
Теперь по поводу главного задания по верстке макета, верстать надо на голом CSS или можно bootstrap использовать?
Можно.
помохите
>Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
>Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568
>Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php
Да, я даунт-аутист, признаю, сижу в учебнике и даже не смотел на сам ОП-пост
есть массив $_GET, где может быть как 2 так и 50 элементов, нужно сделать определения всех элементов в переменные. Пример:
test.ru/putin?hui=1&president=da&coolman=super
нужно, чтобы было что-то isset($_GET['hui']) $hui = $_GET['hui'] else $hui = ''; И так все остальные, проблема как раз таки, что количество может быть разное и в дальнейшем расширяться
>isset($_GET['hui']) $hui = $_GET['hui'] else $hui = '';
Если нужно именно сохранять в переменные, то можешь использовать extract() или переменные переменных: https://secure.php.net/manual/ru/language.variables.variable.php
Вот пример второго:
Запрос: index.php?id=1&name=vasyan
Код:
<?php
foreach ($_GET as $key => $value) {
\t$$key = $value;
}
echo $id, $name;
>>621571
Купить можно, чтобы поддержать автора. Но мне лично удобнее читать с планшета в транспорте.
Почему когда я делаю так я получаю хуй.
function __construct() {
`return new SomeClass();`
}
А когда так, то все ок
private $obj;
function __construct() {
`$this->obj = new SomeClass();`
`return $this->obj;`
}
>Также, если твой роутер будет создавать и вызывать контроллер, а не просто анализировать URL то фактически это паттерн FrontController.
А какие еще есть паттерны проектирования? Где можно почитать, потрогать?
Не рекомендую так как там от него ничего не использовать и ты только усложнишь себе жизнь, а мне - проверку.
http://codepad.org/nm9jPcpd
Как написать проверку мне понятно, а куда и под каким оператором засунуть - нет. Пробовал с if не получилось, хотя проверка ошибок не выдала, просто все наебнулось в конце.
Зачем ты в конструкторе пишешь return? Конструктор не может ничего вернуть, на то он и конструктор.Его задача - заполнить поля в объекте начальными значениями.
Оба примера кода неправильные.
>>621584
Есть паттерны работы с базой данных: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
Почитать в книге Фаулера «patterns of enterprise application architecture» ( http://www.ozon.ru/context/detail/id/4884925/ ), она есть и на русском.
Вот тут краткий список паттернов http://design-pattern.ru/
Учти что это рассчитано не на начинающих. Лучше их изучать в процессе изучения фреймворков, где они могут быть применены.
>>621585
Можно гуглить, можно даже тут просить подсказки и обсуждать. Цель чтобы ты получил нужные знания тем или иным путем и писал код. Вот только код надо писать все равно самому - не копипасть готовые куски, иначе не научишься.
В этом коде есть ошибки, тут действительно проверку так просто не вставить. Лучше всего его переписать заново с нуля.
> [0-9\\(?\\)?-? ?]
Это значит: «любой из символов: цифра, скобка, минус, знак вопроса, пробел». Ну и повторяется 10 раз. Ну то есть например это может быть 6 цифр и 4 знака, или 7 цифр и 3 знака и тд.
В квадратных скобках вопрос просто обозначает знак вопроса. Квадратные скобки значат «один из указанных тут символов».
По твоему вопросу - попробуй написать регулярку, которая ищет ровно одну скобку, минус или пробел. затем дополни чтобы она искала не один, а любое число таких символов. Ну а после этого напиши регулярку, которая ищет ровно 1 цифру и любое число указанных выше символов. И после этого сделай чтобы это повторялось ровно 10 раз.
Если что, проси еще подсказки.
https://github.com/fxsloker/Student
При запуске http://student/front/index падает с ошибкой:
Fatal error: Class 'FrontController.php' not found in /home/sloker/public_html/student/app/Router.php on line 28
Но я же подключил файл и вызвал существующий класс. Не могу понять откуда ошибка.
В правильном направлении я делаю роутер и паттерн FrontController?
>Позволяет: $a = [1, 2,3 ];
> 0 => array
> 1 => array
>Можно не писать тут индексы, PHP сам их поставит.
Да, действительно, Идеоне позволяет - я после этого проверил.
>Твои регулярки не сработают если например слово «сдесь» стоит в самом начале текста.
>> здела
>сработает на правильное слово «разделать медведя»
Чёрт, действительно, уже понял, как надо исправить: поставить обязательный пробел перед словом.
>> Пропущен пробел перед союзом \"а\"."
>Надо проверять пропущенную запятую а не пробел
Чёрт, я попутал, что именно нужно, это да.
>> [^\\s(а|но)]
>Это значит любой символ, кроме пробельного, скобок, букв а, н, о, вертикальной черты. В квадр. скобках многие символы теряют свое значение.
Спасибо, поправлю и запомню, это не проблема.
>> for ($i=0; $i < $possibleErrorsCount; $i++) {
>Лучше foreach
Да, сейчас заглянул впервые на страницу "Повторим?", там как раз говорится, что в массивах элементы неправильно перебирать с помощью for, лучше foreach.
>>621383
Спасибо, сохраню такой алгоритм, попробую применить, когда снова всё буду прорешивать.
Спасибо за ответы и помощь!
Да, то решение со вложенными массивами моё.
Я занимаюсь месяц где-то, конечно же, всё впереди. Сейчас как-то сразу начинаю представлять, как будет многое работать и что будет получаться на выходе, но ошибок и непонятного для меня всё равно ещё очень много даже в пройденных уроках.
>Очень напрягает то, что позанимавшись по его мануалам около двух недель понимаешь, что на самом деле не знаешь даже элементарных основ
Просто надо каждый код ОПа вставлять в IDE, манипулировать и изменять его, а не просто пробегать глазами и думать, что уяснил его работу.
Да и о многом речь начинает идти уже в самом конце, до этого ещё дойти надо.
>Очень напрягает то, что позанимавшись по его мануалам около двух недель понимаешь, что на самом деле не знаешь даже элементарных основ
Просто надо каждый код ОПа вставлять в IDE, манипулировать и изменять его, а не просто пробегать глазами и думать, что уяснил его работу.
Да и о многом речь начинает идти уже в самом конце, до этого ещё дойти надо.
http://ideone.com/fpRAtk
как будто подрочил, чесслово
ну и в чём смысл этой хуеты, сложнаа сложнаа сложна блять нихуя не понятно сложна блять
Наверно потому что про while еще ничего не рассказали, а без него ничего бы не вышло.
Блять вайл для пидарасов, это все знают, хотя я смею предположить что ты полный отбитый наглухо далбаёб, поэтому прошу тебя проследовать нахуй.
До этого что-то изучал, что ли? Или это ты шёл по решениям анонов?
Это не ТруЪ - использовать чужие решения, выдавая или принимая их за свои. Надо пердолиться сутками самостоятельно. Так приходит понимание.
Да нет, решил всё сам, я бы не был так рад, если бы копипастил чужие решения.
До этого ничего не изучал, одно время с питоном интересовался только, но вообще гуманитарий по профе. Вот перекатываюсь потихоньку
Ну так потри. Полезные посты отвечающих на вопросы перемежаются с вербальным поносом обделённого вниманием ополоумевшего школьника.
http://ideone.com/jY00kx
https://github.com/nsdvw/file-sharing
Вопросы.
1. Можно ли как-то использовать подготовленные выражения с sql оператором IN (...)? Мне нужно найти пользователей с id перечисленными в массиве.
Нашел несколько советов из гугла (либо лепить запрос руками и байндить поштучно, либо использовать трюк с mysql функциями типа find_in_set)
http://stackoverflow.com/questions/1586587/pdo-binding-values-for-mysql-in-statement/1586650#1586650
Использую второй вариант с функцией, но мало ли, вдруг у этого подхода есть недостатки (например при смене субд придется ходить и переписывать все запросы).
2. Что делать с импортированием классов? Если писать use для каждого, то это займет половину строк скрипта. Если не импортировать, а писать полный неймспейс, получаются длинные строки. Пока делаю так: импортирую только те классы, упоминание которых встречается более 1 раза. Но это же не по программерски, делать через раз без четкой системы. Может есть какой-нибудь стандарт? В php7 вроде пытались что-то с этим сделать, но вышло не очень, там всего лишь группировка по корневому неймспейсу.
3. Хотел пожаловаться на бутстрап. Оп тут проповедует семантичненькую верстку с минимумом тегов и четким разделением ответственности между css и html, а они там намешали вложенных дивов с десятками классов, пустые теги для создания иконок например, ссылки которые на самом деле кнопки и кнопки которые ссылки, ну и вообще черт знает что.
Но выглядит шикарно, ничего не скажешь.
А, в пагинаторе еще почему-то переход по заблокированной ссылке "Next" все равно происходит. То есть они конечно сделали ее серенькой, и даже ховер с зачеркнутой ручкой, только вот при клике переход происходит (на эту же страницу, тупо перезагрузка). Это так и задумано по каким-то левым соображениям (типа юзер может обидеться, почему в свободной стране ему запрещают перейти по ссылке и подать в суд?), или это не додумано, и я должен сам повесить на нее preventDefault?
Еще какая-то фигня с модальными окнами: если повесить триггер не на кнопку, как показано в доках, а на ссылке, то модальное окошко будет грузить именно то, что расположено по этой ссылке.
Мне вообще-то нужно было, чтобы при отключенном js пользователь мог спокойно перейти по ссылке на форму редактирования, расположенную на другой странице.
Наверное придется изобретать трюк: сделать и ссылку, и кнопку, кнопка скрыта по умолчанию, а js меняет их местами, то есть делает ссылку скрытой, а кнопку отображает.
4. Нужна ли пагинация на аяксе? Мы ведь фактически запрашиваем большую часть страницы? Если надо сделаю (хотя задолбался и неохота), просто не вижу особого смысла. Одно дело, когда нужно получить одну строчку, другое дело обновляется 90% страницы.
5. У слима вроде есть свои методы для работы с сессией и куками, но у меня они используются в своих классах, это что, передавать весь объект приложения чтобы сделать $app->setCookie? Почему нельзя сделать родное setcookie?
6. Статические методы в твиге как использовать? Я насоздавал себе статических хелперов, которые отдают пути к файлам например, а в твиге оказывается их теперь не так просто использовать.
Подключил функцию вида return call_user_func_array("{$class}::{$method}", $args), но вызов в представлении получается громоздкий, тем более приходится писать полное пространство имен в имени класса.
7. Урок по исключениям читал. Но не понял, как практически использовать. Да-да, в тех местах, где "что-то может случиться", ставим try{}catch(){} и в кетче а) пишем в лог (писать свой логгер? не хотет, возьму готовый), б) выводим заглушку для пользователя, форбидден для робота.
Я не понимаю, в каких местах "может что-то случиться"? Подключение к базе, ага. Это при создании объекта pdo, или он ленивый и поключится только в момент execute?
Все exec/execute завернуть в try/catch?
Дальше, там у меня работа с файлами (создание превью например, может еще что, не помню). Господи, это мне весь код придется перечитывать и думать, где там может произойти ошибка.
8. Еще там у меня пара косяков в jquery, но скорее всего мне нужно просто отдохнуть.
Например, передо мной встала задача создать дерево элементов на лету, типа $("<div><p>test</p></div>"), а затем к вложенному p применить addClass("test").
Если создавать эти элементы из строки, то все работает. Но я беру контент из шаблона <s cript type="text/template" id="template">разметка</s cript>, $($("#template").html()) вот это не работает. Впрочем в этом не уверен, нужно перепроверить. В прошлый раз я полчаса мучился с addClass(".test"), точку по привычке поставил. Так что может и зедсь моя ошибка.
Еще мне нужно в списке комментариев поставить обработчик на каждый из комментариев (на ссылку #reply). Естественно, это нужно делать на родителе. Прикол в том, что внутри этого родительского элемента лежит еще и форма отправки комментария. Так что мой preventDefault, рассчитанный на то чтобы грохнуть ссылку, убьет и сабмит формы. Форму не охота вытаскивать из дерева комментариев, она должна открываться под тем комментарием, на который юзер отвечает.
А, блин, наверное придется делать через абсолютное позиционирование.
https://github.com/nsdvw/file-sharing
Вопросы.
1. Можно ли как-то использовать подготовленные выражения с sql оператором IN (...)? Мне нужно найти пользователей с id перечисленными в массиве.
Нашел несколько советов из гугла (либо лепить запрос руками и байндить поштучно, либо использовать трюк с mysql функциями типа find_in_set)
http://stackoverflow.com/questions/1586587/pdo-binding-values-for-mysql-in-statement/1586650#1586650
Использую второй вариант с функцией, но мало ли, вдруг у этого подхода есть недостатки (например при смене субд придется ходить и переписывать все запросы).
2. Что делать с импортированием классов? Если писать use для каждого, то это займет половину строк скрипта. Если не импортировать, а писать полный неймспейс, получаются длинные строки. Пока делаю так: импортирую только те классы, упоминание которых встречается более 1 раза. Но это же не по программерски, делать через раз без четкой системы. Может есть какой-нибудь стандарт? В php7 вроде пытались что-то с этим сделать, но вышло не очень, там всего лишь группировка по корневому неймспейсу.
3. Хотел пожаловаться на бутстрап. Оп тут проповедует семантичненькую верстку с минимумом тегов и четким разделением ответственности между css и html, а они там намешали вложенных дивов с десятками классов, пустые теги для создания иконок например, ссылки которые на самом деле кнопки и кнопки которые ссылки, ну и вообще черт знает что.
Но выглядит шикарно, ничего не скажешь.
А, в пагинаторе еще почему-то переход по заблокированной ссылке "Next" все равно происходит. То есть они конечно сделали ее серенькой, и даже ховер с зачеркнутой ручкой, только вот при клике переход происходит (на эту же страницу, тупо перезагрузка). Это так и задумано по каким-то левым соображениям (типа юзер может обидеться, почему в свободной стране ему запрещают перейти по ссылке и подать в суд?), или это не додумано, и я должен сам повесить на нее preventDefault?
Еще какая-то фигня с модальными окнами: если повесить триггер не на кнопку, как показано в доках, а на ссылке, то модальное окошко будет грузить именно то, что расположено по этой ссылке.
Мне вообще-то нужно было, чтобы при отключенном js пользователь мог спокойно перейти по ссылке на форму редактирования, расположенную на другой странице.
Наверное придется изобретать трюк: сделать и ссылку, и кнопку, кнопка скрыта по умолчанию, а js меняет их местами, то есть делает ссылку скрытой, а кнопку отображает.
4. Нужна ли пагинация на аяксе? Мы ведь фактически запрашиваем большую часть страницы? Если надо сделаю (хотя задолбался и неохота), просто не вижу особого смысла. Одно дело, когда нужно получить одну строчку, другое дело обновляется 90% страницы.
5. У слима вроде есть свои методы для работы с сессией и куками, но у меня они используются в своих классах, это что, передавать весь объект приложения чтобы сделать $app->setCookie? Почему нельзя сделать родное setcookie?
6. Статические методы в твиге как использовать? Я насоздавал себе статических хелперов, которые отдают пути к файлам например, а в твиге оказывается их теперь не так просто использовать.
Подключил функцию вида return call_user_func_array("{$class}::{$method}", $args), но вызов в представлении получается громоздкий, тем более приходится писать полное пространство имен в имени класса.
7. Урок по исключениям читал. Но не понял, как практически использовать. Да-да, в тех местах, где "что-то может случиться", ставим try{}catch(){} и в кетче а) пишем в лог (писать свой логгер? не хотет, возьму готовый), б) выводим заглушку для пользователя, форбидден для робота.
Я не понимаю, в каких местах "может что-то случиться"? Подключение к базе, ага. Это при создании объекта pdo, или он ленивый и поключится только в момент execute?
Все exec/execute завернуть в try/catch?
Дальше, там у меня работа с файлами (создание превью например, может еще что, не помню). Господи, это мне весь код придется перечитывать и думать, где там может произойти ошибка.
8. Еще там у меня пара косяков в jquery, но скорее всего мне нужно просто отдохнуть.
Например, передо мной встала задача создать дерево элементов на лету, типа $("<div><p>test</p></div>"), а затем к вложенному p применить addClass("test").
Если создавать эти элементы из строки, то все работает. Но я беру контент из шаблона <s cript type="text/template" id="template">разметка</s cript>, $($("#template").html()) вот это не работает. Впрочем в этом не уверен, нужно перепроверить. В прошлый раз я полчаса мучился с addClass(".test"), точку по привычке поставил. Так что может и зедсь моя ошибка.
Еще мне нужно в списке комментариев поставить обработчик на каждый из комментариев (на ссылку #reply). Естественно, это нужно делать на родителе. Прикол в том, что внутри этого родительского элемента лежит еще и форма отправки комментария. Так что мой preventDefault, рассчитанный на то чтобы грохнуть ссылку, убьет и сабмит формы. Форму не охота вытаскивать из дерева комментариев, она должна открываться под тем комментарием, на который юзер отвечает.
А, блин, наверное придется делать через абсолютное позиционирование.
>The Slim application’s log object will write log messages to slim.errors whenever an Exception is caught or the log object is manually invoked.
$app = new \Slim\Slim([
'slim.errors' => fopen('../error.log', 'a')
]);
Продолжает писать в stderr, то есть в системный лог и в браузер, а я хочу перенаправить в error.log
Прошу проверить задачу, указать на недостатки кода.
http://aqua.dreamtown.ua
http://dreamtown.ua
Они как бы по определённому закону реагируют на действия мышки вблизи, как называет такой эффект?
>Задача на тесты: https://gist.github.com/codedokode/8733007 - как тебе?
Отлично. За неё, думаю, и возьмусь в скором времени. Спасибо.
Раньше там Symfony не было в предлагаемых технологиях.
>Если хочешь что-то попроще - сделай клон ютуба. видео надо будет перекодировать с помощью очереди задач, сделать регистрацию, загрузку, просмотр, лайканье, дислайканье и комментирование видео.
Тоже может быть.
503 а не 403, ну оговорился.
По поводу исключений, пробежался по коду, я так понимаю нужно обработать места где работа с базой или файлами.
Для начала ловить PDOException в месте инициализации соединения.
На php.net написано что-то странное
http://php.net/manual/ru/pdo.error-handling.php
>Метод PDO::__construct() будет всегда бросать исключение PDOException, если соединение оборвалось
Как понимать "оборвалось"? Исключение будет брошено не только в момент создания соединения, но и в любой другой момент, если произошел разрыв? При чем тут тогда конструктор? Это наверное срабатывает деструктор, если соединение теряется, а не конструктор. Но кажется суть в том, что исключение будет брошено не только при отсутствии соединения в момент инициализации, но и в любой другой момент. То есть мне не нужно его ловить на селектах например? Достаточно только new PDO обернуть в try/catch?
Методы, сохраняющие что-то в базу (регистрация пользователя и зазгрузка файла, добавление комментария), наверное нужно отслеживать на исключение, связанное с нарушением внешнего или уникального ключа.
Функция move_uploaded_file вроде ничего сама не бросает. Но выдает какое-то предупреждение
> ...если файл не может быть перемещён по каким-либо причинам, никаких действий не предпринимается и move_uploaded_file() возвращает FALSE. Кроме того, отображается предупреждение.
Notice я так понял? А ошибки подавляются, если я оборачиваю в try/catch, или они живут своей жизнью, и пишутся как обычно в стандартный лог?
Ну короче тут надо бросить исключение. Непонятно правда что писать в message. Couldn't upload file :( Как-то вообще можно узнать причину, по которой не сработал move_uploaded_file? Скорее всего просто нет прав на запись, но все же.
Еще там есть генерация превью. В случае, если превью не существует, будет попытка его сгенерировать. Если и оригинального файла нет в папке upload, тогда нужно бросить исключение. Можно конечно просто поставить еще одну ветку в условии, типа если и оригинального файла нет, ну и ладно, будет пустое место с альт-текстом вместо картинки.
Но наверное это нехорошо, и лучше отслеживать такое, чтобы прочитал админ и настучал разработчикам.
У меня как раз только что произошла эта ошибка, когда клонировал свой репозиторий в другую папку ради теста установки. Все работает, а страница просмотра файла падает
c exception 'ErrorException' with message 'imagecreatefromjpeg(upload/4_374491.jpg.txt): failed to open stream: No such file or directory'
Запись в старой базе есть (мне лень было заливать новую), а файла ей соответствующего нет.
Только мне кажется тут в отличие от других случаев не нужно отдавать 503 и грустную страницу unavailable, не хватает всего лишь картинки. Так что в catch только записать в лог в этом случае.
По поводу логов я так и не понял, как писать в свой лог при помощи стандартного слимовского логгера. Вроде никак. Зато есть другой логгер от разработчиков https://github.com/codeguy/Slim-Logger
Вот тут у меня получилось записать свое сообщение, это мне нравится.
503 а не 403, ну оговорился.
По поводу исключений, пробежался по коду, я так понимаю нужно обработать места где работа с базой или файлами.
Для начала ловить PDOException в месте инициализации соединения.
На php.net написано что-то странное
http://php.net/manual/ru/pdo.error-handling.php
>Метод PDO::__construct() будет всегда бросать исключение PDOException, если соединение оборвалось
Как понимать "оборвалось"? Исключение будет брошено не только в момент создания соединения, но и в любой другой момент, если произошел разрыв? При чем тут тогда конструктор? Это наверное срабатывает деструктор, если соединение теряется, а не конструктор. Но кажется суть в том, что исключение будет брошено не только при отсутствии соединения в момент инициализации, но и в любой другой момент. То есть мне не нужно его ловить на селектах например? Достаточно только new PDO обернуть в try/catch?
Методы, сохраняющие что-то в базу (регистрация пользователя и зазгрузка файла, добавление комментария), наверное нужно отслеживать на исключение, связанное с нарушением внешнего или уникального ключа.
Функция move_uploaded_file вроде ничего сама не бросает. Но выдает какое-то предупреждение
> ...если файл не может быть перемещён по каким-либо причинам, никаких действий не предпринимается и move_uploaded_file() возвращает FALSE. Кроме того, отображается предупреждение.
Notice я так понял? А ошибки подавляются, если я оборачиваю в try/catch, или они живут своей жизнью, и пишутся как обычно в стандартный лог?
Ну короче тут надо бросить исключение. Непонятно правда что писать в message. Couldn't upload file :( Как-то вообще можно узнать причину, по которой не сработал move_uploaded_file? Скорее всего просто нет прав на запись, но все же.
Еще там есть генерация превью. В случае, если превью не существует, будет попытка его сгенерировать. Если и оригинального файла нет в папке upload, тогда нужно бросить исключение. Можно конечно просто поставить еще одну ветку в условии, типа если и оригинального файла нет, ну и ладно, будет пустое место с альт-текстом вместо картинки.
Но наверное это нехорошо, и лучше отслеживать такое, чтобы прочитал админ и настучал разработчикам.
У меня как раз только что произошла эта ошибка, когда клонировал свой репозиторий в другую папку ради теста установки. Все работает, а страница просмотра файла падает
c exception 'ErrorException' with message 'imagecreatefromjpeg(upload/4_374491.jpg.txt): failed to open stream: No such file or directory'
Запись в старой базе есть (мне лень было заливать новую), а файла ей соответствующего нет.
Только мне кажется тут в отличие от других случаев не нужно отдавать 503 и грустную страницу unavailable, не хватает всего лишь картинки. Так что в catch только записать в лог в этом случае.
По поводу логов я так и не понял, как писать в свой лог при помощи стандартного слимовского логгера. Вроде никак. Зато есть другой логгер от разработчиков https://github.com/codeguy/Slim-Logger
Вот тут у меня получилось записать свое сообщение, это мне нравится.
https://ideone.com/XYyTBQ - даже Идеоне говорит, как XYyёво быть TоBQй.
Задача на проверку и исправление ошибок.
Все замечания ОПа вроде бы учёл.
Никакие.
Вот переделал, спасибо за напоминание: https://ideone.com/hZQ6Gk
Также добавил условие для текста, в котором нет ошибок.
Вопрос: как прерывать выполнение всего скрипта, когда переменная соответствует определённому условию?
У меня исправление ошибок идёт отдельным циклом с foreach, он запускается и тогда, когда в предыдущем срабатывает
else {
echo "Ошибок не найдено.";
break;}
И получается, что ошибок не найдено, а текст исправляется.
Как скрипт остановить в этом случае?
Сразу в голову гуманитарию приходит муть с ещё одной проверкой текста в этом последнем цикле всеми регулярками сразу, в соответствии с которой текст либо меняется, либо не меняется.
Но пока гоню от себя первую пришедшую мысль, подожду советов.
Развивай привычку мыслить логически, вот годный учебник по логике.
>в рашке
ОП вряд ли мыслит подобными петушиными категориями.
Это видно и по его сайту, и по его ответам.
Ты это я, бро. Я тоже спустя полгода продолжил выполнять задачи ОПа. И тоже работаю в быдлоконторе.
Наверное как и мне ещё и зп маленькую платят, при том что приходится тянуть по несколько проектов самому?
Я как на конвеере. Мне дают заказ, я и дизайн спизжу и верстку сделаю, и заполню. И получаю за это 30к. И все это быстро сделать.
Тоже такое ощущение, если по началу я делал по проекту в месяц, и сильно нервничал по поводу того, что я не успеваю что-то, на выходных иногда работал и допоздна засиживался. Сейчас же уже какой-то похуизм выработался когда висит по 3-4 сайта на мне и дедлайн близко - всё равно стараюсь не сидеть дольше положенного, и голову не забиваю этим. Хотя иногда бывают интересные задачи, но в основном чувствую что скатывается в рутину, и всё больше дают сайтов под верстку+настройку функционала по мелочи. Грусть.
Ну ок, в россии. Климат и уровень сервиса лучше, еда лучше, ЗП тоже выше..
Поддвачну. Залипаю на ролики этого анона https://www.youtube.com/channel/UCTfdoffYyeLL2_8wtMbkLDA
(он, кстати, переодически постит в автаче), но боюсь пхп-макаке о таком и мечтать нельзя.
Кстати, тоже анимешник, как и ОП.
сша - говно, у вована(vovanjapan - видеоблогер рассказывающий о японии) есть запись с русским ученым который жил в японии а потом переехал в сша, тот говорит что в сша в общем примерно как в россии, но не такая разруха.
>боюсь пхп-макаке о таком и мечтать нельзя
PHP-developer'у можно как раз таки, вон Шамов(тоже блог о японии) вообще сисадмином работает, а это имхо уровень ниже, если сравнивать с грамотным разработчиком.
Ну вот то, что и пришло тогда в голову: https://ideone.com/b7y9Pf
К ОПобоязни добавилась ещё и говнокодобоязнь, хотя тут всё изначально связано.
Как такого избежать, чтобы не лепить дополнительную проверку регуляркой для прерывания скрипта в середине?
Мануал на php.net - по-любому.
А так читать просто для выяснения основных принципов, синтаксиса и т.п.
ОП, проверь еще одну, а я пока задачку про кратчайший путь исправлю.
http://ideone.com/vJPg7z
Надеюсь ты закроешь глаза на то, что я не сделал оформление таблицей, уж очень лень
Если ты подключаешь jquery, обрати внимание что у нас в ОП посте есть задачи на нее.
> Можно ли как-то использовать подготовленные выражения с sql оператором IN (...)?
Плейсхолдеров для массивов в PDO нет. Бери библиотеку где они есть (может doctrine dbal? не уверен) или пиши свою функцию для этого. Можешь поискать библиотеки-обертки для PDO, сравнить, написать тут про то какая удобнее.
> 2. Что делать с импортированием классов?
Я думаю проще всего писать use. У меня в sublime плагин какой-то есть, PHP helper или PHP companion, он сам вставляет use при нажатии F5 на имени класса.
На практике больше 10-15 импортов у тебя не будет. Если больше то возникают вопросы, а зачем тебе в одном файле столько классов.
> а они там намешали вложенных дивов с десятками классов, пустые теги для создания иконок например, ссылки которые на самом деле кнопки и кнопки которые ссылки, ну и вообще черт знает что.
Это да, но во-первых, он распространен и его надо знать, во-вторых, хорошо подходит для всяких админок, в-третьих, возможно без этих тегов не сделать то, что требуется.
> почему-то переход по заблокированной ссылке "Next" все равно происходит
Потому что в HTML нельзя запретить ссылку (инпуты - пожалуйста, а ссылку нет). Надо просто не выводить там тег a или выводить span.
Яваскрипт тут не требуется.
> Еще какая-то фигня с модальными окнами: если повесить триггер не на кнопку, как показано в доках, а на ссылке, то модальное окошко будет грузить именно то, что расположено по этой ссылке.
Почитай документацию или исходный код плагина. Может есть опция или можно что-то дописать.
> Мне вообще-то нужно было, чтобы при отключенном js пользователь мог спокойно перейти по ссылке на форму редактирования, расположенную на другой странице.
Правильная мысль. И я надеюсь что и обычная и аяксовая форма у тебя обрабатывается одним кодом. И ты также сделал HTML5 валидацию.
> Наверное придется изобретать трюк: сделать и ссылку, и кнопку, кнопка скрыта по умолчанию, а js меняет их местами, то есть делает ссылку скрытой, а кнопку отображает.
Для начала изучи код плагина.
> 4. Нужна ли пагинация на аяксе?
Мне кажется, нет. Ладно если бы это была какая-то часто используемая функция, но в общем случае нет смысла это делать.
> Если надо сделаю (хотя задолбался и неохота)
Это можно как-то автоматизировать, типа ты указываешь на ссылке свойство data-update="some-id" и он обновляет этот id на странице (а при открытии в новой вкладке или отсутсвии JS открывается обычная страница). И так можно «аяксизировать» любу. ссылку. Гитхаб по моему так делает, и есть готовые плагины, но в них надо разбираться а не вешать бездумно.
Если делаешь аякс-ссылки - проверяй что меню правой кнопки на ссылке полноценно работает.
> 5. У слима вроде есть свои методы для работы с сессией и куками, но у меня они используются в своих классах, это что, передавать весь объект приложения чтобы сделать $app->setCookie?
Там есть 2 объекта для чтения и записи кук, по моему $app->request->cookies, $app->response->cookies - можно передавать только нужный.
> Почему нельзя сделать родное setcookie?
Потому что плагины или расширения делающие что-то с куками, не увидят их. Ну и вообще, если в фреймворке есть способ, то надо использовать его.
> 6. Статические методы в твиге как использовать?
Можно создать функцию в твиге:
http://twig.sensiolabs.org/doc/advanced.html#functions
http://twig.sensiolabs.org/doc/advanced.html#filters
(почитай вообще всю эту страницу)
или можно переделать на нестатический.
Если ты подключаешь jquery, обрати внимание что у нас в ОП посте есть задачи на нее.
> Можно ли как-то использовать подготовленные выражения с sql оператором IN (...)?
Плейсхолдеров для массивов в PDO нет. Бери библиотеку где они есть (может doctrine dbal? не уверен) или пиши свою функцию для этого. Можешь поискать библиотеки-обертки для PDO, сравнить, написать тут про то какая удобнее.
> 2. Что делать с импортированием классов?
Я думаю проще всего писать use. У меня в sublime плагин какой-то есть, PHP helper или PHP companion, он сам вставляет use при нажатии F5 на имени класса.
На практике больше 10-15 импортов у тебя не будет. Если больше то возникают вопросы, а зачем тебе в одном файле столько классов.
> а они там намешали вложенных дивов с десятками классов, пустые теги для создания иконок например, ссылки которые на самом деле кнопки и кнопки которые ссылки, ну и вообще черт знает что.
Это да, но во-первых, он распространен и его надо знать, во-вторых, хорошо подходит для всяких админок, в-третьих, возможно без этих тегов не сделать то, что требуется.
> почему-то переход по заблокированной ссылке "Next" все равно происходит
Потому что в HTML нельзя запретить ссылку (инпуты - пожалуйста, а ссылку нет). Надо просто не выводить там тег a или выводить span.
Яваскрипт тут не требуется.
> Еще какая-то фигня с модальными окнами: если повесить триггер не на кнопку, как показано в доках, а на ссылке, то модальное окошко будет грузить именно то, что расположено по этой ссылке.
Почитай документацию или исходный код плагина. Может есть опция или можно что-то дописать.
> Мне вообще-то нужно было, чтобы при отключенном js пользователь мог спокойно перейти по ссылке на форму редактирования, расположенную на другой странице.
Правильная мысль. И я надеюсь что и обычная и аяксовая форма у тебя обрабатывается одним кодом. И ты также сделал HTML5 валидацию.
> Наверное придется изобретать трюк: сделать и ссылку, и кнопку, кнопка скрыта по умолчанию, а js меняет их местами, то есть делает ссылку скрытой, а кнопку отображает.
Для начала изучи код плагина.
> 4. Нужна ли пагинация на аяксе?
Мне кажется, нет. Ладно если бы это была какая-то часто используемая функция, но в общем случае нет смысла это делать.
> Если надо сделаю (хотя задолбался и неохота)
Это можно как-то автоматизировать, типа ты указываешь на ссылке свойство data-update="some-id" и он обновляет этот id на странице (а при открытии в новой вкладке или отсутсвии JS открывается обычная страница). И так можно «аяксизировать» любу. ссылку. Гитхаб по моему так делает, и есть готовые плагины, но в них надо разбираться а не вешать бездумно.
Если делаешь аякс-ссылки - проверяй что меню правой кнопки на ссылке полноценно работает.
> 5. У слима вроде есть свои методы для работы с сессией и куками, но у меня они используются в своих классах, это что, передавать весь объект приложения чтобы сделать $app->setCookie?
Там есть 2 объекта для чтения и записи кук, по моему $app->request->cookies, $app->response->cookies - можно передавать только нужный.
> Почему нельзя сделать родное setcookie?
Потому что плагины или расширения делающие что-то с куками, не увидят их. Ну и вообще, если в фреймворке есть способ, то надо использовать его.
> 6. Статические методы в твиге как использовать?
Можно создать функцию в твиге:
http://twig.sensiolabs.org/doc/advanced.html#functions
http://twig.sensiolabs.org/doc/advanced.html#filters
(почитай вообще всю эту страницу)
или можно переделать на нестатический.
Удваиваю. Знающие, подскажите. Неохота осваивать PHP, чтобы пилить вордпрессы до конца жизни.
>>621513
>Загрузку файла наверно надо вынести в отдельные методы
Я ведь уже делал загрузку файла в методе класса файла, ты сказал, что этот код должен быть в контроллере, а не в модели. Так в какие методы её выносить? Хелпер это ведь тоже модель.
> 7. Урок по исключениям читал. Но не понял, как практически использовать.
При исключении выбрасываешь throw. Если тебе надо ловить это исключение - делаешь свой класс и ловишь его, но в 99% случаев это не требуется. В 99% случаев catch у тебя один на всю программу. Вот еще паста:
-------------
Как надо обрабатывать исключения (и как делает Слим по умолчанию):
- записать информацию в лог
- показать пользователю заглушку
- на заглушке выставить HTTP 503 код ответа для роботов
- на компьютере разработчика (при display_errors = 1 или debug=true) показать подробности и стектрейс
Если как в плохих учебниках сделать catch + echo то:
- в лог ничего не фиксируется, ты не узнаешь об ошибках
- пользователь видит непонятную белиберду на английском
- отдается код 200
Как будет если просто не ловить исключение:
- информация пишется в лог (ок)
- на компьютере разработчика выводятся подробности (ок)
- пользователь видит белую страницу (не ок)
- отдается код 200 (не ок)
--------------------
То есть либо не делай catch либо сделай один-единственный catch в охватывающий все приложение и выводящий заглушку.
В Слиме делать catch не надо так как там такой catch уже есть (а еще слим преобразует все варинги и нотисы в исключение за что ему отдельное спасибо). Ты можешь переопределить вид страницы-заглушки, но тогда и логгирование ложится на тебя.
Задавай вопросы еще если что.
> Это при создании объекта pdo, или он ленивый и поключится только в момент execute?
Не знаю, проверь создав объект, сделав sleep, посмотри в базе процессы через SHOW fuLL PROCESSLIST, есть соединение или нет. Или программой WireShark если ты под виндой.
> Я не понимаю, в каких местах "может что-то случиться"?
Хочешь прочитать конфиг, а его нет. Или ждешь что на вход функции придет число больше нуля, а пришло меньше нуля. Или отпарвляешь запрос к АПИ, а приходит в ответ код HTTP 500.
> Все exec/execute завернуть в try/catch
Исключения придумывались как раз для того чтобы этого не требовалось.
> Дальше, там у меня работа с файлами (создание превью например, может еще что, не помню). Господи, это мне весь код придется перечитывать и думать, где там может произойти ошибка.
Слим по умолчанию превращает варнинги и нотисы в исключения. Но код перечитать возможно стоит.
> $($("#template").html()) вот это не работает. В
Посмотри что выведет $('#tpl').html(). Возможно, надо взять html(), преобразовать как тебе надо и вставить на страницу через $('.div').html(html);
jQuery по моему воспринимает строку как hTML только если она начинается с < (иначе он считает ее селектором).
Я тебе не советую полагаться вообще на это автоопределение типа, это не надежно. Там есть готовая функция именно для HTML, http://api.jquery.com/jquery.parsehtml/
> Еще мне нужно в списке комментариев поставить обработчик на каждый из комментариев (на ссылку #reply). Естественно, это нужно делать на родителе.
$.on по моему
> Прикол в том, что внутри этого родительского элемента лежит еще и форма отправки комментария. Так что мой preventDefault, рассчитанный на то чтобы грохнуть ссылку, убьет и сабмит формы.
Надо указать правильный селектор в $.on
> А, блин, наверное придется делать через абсолютное позиционирование.
не стоит. Стоит внимательно изучить возможности jquery по установке обработчиков. Также, если есть время и желание, можешь взять наши задачи на DOM и решить их с использованием jQuery.
> Использую второй вариант с функцией, но мало ли, вдруг у этого подхода есть недостатки (например при смене субд придется ходить и переписывать все запросы).
Это костыль какой-то, лучше бы через IN.
Код особо не смотрел пока, вот что бросается:
https://github.com/nsdvw/file-sharing/blob/master/web/js/comment-ajax.js#L4
> var errorBox = $("#commentForm .text-danger");
Мне не очень нравится селетктор. Там написано: «блоки с ошибкой в форме комментариев». Но что если верстальщик поменяет стиль например с text-danger на text-info? ЧТо если он добавит позже еще такой блок в форму? Это явно хрупкий код, меняя верстку ты ломаешь работу JS скрипта.
Я могу придумать такие способы решения:
- использование префикса js- для классов/id которые нужны не в верстке, а в скрипте. Вроде так делают на гитхабе- глянь-ка код страницы.
- использование data атрибутов
- использование более явного названия класса: #commentForm form-error-message
В общем подумай над поддерживаемостью твоего кода.
Также, если не используешь HTML5 валидацию то подумай над ее добавлением (если это не конфликтует с твоим кодом конечно). Ее использовать может быть проще чем писать это в JS коде, и править потом этот код тоже проще. Также подумай над тем что клиентская и серверная валидация дублируют друг друга (но решение можешь пока не искать - в твоем приложении это вряд ли реализуешь без сложного фреймворка).
> https://github.com/nsdvw/file-sharing/blob/master/web/js/comment-ajax.js#L8
> var form = document.forms.comment_form;
Не стоит это использовать, это древний способ, лучше использовать jQuery тут.
> var formData = new FormData(form);
В HTML4-браузерах нет FormData, а preventDefault ты уже вызвал. В них форма не будет работать даже в обычном режиме.
> var replyID = form.querySelector(".replyID").value;
Не стоит смешивать поиск через jQuery и DOM. Также, элементы формы удобнее всего искать по имени, name, а не по классу.
> window.location.pathname.split("/").pop()
Это надо сделать функцией, и я кстати не понимаю, зачем это. Если это id файла то его надо передавать в яваскрипт явно, а не вытаскивать такими вот хаками. Что если мы разместим форму на странице с другим URL? Все сломается.
Все входные переменные надо передавать явно из PHP через тег скрипт на странице и json_encode:
var fileId = {{ fileId | json_encode | raw }};
Предлагаю тебе самому подумать почему и зачем тут json_encode и raw.
> $(function () {
Возможно лучше использовать явную инициализацию, вызывая функцию инициализации из тела страницы. По моему так лучше, и видно где функция инициализации, и запускается только то что нужно на странице.
Форму или кнопки отправки надо блокировать на время отправки запроса.
Также, тут явно некоторые вещи можно вынести в функции, а не писать весь JS сплошной стеной.
также, у тебя в JS коде нет приема ошибок от сервера. как серверу сообщить об ошибке?
Также, мне не нравится что по коду много раз разбросан селектор "#commentForm. Лучше наверно получить этот объект один раз в начале кода.
Не уверен, нужен ли шаблон комментария в JS коде. Тут нет дублирования серверного шаблона? И если уж делать шаблон, то делать его как шаблон, а не вот так:
$(".media-heading", template).text(login);
$(".comment-text", template).text(comment.contents);
Это же неудобно. Лучше сделать мини-язык наподобие твига или найти готовый шаблонизатор.
> errorBox.text("Message is empty!");
Это лучше вынести в функцию вроде showError()
> 7. Урок по исключениям читал. Но не понял, как практически использовать.
При исключении выбрасываешь throw. Если тебе надо ловить это исключение - делаешь свой класс и ловишь его, но в 99% случаев это не требуется. В 99% случаев catch у тебя один на всю программу. Вот еще паста:
-------------
Как надо обрабатывать исключения (и как делает Слим по умолчанию):
- записать информацию в лог
- показать пользователю заглушку
- на заглушке выставить HTTP 503 код ответа для роботов
- на компьютере разработчика (при display_errors = 1 или debug=true) показать подробности и стектрейс
Если как в плохих учебниках сделать catch + echo то:
- в лог ничего не фиксируется, ты не узнаешь об ошибках
- пользователь видит непонятную белиберду на английском
- отдается код 200
Как будет если просто не ловить исключение:
- информация пишется в лог (ок)
- на компьютере разработчика выводятся подробности (ок)
- пользователь видит белую страницу (не ок)
- отдается код 200 (не ок)
--------------------
То есть либо не делай catch либо сделай один-единственный catch в охватывающий все приложение и выводящий заглушку.
В Слиме делать catch не надо так как там такой catch уже есть (а еще слим преобразует все варинги и нотисы в исключение за что ему отдельное спасибо). Ты можешь переопределить вид страницы-заглушки, но тогда и логгирование ложится на тебя.
Задавай вопросы еще если что.
> Это при создании объекта pdo, или он ленивый и поключится только в момент execute?
Не знаю, проверь создав объект, сделав sleep, посмотри в базе процессы через SHOW fuLL PROCESSLIST, есть соединение или нет. Или программой WireShark если ты под виндой.
> Я не понимаю, в каких местах "может что-то случиться"?
Хочешь прочитать конфиг, а его нет. Или ждешь что на вход функции придет число больше нуля, а пришло меньше нуля. Или отпарвляешь запрос к АПИ, а приходит в ответ код HTTP 500.
> Все exec/execute завернуть в try/catch
Исключения придумывались как раз для того чтобы этого не требовалось.
> Дальше, там у меня работа с файлами (создание превью например, может еще что, не помню). Господи, это мне весь код придется перечитывать и думать, где там может произойти ошибка.
Слим по умолчанию превращает варнинги и нотисы в исключения. Но код перечитать возможно стоит.
> $($("#template").html()) вот это не работает. В
Посмотри что выведет $('#tpl').html(). Возможно, надо взять html(), преобразовать как тебе надо и вставить на страницу через $('.div').html(html);
jQuery по моему воспринимает строку как hTML только если она начинается с < (иначе он считает ее селектором).
Я тебе не советую полагаться вообще на это автоопределение типа, это не надежно. Там есть готовая функция именно для HTML, http://api.jquery.com/jquery.parsehtml/
> Еще мне нужно в списке комментариев поставить обработчик на каждый из комментариев (на ссылку #reply). Естественно, это нужно делать на родителе.
$.on по моему
> Прикол в том, что внутри этого родительского элемента лежит еще и форма отправки комментария. Так что мой preventDefault, рассчитанный на то чтобы грохнуть ссылку, убьет и сабмит формы.
Надо указать правильный селектор в $.on
> А, блин, наверное придется делать через абсолютное позиционирование.
не стоит. Стоит внимательно изучить возможности jquery по установке обработчиков. Также, если есть время и желание, можешь взять наши задачи на DOM и решить их с использованием jQuery.
> Использую второй вариант с функцией, но мало ли, вдруг у этого подхода есть недостатки (например при смене субд придется ходить и переписывать все запросы).
Это костыль какой-то, лучше бы через IN.
Код особо не смотрел пока, вот что бросается:
https://github.com/nsdvw/file-sharing/blob/master/web/js/comment-ajax.js#L4
> var errorBox = $("#commentForm .text-danger");
Мне не очень нравится селетктор. Там написано: «блоки с ошибкой в форме комментариев». Но что если верстальщик поменяет стиль например с text-danger на text-info? ЧТо если он добавит позже еще такой блок в форму? Это явно хрупкий код, меняя верстку ты ломаешь работу JS скрипта.
Я могу придумать такие способы решения:
- использование префикса js- для классов/id которые нужны не в верстке, а в скрипте. Вроде так делают на гитхабе- глянь-ка код страницы.
- использование data атрибутов
- использование более явного названия класса: #commentForm form-error-message
В общем подумай над поддерживаемостью твоего кода.
Также, если не используешь HTML5 валидацию то подумай над ее добавлением (если это не конфликтует с твоим кодом конечно). Ее использовать может быть проще чем писать это в JS коде, и править потом этот код тоже проще. Также подумай над тем что клиентская и серверная валидация дублируют друг друга (но решение можешь пока не искать - в твоем приложении это вряд ли реализуешь без сложного фреймворка).
> https://github.com/nsdvw/file-sharing/blob/master/web/js/comment-ajax.js#L8
> var form = document.forms.comment_form;
Не стоит это использовать, это древний способ, лучше использовать jQuery тут.
> var formData = new FormData(form);
В HTML4-браузерах нет FormData, а preventDefault ты уже вызвал. В них форма не будет работать даже в обычном режиме.
> var replyID = form.querySelector(".replyID").value;
Не стоит смешивать поиск через jQuery и DOM. Также, элементы формы удобнее всего искать по имени, name, а не по классу.
> window.location.pathname.split("/").pop()
Это надо сделать функцией, и я кстати не понимаю, зачем это. Если это id файла то его надо передавать в яваскрипт явно, а не вытаскивать такими вот хаками. Что если мы разместим форму на странице с другим URL? Все сломается.
Все входные переменные надо передавать явно из PHP через тег скрипт на странице и json_encode:
var fileId = {{ fileId | json_encode | raw }};
Предлагаю тебе самому подумать почему и зачем тут json_encode и raw.
> $(function () {
Возможно лучше использовать явную инициализацию, вызывая функцию инициализации из тела страницы. По моему так лучше, и видно где функция инициализации, и запускается только то что нужно на странице.
Форму или кнопки отправки надо блокировать на время отправки запроса.
Также, тут явно некоторые вещи можно вынести в функции, а не писать весь JS сплошной стеной.
также, у тебя в JS коде нет приема ошибок от сервера. как серверу сообщить об ошибке?
Также, мне не нравится что по коду много раз разбросан селектор "#commentForm. Лучше наверно получить этот объект один раз в начале кода.
Не уверен, нужен ли шаблон комментария в JS коде. Тут нет дублирования серверного шаблона? И если уж делать шаблон, то делать его как шаблон, а не вот так:
$(".media-heading", template).text(login);
$(".comment-text", template).text(comment.contents);
Это же неудобно. Лучше сделать мини-язык наподобие твига или найти готовый шаблонизатор.
> errorBox.text("Message is empty!");
Это лучше вынести в функцию вроде showError()
> function refreshCaptcha() {
> $("#captcha-img").attr("src", "/image/captcha_generator.php");
> }
Обновление картинки может занять много времени. При этом пользователь будет видеть старую картинку и может попытаться ее разгадать. подумай как этого избежать. Также, надо очищать поле с кодом. также, нужна кнопка явного обновления капчи.
http://www.php.su/mysql/?fields
TINYTEXT - Максимальная длина 255 символов
TEXT - Максимальная длина 65535 символов (64 Кб)
MEDIUMTEXT - Максимальная длина 16 777 215 символов
LONGTEXT - Максимальная длина 4 294 967 295 символов
https://github.com/fxsloker/Student
ОП, я обновил код немного. Посмотри на роутер. И я создал сущность. А еще я подумал, если у меня нужно работать с одной моделью почему бы и не использовать только один контроллер? Можно так и правильно ли так?
Надо смотреть английскую версию.
> Note:
> PDO::__construct() will always throw a PDOException if the connection fails regardless of which PDO::ATTR_ERRMODE is currently set. Uncaught Exceptions are fatal.
Тут имеется в виду что при ошибке установки соединения исключение бросается всегда. Что будет при разрыве уже установленного соединения в других режимах я не знаю, но мы используем только ERRMODE_EXCEPTION так что у нас будет в любом случае исключение. И это хорошо.
> Это наверное срабатывает деструктор, если соединение теряется, а не конструктор.
Нет, деструктор это при удалении объекта сборщиком мусора или счетчиком ссылок.
> То есть мне не нужно его ловить на селектах например?
Исключения для того и придуманы чтобы не проверять результаты вызова функций и ничего не оборачивать.
> Достаточно только new PDO обернуть в try/catch?
Такой try/catch поймает только ошибки при создании объекта. Но тебе это не надо.
> Методы, сохраняющие что-то в базу (регистрация пользователя и зазгрузка файла, добавление комментария), наверное нужно отслеживать на исключение, связанное с нарушением внешнего или уникального ключа.
не надо делать запросы, которые могут нарушить внешний ключ. А если сделал то значит в программе ошибка и надо ее исправить. Ловить этот случай не надо.
> Функция move_uploaded_file вроде ничего сама не бросает. Но выдает какое-то предупреждение
Слим преобразует PHP предупреждения в исключения, по моему вот в такие: http://php.net/manual/ru/class.errorexception.php
И правильно делает. Это принцип fail fast: http://habrahabr.ru/post/218325/ - он экономит твое время.
> А ошибки подавляются, если я оборачиваю в try/catch, или они живут своей жизнью, и пишутся как обычно в стандартный лог?
По умолчанию ошибки и try/catch вобще никак не связаны. Но Слим преобразует ошибки в исключения. Но ты не должен пытаться их ловить, так как они говорят об ошибке в коде программы и что надо ее исправить.
Вообще ловить исключения надо очень редко. И обычно их ловят только для того, чтобы что-то отменить или освододить и выкинуть исключение дальше. ну например, откатить выполнявшуюся транзацию. Вот пример кода, функция. которая выполняет переданный код внутри транзакции: https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php#L1086
Там исключение ловится, транзакция откатывается и исключение бросается дальше. То есть они не останавливают его распространение, ничего с ним не делают, они просто используют catch чтобы узнать об ошибке в коде и отменить транзакцию.
Но если ты не пишешь библиотеку, то скорее всего тебе вообще ловить ничего нигде не надо.
> Непонятно правда что писать в message. Couldn't upload file :( Как-то вообще можно узнать причину, по которой не сработал move_uploaded_file? Скорее всего просто нет прав на запись, но все же.
Вообще через http://php.net/manual/ru/function.error-get-last.php но в данном случае Слим сам создаст ислючение из варнинга и запишет в него причину.
Вот это место в Слиме:
https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L1293
https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L1406
Изучи этот код и мануал по set_error_handler.
> Можно конечно просто поставить еще одну ветку в условии, типа если и оригинального файла нет, ну и ладно, будет пустое место с альт-текстом вместо картинки.
Правильно наверно исключение, а разработчик пусть разбирается куда делся файл. Или пусть удалит его и из базы.
> По поводу логов я так и не понял, как писать в свой лог при помощи стандартного слимовского логгера.
Код/документацию смотрел?
Надо смотреть английскую версию.
> Note:
> PDO::__construct() will always throw a PDOException if the connection fails regardless of which PDO::ATTR_ERRMODE is currently set. Uncaught Exceptions are fatal.
Тут имеется в виду что при ошибке установки соединения исключение бросается всегда. Что будет при разрыве уже установленного соединения в других режимах я не знаю, но мы используем только ERRMODE_EXCEPTION так что у нас будет в любом случае исключение. И это хорошо.
> Это наверное срабатывает деструктор, если соединение теряется, а не конструктор.
Нет, деструктор это при удалении объекта сборщиком мусора или счетчиком ссылок.
> То есть мне не нужно его ловить на селектах например?
Исключения для того и придуманы чтобы не проверять результаты вызова функций и ничего не оборачивать.
> Достаточно только new PDO обернуть в try/catch?
Такой try/catch поймает только ошибки при создании объекта. Но тебе это не надо.
> Методы, сохраняющие что-то в базу (регистрация пользователя и зазгрузка файла, добавление комментария), наверное нужно отслеживать на исключение, связанное с нарушением внешнего или уникального ключа.
не надо делать запросы, которые могут нарушить внешний ключ. А если сделал то значит в программе ошибка и надо ее исправить. Ловить этот случай не надо.
> Функция move_uploaded_file вроде ничего сама не бросает. Но выдает какое-то предупреждение
Слим преобразует PHP предупреждения в исключения, по моему вот в такие: http://php.net/manual/ru/class.errorexception.php
И правильно делает. Это принцип fail fast: http://habrahabr.ru/post/218325/ - он экономит твое время.
> А ошибки подавляются, если я оборачиваю в try/catch, или они живут своей жизнью, и пишутся как обычно в стандартный лог?
По умолчанию ошибки и try/catch вобще никак не связаны. Но Слим преобразует ошибки в исключения. Но ты не должен пытаться их ловить, так как они говорят об ошибке в коде программы и что надо ее исправить.
Вообще ловить исключения надо очень редко. И обычно их ловят только для того, чтобы что-то отменить или освододить и выкинуть исключение дальше. ну например, откатить выполнявшуюся транзацию. Вот пример кода, функция. которая выполняет переданный код внутри транзакции: https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php#L1086
Там исключение ловится, транзакция откатывается и исключение бросается дальше. То есть они не останавливают его распространение, ничего с ним не делают, они просто используют catch чтобы узнать об ошибке в коде и отменить транзакцию.
Но если ты не пишешь библиотеку, то скорее всего тебе вообще ловить ничего нигде не надо.
> Непонятно правда что писать в message. Couldn't upload file :( Как-то вообще можно узнать причину, по которой не сработал move_uploaded_file? Скорее всего просто нет прав на запись, но все же.
Вообще через http://php.net/manual/ru/function.error-get-last.php но в данном случае Слим сам создаст ислючение из варнинга и запишет в него причину.
Вот это место в Слиме:
https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L1293
https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L1406
Изучи этот код и мануал по set_error_handler.
> Можно конечно просто поставить еще одну ветку в условии, типа если и оригинального файла нет, ну и ладно, будет пустое место с альт-текстом вместо картинки.
Правильно наверно исключение, а разработчик пусть разбирается куда делся файл. Или пусть удалит его и из базы.
> По поводу логов я так и не понял, как писать в свой лог при помощи стандартного слимовского логгера.
Код/документацию смотрел?
Я наверно сказал из-за того что ты работу с FILES или POST в класс засунул. Это должно быть в index.php наверно. Ну идея примерно такая:
if (форма запощена) {
$file = $helper->validateFile(.....);
if (ошибок ент) {
$helper->saveFile($file);
redirect...;
}
}
вот как-то так должно быть в контроллере, мне кажется. Стандартный алгоритм работы с формой.
как раз проверить что там нет ошибки, что размер разрешенный, может потом еще что-то добавится.
Сейчас тоже проверяется, обчным ифом, а если ошибка есть - выбрасывается исключение с кодом ошибки и текстом.
Шта?
С логикой проблем у меня нет. Мои проблемы в том, что на информатике у нас не преподавали языки, у меня абсолютно нет опыта в таком.
Когда ты знаешь, что нужно сделать, но не вполне понимаешь, как это нужно сделать, - это не с логикой проблемы.
Заросы выполнять буду через класс для работы с сокетами (класс 2).
Чтобы не прописывать в классе 1 методы класса 2 я решил что можно передать эти методы как параметры в конструкторе а дальше дергать их когда нужно. Как это реализовать?
31 год, филологическое образование, работаю редактором в издательстве.
HTML, CSS Wordpress, SEO.
без образования и только с английским - реально? есть 300к и даже больше
http://ideone.com/PlYb5t
Эта база использовалась с какой-то самопальной CMS, которая таки отоброжала русский текст нормально. Я в php профан, но вангую что есть какая то функция init_i18_new_kirilica_mb_init(true) которую нужно вызывать в начале скрипта, и все будет ок.
Для собственного проекта.
Ровно год назад появлялся в этом треде, спрашивал у ОПа советов мудрых, как быть.
ОП посоветовал изучать РНР, нанимать на фрилансе людей для сложных моментов.
Я внял только частично: решил полностью заказать на фрилансе весь проект, а вместо изучения просто расписывал ТЗ для создания проекта.
В итоге фрилансеры не справились с задачами (либо затягивали, либо откровенно обманывали), надоело это терпеть, решил всё изучить самостоятельно.
Теперь думаю изучить учебник ОПа, всё далее из ОП-поста, затем фреймворк Yii2, а потом заказывать отдельные элементы и системы для проекта, самостоятельно их интегрировать в него.
Такие вот дела.
Это уже сталь принципиальным, потому что потрачено много времени, какие-то деньги, многие оказались втянуты в него, имеются большие перспективы.
Я когда подтяну знания, то многих знакомых анончиков приглашу, там работы много будет разнообразной.
И тут тоже буду искать людей, это точно.
Один фрилансер мне месяц канифолил мозги с модулем для регистрации - туда надо было интегрировать пять самых популярных социальных сетей, а также выбор группы пользователей при регистрации, к которой регистрирующийся себя относит, по желанию ввод личных данных сразу (номера телефона, имя-фамилии).
В итоге сделал простую интеграцию модуля от uLogin, попытался сдать в таком виде...
А ты ответственен ли, анончик?
>Нанял толпу быдлокодеров за гроши
>Внезапно кинули/не справились
> тут тоже буду искать людей, это точно
Необучаемый.
Зря выбрал PHP туда ли ты зашел, питушок, поведают мне, но ничего личного, пацаны. Бери питон, там средний исполнитель в разы адекватнее. Плати по часам и с трекером. Очень часто бывает, что исполнитель лажает с определением сроков и ему становится понятно, что проще кинуть тебя, чем доделывать; плюс при фикседе есть мотивация сделать тяп-ляп и сдать говно. Будь готов, что названный срок будет проебан в 3 раза при оценке твоего бюджета и рейта, фактическую оплату делай раз в две недели-месяц, работа должна вестись в виде ежедневных коммитов в репозиторий, который ты можешь чекать - чтобы не слушать "бля, я все сделал, но в провайдера попала молния и я не могу выложить" с последующим сливом через неделю.
И все, неадекватов ты быстро отсеешь. Но и самому придется попотеть, контролируя процесс.
Допустим есть файл ғғғғғғғғғғғғ.hui мне нужно его записать в директорию или, например, что в принципе не важно считать имя этого файла, я получаю полную лабуду вида Т“Т“Т“Т“Т“Т“Т“Т“Т“Т“Т“Т“.hui
использовал при этом такие функции как scandir и iconv
Спасибо, братишка, толковые советы.
Питон советовали многие, да, но я как-то два года назад уже пробовал читать книгу по РНР, поэтому решил и продолжить. К тому же, часть уже реализована, в которой надо разбираться и которую надо улучшать, а там всё на РНР+JS.
>Но и самому придется попотеть, контролируя процесс.
Я уже втянулся, мне это нравится.
я имел ввиду туристом, эта сумма на 2-3 недели, с английским там все хуево.
Хотел бы попробовать как-то зарабатывать на фрилансе вначале, но никак не могу решиться попробовать. Кстати, тут говорят о какой-то работе, нужно что то кому то? Может дадите мне попробовать?
Сделай мне сайт по инфе из вебархива. Только вордпресс не нужен, статики и бутстрэпа достаточно.
Само собой уровень России и Японии даже сравнивать нельзя, как и России и США и других подобных стран. Однако, айтишники сейчас практически по всему миру на одинаковом уровне, заработки если смотреть по ППС сравнимы. Ну что касательно других специальностей, то конечно всё совсем иначе.
Мимокрокодил
Ничего, у меня когда-то спиздили домен, нужно сайт восстановить и сделать стильно-модно-молодежно, а не как делал я на таблицах в 2007.
В Японии для тебя карьерный рост заказан.
А, понял, я думал нужен какой-то сайт, который будет делать что то с информацией полученной из сайта вебархива. Я не умею в дизайн, могу только немного в вёрстку и само собой ПХП. Где можно посмотреть информацию о твоём сайте?
Мне переверстать нужно как раз, с таблиц на бутстрэп. Мыльцо дай, какой смысл этот тут обсуждать.
>знакомых анончиков
как вы это делаете? тут же анонимно всё, я один тут годами сижу и никого не знаю лично?
Анкетки в соц постят, а потом по контактам или скайпикам всем табуном шароебятся по интересам. Очевидно же.
Ты правильно решил. Если ты сам не разбираешься в каких-то технических вещах то не можешь эффективно управлять фрилансерами. Чтобы работать с фрилансерами надо либо самому быть специалистом, либо иметь лояльного специалиста который будет ими управлять. Иначе тебе навешают лапши на уши. Потому да, тебе стоит наверно научиться самому делать приложения. Проходи быстрее учебник и берись за студентов и файлообменник. Можешь его попробовать сразу на Юи делать, хотя конечно для маленького проекта Слим лучше бы подошел.
Его проблема в том что он не может правильно оценить квалификацию фрилансера и предлагаемые решения. Например он может не знать что задача решается готовым модулем и согласится на написание велосипеда.
Какая ОС? Если винда то с каким языком? Если казахский то какие у вас кодировки используются? 1251 (кириллица) как у нас или что-то свое?
Под виндой в функции работы с файлами в PHP надо передавать данные в виндовой кодировке. Если ты используешь utf-8 то имена файлов для функций PHP надо перекодировать в виндокодировку. И соответственно если ты читаешь список файлов с диска то надо перекодировать обратно.
Под линуксом и маком файловые функции работают обычно в utf-8, ничего делать не требуется.
Айдион http://ideone.com/h1bjyG
Почему не высчитывается? Высчитывается. Только ее составные части - $amountM * $percent не меняются в цикле.
мимо не пишу на пхп
>поискать библиотеки-обертки для PDO, сравнить
Я не могу сравнивать, из-за отсутствия опыта непонятно на что ориентироваться, по каким критериям сравнивать. Могу искать только под конкретную задачу.
Ну вот например тут понадобилось подставлять массивы в запросы с условием IN.
Да, у доктрины, вернее ее компонента (?) dbal (abstract level) имеются такие средства.
http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion
Но я не могу прикинуть, насколько большая эта библиотека и целесообразно ли ее подключать ради одного проблемного запроса. Лучше напишу свою функцию/метод, где запрос будет слепливаться в цикле и там же привязать параметры.
Я так понимаю доктрина это королева orm, как симфони среди фреймворков, и любой ее компонент мощный самостоятельный пакет.
Попробуем поискать чего-нибудь помельче.
FluentPDO приглянулась. Простая, быстрая (хотя так все говорят), и с широкими возможностями. Нашу проблему array binding решает:
https://github.com/lichtner/fluentpdo/blob/0092fc16dbef345a61ce2c448f98f75c99886b30/tests/07-where-column-array.phpt#L8
И автор оперативно реагирует: в issues клянчили 'not in' условие, запушил спустя неделю https://github.com/lichtner/fluentpdo/issues/81
Добавил в закладки, но сейчас она мне особо ни к чему.
Совсем низкоуровневая библиотека:
https://github.com/auraphp/Aura.Sql#array-quoting
Просто квотят каждый элемент массива, потом склеивают:
https://github.com/auraphp/Aura.Sql/blob/2.x/src/ExtendedPdo.php#L840
Наверное, перепишу себе этот кусочек.
>Потому что в HTML нельзя запретить ссылку (инпуты - пожалуйста, а ссылку нет). Надо просто не выводить там тег a или выводить span.
Вложенный спан помог. Вообще выбросить ненужный вложенный тег нельзя, ломается селектор
https://github.com/twbs/bootstrap/blob/master/dist/css/bootstrap.css#L4724
Можно конечно сверху прописать свое правило, чтобы избавиться от вложенного тега, но смысл захламлять css ради чистки html. Ну и вообще раз используем фреймворк, то придется мириться с его недостатками.
Может есть более кошерный фреймворк, кроме бутстрапа? Чтобы была нормальная структура html и не было этой мешанины типа class class-another class-abc class-class-class
И еще чтобы была встроенная валидация форм и можно было грабить корованы.
>поискать библиотеки-обертки для PDO, сравнить
Я не могу сравнивать, из-за отсутствия опыта непонятно на что ориентироваться, по каким критериям сравнивать. Могу искать только под конкретную задачу.
Ну вот например тут понадобилось подставлять массивы в запросы с условием IN.
Да, у доктрины, вернее ее компонента (?) dbal (abstract level) имеются такие средства.
http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion
Но я не могу прикинуть, насколько большая эта библиотека и целесообразно ли ее подключать ради одного проблемного запроса. Лучше напишу свою функцию/метод, где запрос будет слепливаться в цикле и там же привязать параметры.
Я так понимаю доктрина это королева orm, как симфони среди фреймворков, и любой ее компонент мощный самостоятельный пакет.
Попробуем поискать чего-нибудь помельче.
FluentPDO приглянулась. Простая, быстрая (хотя так все говорят), и с широкими возможностями. Нашу проблему array binding решает:
https://github.com/lichtner/fluentpdo/blob/0092fc16dbef345a61ce2c448f98f75c99886b30/tests/07-where-column-array.phpt#L8
И автор оперативно реагирует: в issues клянчили 'not in' условие, запушил спустя неделю https://github.com/lichtner/fluentpdo/issues/81
Добавил в закладки, но сейчас она мне особо ни к чему.
Совсем низкоуровневая библиотека:
https://github.com/auraphp/Aura.Sql#array-quoting
Просто квотят каждый элемент массива, потом склеивают:
https://github.com/auraphp/Aura.Sql/blob/2.x/src/ExtendedPdo.php#L840
Наверное, перепишу себе этот кусочек.
>Потому что в HTML нельзя запретить ссылку (инпуты - пожалуйста, а ссылку нет). Надо просто не выводить там тег a или выводить span.
Вложенный спан помог. Вообще выбросить ненужный вложенный тег нельзя, ломается селектор
https://github.com/twbs/bootstrap/blob/master/dist/css/bootstrap.css#L4724
Можно конечно сверху прописать свое правило, чтобы избавиться от вложенного тега, но смысл захламлять css ради чистки html. Ну и вообще раз используем фреймворк, то придется мириться с его недостатками.
Может есть более кошерный фреймворк, кроме бутстрапа? Чтобы была нормальная структура html и не было этой мешанины типа class class-another class-abc class-class-class
И еще чтобы была встроенная валидация форм и можно было грабить корованы.
>Можно создать функцию в твиге для вызова статических методов
Я так и сделал
function ($class, $method, array $args) {
return call_user_func_array("{$class}::{$method}", $args);
}
Но получается каша в представлении
<a class="btn btn-success"
href="{{callStaticMethod(
'\\FileSharing\\Helper\\ViewHelper',
'getDownLoadUrl',
[file.id, file.name])}}"
id="downloadLink">download
</a>
https://github.com/FaaPz/Slim-PDO/blob/master/docs/Clause/WHERE.md
Хотя если честно не понял, чем она к слиму привязана, кроме неймспейса? Обычный квери билдер.
Тоже поддерживает множество условий типа whereIn('id', [1,2,3]);
Более сложный код (сложный в плане кол-ва классов и методов), чем у индусов из aura, которые просто квотят элементы массива, но реально используют плейсхолдеры.
Итого:
1. Заквотить в цикле элементы массива, как у aura
или
2. Юзать Slim-PDO с плейсхолдерами-вопросиками?
> Еще какая-то фигня с модальными окнами: если повесить триггер не на кнопку, как показано в доках, а на ссылке, то модальное окошко будет грузить именно то, что расположено по этой ссылке.
> Почитай документацию или исходный код плагина. Может есть опция или можно что-то дописать.
Ну да, он вроде воспринимает наличие атрибута href как включение опции remote, то есть будет игнорироваться data-target и контент браться по ссылке.
http://getbootstrap.com/javascript/#modals-options
Как отключить эту парашу не написано.
В исходном коде не понимаю, вроде оно должно быть отключено по умолчанию?
https://github.com/twbs/bootstrap/blob/master/dist/js/bootstrap.js#L1236
Кажется вот эта фигня включает:
> remote: !/#/.test(href) && href
Ну и как от этого избавиться?
Короче я тогда уберу все эти дата-атрибуты с ссылки и вызову modal('trigger') при попытке перехода
$("#modal-trigger").on("click", function (event) {
event.preventDefault();
$("#modalForms").modal('toggle');
});
Только наверное не onclick, а что-то другое. Что из этого списка сработает, если ссылка получит фокус табом и затем нажать enter? http://www.w3schools.com/jsref/dom_obj_event.asp
Выполнил кубики http://ideone.com/61yg3b
И циклы http://ideone.com/1pXwxA
Примеры не смотрел, читал теорию и задание.
Сейчас буду массивы изучать.
Есть же конфа в Телеграме, бывали конфы в Скайпе, в ВК. Вот анончик оставил e-mail выше - вот так и знакомимся.
>>622638
Да, всё верно, братишка, столкнулся с подобным как раз.
Мне ещё, наоборот, пытаются подсунуть готовые решения по цене написанных с нуля. Вот как с тем модулем регистрации. А то, что там нет ничего из ТЗ, кроме собственно связи профиля в соцсети с личным кабинетом, - не беспокоит.
Натолкнулся на многое за этот год на фрилансах.
>>622640
Связывался с фрилансерами, которые имели кучу положительных отзывов и рейты около 1к рублей за час, были зарегистрированы и по 10 лет, - всё равно. Поэтому иногда так и хочется сказать сомневающимся анончикам, что фриланс - это совсем не так страшно, когда ты исполнитель, но не хочется плодить безответственных фрилансеров.
На получение суммы, большей 1 млн.
Также у тебя через год после вклада анончику 16 лет по-прежнему.
Я понимаю, но у меня больше вообще не к кому обратиться. Ладно, буду смиренно ждать опа молча.
Заливаю на хостинг и...
Fatal error: Call to a member function real_query() on a non-object in
Ну что за фигня такая то?
Значит ты в эту функцию пытаешься передать не объект, а она ждет объект. Перед функцией сдампь переменную которая в неё идет. Посмотришь, видимо у тебя ошибка раньше. Ну и если все работает на локалхосте, то мб проблема в настройке mysql на серве.
Выдало таки
Ошибка при загрузке набора символов utf8:
Конект такой.
<?php
$link = mysqli_connect('localhost','anon','123','anon');
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}
if ($link->set_charset("utf8")) {
printf("Ошибка при загрузке набора символов utf8: %s\n", $link->error);
} else {
printf("Текущий набор символов: %s\n", $link->character_set_name());
}
?>
Да чтож такое то?
Лол!
Фундаментальные знания дрочи, а не конкретный язык.
Попытался удалить проверку на utf8, всё в кракозябрах. Ну ёмоё (
> FluentPDO приглянулась.
Хочу сразу предупредить. Вот такая штука
$fpdo->from('user')->where('id', array(1,2,3));
Это не улучшенная форма написания запросов. Это так назваемый Query Builder, для построения запроса по частям и он используется там где вид запроса может меняться, например могут добавляться блоки WHERE в зависимости от каких-то условий.
Если запрос всегда одинаков то использовать QB нет никакого смысла- язык SQL выразительнее и короче. по крайней мере мне удобнее писать SQL запрос, чем все эти стрелки и скобочки.
Если хочешь, можешь использовать, дело твое. Но если он не позволяет обычные запросы писать то по моему это не удобно.
Нет, я имел в виду создать функцию
{{ getDownloadUrl() }}
или так:
{{ viewHelper().getDownloadUrl() }}
Твой вариант по моему только снижает читабельность + позволяет вообще вызывать любые функции, что явно лишнее.
Ну и что касается генерации URL, считаю удобнее сделать UrlHelper без статических методов и передавать его как объект во все шаблоны.
Для массива наверно нет смысла генерировать 100500 плейсхолдеров и передавать 100500 значений - проще на стороне PHP заквотить все и вставить в запрос. Я конечно не знаю точно, но подозреваю что иначе можно упереться в какой-нибудь лимит на число плейсхолдеров если элементов в массиве много.
Тут например http://stackoverflow.com/questions/4922345/how-many-bind-variables-can-i-use-in-a-sql-query-in-mysql-5/11131824#11131824 пишут что максимум 65536 плейсхолдеров. Очевидно эта система не рассчитана на подстановку огромного числа плейсхолдеров.
> Что из этого списка сработает, если ссылка получит фокус табом и затем нажать enter?
Click, но стоит проверить
По поводу выбора href. Там есть 2 кода:
- класс Modal, который никакие атрибуты сам не читает: https://github.com/twbs/bootstrap/blob/master/dist/js/bootstrap.js#L920
- связующий маленький код который ищет элементы с атрибутом modal и вешает на них обработчик: https://github.com/twbs/bootstrap/blob/master/dist/js/bootstrap.js#L1229
Этот связующий код можно переписать на свой, работающий с другим атрибутом и по другим принципам и использовать его. Вроде ты так и хотел?
https://github.com/fxsloker/Student
Итак, ОП. Посмотри мой роутер. Я создал новую сущность. А еще я подумал, если у меня нужно работать с одной моделью почему бы и не использовать только один контроллер? Можно так и правильно ли так?
И я создал базу: https://github.com/fxsloker/Student/blob/master/app/students.sql
Одногруппник рассказывает, что в конторе, в которой он работает, есть версталы и дизайнеры. Но PHP-программисту нужно уметь натягивать ГОТОВУЮ вёрстку.
Если ты из Мухосрани, то ты обречен. Работодатель захочет одну мартышку, которая будет делать все. Возможно будешь переставлять винду в том числе.
Смотри вот есть класс TableDataGateway, в нем есть метод initialize. Я правильно понимаю, что прямо в этом классе происходит подключение к бд? А я думал, что нужно его в автолоадер засунуть. А где он тогда вызывается? Почему не подключаться к бд сразу в конструкторе? В конструкторе я вижу только, что передается имя таблицы, адаптер (кстати опять непонятно, что за адаптер) и еще что-то.
Итак, я так понимаю, что в TableDataGateway я должен реализовать примитивные методы update, insert, where, select, которые будут применимы для всех моделей, а уже работая с каждой моделью, она должна будет наследовать этот класс и использовать эти методы?
Далее я повстречал классы ServiceManager, ServiceLocator, они как-то все вместе взаимодействуют. Только я понять не могу как. Еще адаптер.
Вообщем объясни мне, ОП, как это все работает? Я хочу применить это в студентах и понять как оно устроено.
Также прочти мою логику, как я пока думаю, как правильно сделать. Создаю класс TableDataGateway, там создаю все эти "примитивные методы". Рядом с ним создаю класс UserDataGateway, который наследует TableDataGateway и там уже пишу методы вроде add, delete, edit и т.д. В самой модели Student в конструкторе будет создаваться объект класса UserDataGateway с аргументом "students" (имя таблицы). Там будут использоваться такие же методы add, update, edit и т.д., которые будут вызывать аналогичные методы класса UserDataGateway. Контроллер опять же будет иметь методы action_add, action_edit, в каждом из которых будет создавать экземпляр класса Student и вызывать аналогичный метод модели. Но пугает меня то, что во всех трех классах будут одинаковые методы, которые по цепочке будут вызывать другу друга до обращения в базу. Правильно ли это?
Начал с разработки нормальной БД, почитал про нормализацию, связи. Пришел к такому варианту как на пикче, вот еще в текстовом варианте - http://ideone.com/JmbBSV
Переименуй первичные ключи в просто "id", не надо везде ставить "category_id", так называются внешние ключи (т.е. когда данные лежат в другой таблице).
И таблицы называются обычно в единственном числе, тогда в запросах м/будет написать:
"product.category_id = category.id"
Челу нужно было написать алгоритм для новой версии одного биткоин-клиента. Я ради интереса нашел этот клиент на гитхабе, оказалось, что он написан на питоне. Ну и я тупо переписал все на пхп. Конечно, без пердолинга не обошлось, но все равно збс. А вы говорите про 15к в месяц.
Нет, TDG это просто класс где собраны функции работы с таблицей. В ZF просто по совему это сделано. Никаких where или update делать не требуется.
>ENUM стоит сделать латинницей и без пробелов.
В кириллицу переводить в самом коде? Не будет ли это лишним захламленим кода? Это же надо будет через какой-нибудь switch перегонять или ifelse
>Нет, TDG это просто класс где собраны функции работы с таблицей. В ZF просто по совему это сделано. Никаких where или update делать не требуется.
Это ОП написал? А то больно скудно, ничего не понятно.
Раз на раз не приходится же.
Везение играет роль, постоянный мониторинг заказов, адекватные цены. Наверняка там куча петушков нарисовалась с ценниками от 100к рублей или около того.
С почином, бро, это мотивация для многих в этом треде.
Не еби себе мозг. Есть такие ORM, как doctrine и propel. Или есть такие фреймворки как Yii, со встроенной орм. У них есть документация и туториалы. Берешь и решаешь свои задачи за их счет, стараясь не раздувать классы моделей кучей похожих методов. Но лучше конечно перед этим выкинуть сраное похапэ
>соединение создается при создании pdo объекта или при выполнении первого запроса?
>Не знаю, проверь
Проверил, подключается при создании pdo.
>либо не делай catch либо сделай один-единственный catch в охватывающий все приложение и выводящий заглушку
Теперь понял. Обернуть в try/catch только $app->run, если нужно (обычно не нужно).
Слим сам преобразует ошибки в исключения (через set_error_handler), сам выдает заглушку (некрасивую), сам пишет в лог (стандартный).
Можно переопределить страницу ошибки, чтобы показать страницу с обезьянкой-ремонтником, но тогда придется переписывать сообщение в лог.
У меня получилось так
https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L55
>>622298
> надеюсь что и обычная и аяксовая форма у тебя обрабатывается одним кодом. И ты также сделал HTML5 валидацию.
Одним и тем же кодом, но получилась лапша из ифов и скобок, жду советов по рефакторингу.
Про html5 валидацию слышу второй раз в жизни. Ты имеешь ввиду эти атрибуты типа required и pattern?
Во-первых, это поддерживается не во всех браузерах,
http://caniuse.com/#feat=form-validation
во-вторых мне просто не нравится внешний вид этих попапов. Их можно как-то переопределить, или изменить текст сообщения?
Позвольте заметить, что в Yii ActiveRecord, а не ORM. И то и то - частный случай DBAL. Или меня щас нахуй пошлют?
Кстати, на вопрос разрабам Yii, будет ли стоковая интеграция Doctrine и Yii - они ответили - "НЭТ НЭ БУДЕТ". Свою ORM они писать не хотят, видимо сложна. Поэтому Yii так и останется на уровне "стильно, модно, молодежно".
http://integer64.github.io/site-layout/exercise/mainTask/index.html
Пардон, обосрался. Да, там Active Record.
Извиняюсь за столь сраный скрин, на машине не было ината. Как реализовывать пикрелейтед? Через SELECT? Если да, то как? Было бы круто, если бы анон написал код и пояснил что и почему
Хотя, что и почему я наверное сам пойму, но пока что я не знаю за что схватиться
Гугли group by и count.
>Было бы круто, если бы анон решил за меня лабу
Было бы круто, если бы ты обсосал мое очко.
На bitcointalk.org. Читал сначала про биток в целом, потом пошел на этот форум, случайно увидел заказ. Оказалось, что за 8 месяцев никто так и не смог ему сделать, аж 8500$ запросили (он пендос). О реверс-инджиниринге алгоритма из оригинального клиента никто походу не додумался, пхп-шники же. Ну я и рискнул. Причем изначально стояла награда 0.5 BTC, а я блефанул и повысил до 1-го.
Скиллы средние. В данном случае понадобились только синтаксис питона, пхп и phpstorm с pycharm'ом, благо до этого на питоне кодил.
Алсо, говнокод там был просто ппц. По сравнению с ним, народ из этого треда - сеньоры.
Да нет, просто вузики отстой
http://ideone.com/HGT26l
Алсо, нужно ли его было покрывать юнит тестами и правильно ли проставлены индексы в бд?
https://github.com/toppestkek/Test
Немного ВЗБОДРИЛО, когда стал проверять всякие разные госзаказы на официальном сайте зосзакупок.
Ещё читаю книгу Савельевой о РНР - как же тёте далеко до нашего ОПа. Там курс лекций, вроде более-менее доступно излагается, дочитаю.
ага, мотивация, пока я безуспешно делаю тестовые задания на днище вакансии по 20 т.рублей в месяц, читать такие вот истории в ваших говноконфах про шлюх, работающих тимлидами за 90к, которые "ну я толком ни жиес ни пхп ни знаю)) ну на рабипитоне и шотот там накалякать магу))" - пригорает пиздец.
А откуда ты? Как вообще себя опишешь, свои скиллы?
>>621471
Новый код с небольшими исправлениями: http://ideone.com/Loymjd
Старый код:
http://ideone.com/sepIh4
Сделал сам: строка if($foundAnimals["Dog"]) { превратилась в if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"]) { потому что при создании игры мы можем отказаться от собак в отличии от кошек и мышей
> Не стоило canIMove переделывать ради array_filter. Аргументы функции выбираются из логики, тут логично чтобы аргументами были (x, y), то есть даем координаты и получаем ответ. Для совместимости с array_filter можно либо сделать метод в Animal, либо использовать анонимную функцию (так даже наверно лучше):
Не могу понять как передать два аргумента в array_filter, если в документации единственный пример двух параметров анонимной функции - это передача ключа + значения.
> Тут можно избавиться от аргумента foundAnimals - можно передавать его в функцию подсчета через use (если бы исплоьзовалась анонимная функция). Можно впрочем и не избавляться, логика тут есть, что лучший ход зависит от расположения других животных. Хотя мне кажется, без него будет красивее.
Как я должен описать там анонимную функцию?Если я по твоему раннему совету передаю два разных метода countPoints, т.к. алгоритм подсчета очков различается.
> if (!count($foundAnimals["Cat"])) {
> throw new Exception("Ошибка. Должна быть как минимум одна кошка.");
> Вот тут я все же не уверен что это правильно. Можно было бы в отстутсиве кошки оценивать ходы по другим факторам, вроде близости к углам. Хотя в твоей ситуации функция не будет вызвана если нет кошки, но так было бы надежнее.
Но почему это нужно сделать. Это уже ошибка будет, если мы попали в тот метод без кошек. Зачем считать углы тогда? Если ты имел ввиду, что это будет свободный ход когда мы не видим мышок, то он уже описан в методе freeMove, и по правилам задачи мышка ходим наобум, без обдумывания.
Алсо насчет правил.
> Также, для мышки надо рассматривать вариант «стоять на месте». Иногда стоять на месте может быть выгоднее чем сделать шаг навстречу кошке. Например когда мышка в углу и к ней с 2 сторон приближаются кошки.
В учебнике написано, что мышка будет стоять на месте только если ей некуда ходить. Я это понял как ситуацию когда рядом клетки все заняты. Имеет ли она право в остальных случаях стоять на месте, если это выгодный ход?
> //Если обнаружили новый тип животных - добавляем его как ключ
> if (!array_key_exists($animalType = get_class($animal), $foundAnimals)) {
> ...переделать алгоритм чтобы он проверял есть ли в массиве такой ключ, перед тем как его использовать.
А array_key_exists разве не это выполняет?
В общем я слоупочу с советами по анонимным функциям. Я скопипастил их с метода canIMoveTo (все еще с одним параметров вместо двух x,y), они копия друг друга. Правильно ли делать такой копипаст, когда раньше мы просто передавали ссылку на метод в array_filter?
>>621471
Новый код с небольшими исправлениями: http://ideone.com/Loymjd
Старый код:
http://ideone.com/sepIh4
Сделал сам: строка if($foundAnimals["Dog"]) { превратилась в if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"]) { потому что при создании игры мы можем отказаться от собак в отличии от кошек и мышей
> Не стоило canIMove переделывать ради array_filter. Аргументы функции выбираются из логики, тут логично чтобы аргументами были (x, y), то есть даем координаты и получаем ответ. Для совместимости с array_filter можно либо сделать метод в Animal, либо использовать анонимную функцию (так даже наверно лучше):
Не могу понять как передать два аргумента в array_filter, если в документации единственный пример двух параметров анонимной функции - это передача ключа + значения.
> Тут можно избавиться от аргумента foundAnimals - можно передавать его в функцию подсчета через use (если бы исплоьзовалась анонимная функция). Можно впрочем и не избавляться, логика тут есть, что лучший ход зависит от расположения других животных. Хотя мне кажется, без него будет красивее.
Как я должен описать там анонимную функцию?Если я по твоему раннему совету передаю два разных метода countPoints, т.к. алгоритм подсчета очков различается.
> if (!count($foundAnimals["Cat"])) {
> throw new Exception("Ошибка. Должна быть как минимум одна кошка.");
> Вот тут я все же не уверен что это правильно. Можно было бы в отстутсиве кошки оценивать ходы по другим факторам, вроде близости к углам. Хотя в твоей ситуации функция не будет вызвана если нет кошки, но так было бы надежнее.
Но почему это нужно сделать. Это уже ошибка будет, если мы попали в тот метод без кошек. Зачем считать углы тогда? Если ты имел ввиду, что это будет свободный ход когда мы не видим мышок, то он уже описан в методе freeMove, и по правилам задачи мышка ходим наобум, без обдумывания.
Алсо насчет правил.
> Также, для мышки надо рассматривать вариант «стоять на месте». Иногда стоять на месте может быть выгоднее чем сделать шаг навстречу кошке. Например когда мышка в углу и к ней с 2 сторон приближаются кошки.
В учебнике написано, что мышка будет стоять на месте только если ей некуда ходить. Я это понял как ситуацию когда рядом клетки все заняты. Имеет ли она право в остальных случаях стоять на месте, если это выгодный ход?
> //Если обнаружили новый тип животных - добавляем его как ключ
> if (!array_key_exists($animalType = get_class($animal), $foundAnimals)) {
> ...переделать алгоритм чтобы он проверял есть ли в массиве такой ключ, перед тем как его использовать.
А array_key_exists разве не это выполняет?
В общем я слоупочу с советами по анонимным функциям. Я скопипастил их с метода canIMoveTo (все еще с одним параметров вместо двух x,y), они копия друг друга. Правильно ли делать такой копипаст, когда раньше мы просто передавали ссылку на метод в array_filter?
Я базарю.
у успешных менеджеров? мб
Охуенная шапка, чаю авторам.
Привет, анонимус, будет многобукв, очень надеюсь на помощь, потому что не знаю куда мне еще обратиться!
Я буду прям и краток, не вдаваясь в детали: уже несколько лет имеется магазин розничной торговли.
ВНЕЗАПНО захотелось автоматизировать некоторые процессы, потому что заебало писать всё на листках, и вообще работать вручную, а именно:
- вести учет товара на складе (поступления, продажи)
- автоматизировать выдачу договоров купли и пары других отчетов.
Я очень долго хотел (да и щас подумываю) реализовывать это в MS Access, однако внезапно вспомнил, что у меня есть говносайтик на ололо-CMS с бесплатным шаблоном (но который очень даже неплох - делал его давно, без знаний каких то ЯП, хотя и наебался со всякими css-ами, ну не суть).
И я подумал, что было бы неплохо сделать ИНТЕРНЕТ-МАГАЗИН вместо нынешнего "сайта-визитки-каталога".
Очевидно, что я лентяй и вообще тугодум, ввиду чего яро стал гуглить какие нынче CMS актуальны, какие из них наиболее подойдут для интернет-магазина. Какой, кстати самый менее ресурсотребовательный? Ололо-дешевый-хостинг.
В общем, анонимус, я тут подумал, и в своих фантазиях набросал такую схему:
Ставлю CMS для интернет-магазина, пополняю его, тем самым у меня решается проблема складского учета товара в наличии.
А затем, при помощи PHP (который я так яро настроен изучить) - взять и к той же CMS прикрутить функционал выдачи договоров и прочих отчетов для курьера/грузчика и тд. Насколько моя идея охуительна и реально ли такое реализовать одному?
И вообще, анонимус, что ты думаешь по поводу моей уёбищной ситуации?
В идеале, конечно же - было бы неплохо изучить MYSQL, создать базу (таблички) и написать самому какую нибудь "веб-морду" по управлению этой базой: то есть реализовать учет склада, отчеты и прочие махинации.
А потом залить эту базу на хостинг и создать уже самописный сайт, который будет обрщаться к моей охуительной базе и будет брать оттуда информацию о товарах, которые есть в наличии.
Пиздец, анон, сам не понимаю, чего хочу, прошу помочь с принятием решения.
Алсо - как долго нужно учить PHP?
Охуенная шапка, чаю авторам.
Привет, анонимус, будет многобукв, очень надеюсь на помощь, потому что не знаю куда мне еще обратиться!
Я буду прям и краток, не вдаваясь в детали: уже несколько лет имеется магазин розничной торговли.
ВНЕЗАПНО захотелось автоматизировать некоторые процессы, потому что заебало писать всё на листках, и вообще работать вручную, а именно:
- вести учет товара на складе (поступления, продажи)
- автоматизировать выдачу договоров купли и пары других отчетов.
Я очень долго хотел (да и щас подумываю) реализовывать это в MS Access, однако внезапно вспомнил, что у меня есть говносайтик на ололо-CMS с бесплатным шаблоном (но который очень даже неплох - делал его давно, без знаний каких то ЯП, хотя и наебался со всякими css-ами, ну не суть).
И я подумал, что было бы неплохо сделать ИНТЕРНЕТ-МАГАЗИН вместо нынешнего "сайта-визитки-каталога".
Очевидно, что я лентяй и вообще тугодум, ввиду чего яро стал гуглить какие нынче CMS актуальны, какие из них наиболее подойдут для интернет-магазина. Какой, кстати самый менее ресурсотребовательный? Ололо-дешевый-хостинг.
В общем, анонимус, я тут подумал, и в своих фантазиях набросал такую схему:
Ставлю CMS для интернет-магазина, пополняю его, тем самым у меня решается проблема складского учета товара в наличии.
А затем, при помощи PHP (который я так яро настроен изучить) - взять и к той же CMS прикрутить функционал выдачи договоров и прочих отчетов для курьера/грузчика и тд. Насколько моя идея охуительна и реально ли такое реализовать одному?
И вообще, анонимус, что ты думаешь по поводу моей уёбищной ситуации?
В идеале, конечно же - было бы неплохо изучить MYSQL, создать базу (таблички) и написать самому какую нибудь "веб-морду" по управлению этой базой: то есть реализовать учет склада, отчеты и прочие махинации.
А потом залить эту базу на хостинг и создать уже самописный сайт, который будет обрщаться к моей охуительной базе и будет брать оттуда информацию о товарах, которые есть в наличии.
Пиздец, анон, сам не понимаю, чего хочу, прошу помочь с принятием решения.
Алсо - как долго нужно учить PHP?
То есть мне лучше разделить свои личные запросы? Вести учет товаров в вордпрессе а договоры и все остально пос таринке - вручную?
Оставь это, путник. Про товары можешь еще подумать, но в вордпрессе свои процессы делать не стоит.
Пиздос. Ладно, буду ебаться с Акцесом!
Вордпресс+вукомерс - самое менее ресурсоёмкое, среди других CMS?
Попробуй получать информацию об исключении через $e->__toString()
Вместо app->log может быть лучше использовать error_log, чтобы ошибка шла в лог PHP.
> во-вторых мне просто не нравится внешний вид этих попапов.
вроде нет
> Их можно как-то переопределить, или изменить текст сообщения?
Частично, через title
В седьмой информация должна читаться, скруглениями и прочим оформлением можно пожертоввать.
В восьмой все должно выглядеть нормально кроме фич которых в нем нет - скруглений, теней.
Урок https://gist.github.com/codedokode/855e3970124687b26a1c
> Не могу понять как передать два аргумента в array_filter, если в документации единственный пример двух параметров анонимной функции - это передача ключа + значения.
$x = array_filter($x, function ($y) {
// вызываем любую функцию с любым числом параметров
});
> Имеет ли она право в остальных случаях стоять на месте, если это выгодный ход?
Имеет. Все животные имеют право стоять на месте. Разве что кроме собаки.
TDG - класс, с функциями, которые оборачивают твой говнокод для работы с базой. По сути самая простая абстракция и инкапсулирование построенных запросов. По сути тот же говнокод, только рассованый по коробкам.
Смотря что нужно ему. Если он хочет нечто хорошее и качественное, то CMS его не устроит. Я бы всем таким людям советовал для начала найти прошаренного человека, который может консультировать по таким вопросам, честно и без купюр, а уже потом окунаться в омут веб-разработки.
А если он хочет быстро, и без особых претензий, то CMS - самое то.
Мимо смотритель курсов специалиста.
И вообще в шапке написано, что нужно отдельно скачивать mySql. Если у меня phpstorm можно не устанавливать ее? Все уже есть в программе?
Недавно тоже думал над этим вопросом, но потом взял и выучил вёрстку, до уровня верстания с ПСД макетов, таких как в задании ОПа и немного посложнее. Потрать пару недель, получили этот скил и тебя это уже не будет волновать.
рекомендую не заебывается. Все что в Pstorm связано с интеграцией к твоим софтинам обернется тебе дикими лагами. Конечно если у тебя топовая машинка для разработки тыщ за 60, то можешь попробовать. Да и интерфейс с шторме и так перегружен и напичкано туда всего чего можно. Пробовал интегрировать xdebug в Шторм - оказалось для него нужен запущенный xdebug, которые следить за выполнением ВСЕХ скриптов от начала до конца. Можно конечно, ставить трейсы самому, но тогда весь смысл интеграци и - ставить точки остановы и чекать переменные - отпадает. А при полном трейсе производительность дико низкая.
Вообщем суть в том, что при использовании Phpstorm для разработки больших проектов в которых >10.000 файлов все фишки интеграции и дебага дико нагружают локальный сервер.
И да, mysql ставится отдельно, так как это отдельная программа. И вообще привыкай к тому, что разработка на PHP это разработка с помощью опенсорс платформы - то есть тут нихуя нет юзерфрендли, когда все за тебя поставили. Софт стафишь отдельно и отдельно его интегрируешь. Но если ты линуксобог - тут чуть чуть полегче. Загуглил команду - скопировал в консоль - поставился LAMP, например. Загуглил команду - установил Webmin, итд...
На самом деле в программировании нужно тоже найти свою нишу.
Человек, который, например работает в SensioLabs и занимается разработкой фреймворка и человек, который собирает сайты на Symfony - это 2 совершенно разных специалиста. Потратив нек. количество времени на пердолинг можно перетечь из одной в другую. Понятное дело, что функции PDO первый специалист должно знать намного лучше, чем второй, потому что второму они просто не понадобятся для повседневной работы. А все что не повседневно - то гуглится.
Спрошу в родном, любимом РНР-тредике.
Как мне хорошо понять, что такое ООП, парадигмы и т.д.? И где я могу на доступном уровне получить не языковые, а обще-программисткие знания? Как я понимаю, нужно читать что-то из книг в первых трех колонках гайда ОП-пика закрепленного треда /pr/?
Мэтт Вайсфельд "Объектно-ориентированное мышление"
>>622641
Шиндовс, пробовал что на 7, что на 10, одно и тоже дерьмо. Кодировка 1251 для казахского текста.
>надо передавать данные в виндовой кодировке.
Как их туда передать в виндовой кодировке? iconv? Если да, то это не вариант, так как iconv не может сконвертировать правильно.
У меня к сожалению жесткие рамки, нужно работать под Win.
http://integer64.github.io/site-layout/exercise/mainTask/index.html
Сделал под ослика.
Можете начать тыкать в мои косяки
А что ты в итоге сделал то? Развернул html страничку на сервере? Молодец.
Эм, это задание по верстке макета. Так что, да сверстал, разместил на гитхабе.
Из бд извлекается массив.
Допустим.
$arr
{
[a] = 1,
= 2,
[c] = 3,
}
Проблема в том, что например ключа [d] в массиве может и не быть, но при дальнейшей работе скрипта возможно потребуется обращение по этому ключу.
Например:
$a = $arr['a'];
$b = $arr['b'];
$c = $arr['c'];
$d = $arr['d'];\\ ключа d как бы и нет, но как бы и похуй, если $d при этом станет равным = "" То есть все работает как нужно.
Интересует, правильно ли так делать?
Или нужно обязательно проверять наличие ключа в массиве , вроде isset( $arr[ 'd' ] ) перед тем как обратиться по этому ключу?
$d = $arr['d'];
$d = isset($arr['d']) ? $arr['d'] : '';
То есть я могу просто написать первый вариант, или мне обязательно нужно делать что-то похожее на второе?
Интересует правильность во всех аспектах: хороший тон, скорость работы(?) и пр.
Обычно встречаю вариант, но зачем?
Как такое возможно? «Из БД извлекается массив ... ключ может и не быть». Не может такого быть. Все колонки что ты запрашиваешь из БД, возвращаются. Ты что-то делаешь неправильно.
Что не так-то?
Есть страница настроек с полями ввода. Каждое поле значение поля -> элемент в массиве который сохраняется в БД. Если пользователь не ввел значение в какое-то поле, то в массиве элемент будет отсутствовать. Но потом, по этому элементу возможно будет обращение. И речь вообще, как ты понимаешь не об этом. Тут про то нужно ли городить такие выражения $d = isset($arr['d']) ? $arr['d'] : '' если можно обойтись $d = $arr['d']. Ведь результат будет тот же? При условии что $arr['d'] вообще не существует. То есть ключа d со значение в массиве нет!
public function __construct(PDO $pdo){
\t\t$this->db = $pdo;
\t}
Но в чем сакральный смысл? Я так понимаю это должно помочь в будущем легко менять PDO на какой-то другой сервис, но мне ведь все-равно нужно будет лезть и менять передаваемое в конструктор значение.
Это связано с разделением обязанностей и принципом единой ответственности, то есть каждый класс должен заниматься своим делом.
То есть в твоем случае например нам не приходится в класс засовывать установку соединения с БД, настройку разных параметров - это не его задача.
И если не передавать PDO через конструктор, а сделать по-другому, как ты добьешься, чтобы несколько классов использовали одно соединение с базой, а не каждый свое?
Ну и как бонус, код получается лучше, надежнее, понятнее, гибче в использовании, проще в тестировании.
Немного можешь почитать в этом уроке: https://gist.github.com/codedokode/e1d31a31b37d5f635057
А без DI получается лапша из намертво связанных друг с другом классов.
ОП, ты не пропустил? А то вроде как ты там дальше отвечаешь, и где есть ОП вообще?
В битриксе, например, портянка нотайсов такая, что их можно только минут за 5 все прочесть, снизу вверх. Однако же деньги делают. Но если хочешь считаться "элитой" программирования и собираешься писать какой-то топчик, то нотайсов быть не должно. Не знаю, например, щас в Друпале есть нотайсы или нет.
Я пока пробежался и ответил на вопросы, из-за которых аноны не могут что-то решать дальше, задачки я чуть позже гляну, начну с самых старых. Вроде до 8-го января все проверено, так что терпимо.
Надо писать так, чтобы нотисов не было. Сам подумай, как можно писать надежный код. когда элементы в массиве могут быть, а могут не быть? Получается и код тогда может работать, а может и не работать, так? Не надо так.
> всегда определять переменную, типа типа такого $result = array(); а уже дальше даже если данных не будет, то просто вернется этот пустой массив.
Неверно. Функция всегда должна возвращать данные в одном и том же виде. Единственное исключение - можно еще возвращать null если например не удалось найти запись в БД. То есть либо массив строго определенного формата + null, либо объект (что лучше) + null, либо строка + null. Как-то так.
>>624024
Да.
>>624023
Да. с битрикса не берите пример. Помните что они программистам 20 000 р в месяц платят, будете писать с нотисами и на массивах, будете получать столько же.
ОП, помоги хоть ты, работа стоит, все интернеты облазил, это абсолютно не типовая задача. >>622533
Если очень коротко и не хочешь перечитывать то смотри:
Стоит задача сканировать директории на наличие файлов и создавать новые файлы (ғғғғғғғғғғғғ.hui) с казахскими буквами. Но у меня это не выходит, я уже всё прошерстил в интернете, но ничего валидного не нашел. Как справиться? В какую сторону копать? ОС Win 7/10 жестко предопределена.
Также для наводки:
использовал функции для работы с файловой системой и собственно iconv. Но он не справляется с кодировкой файловой системы.
Да тут кода и не надо в принципе то, мне нужно добиться работоспособности от функций scandir или, блин, хотя бы fopen.
Вот так делаю:
var_dump(scandir("C:\\ASED\\"));
fopen(iconv("UTF-8","WINDOWS-1251","C:\\ASED\\ғғғғғғғғғғғғ"),"w");
fopen(iconv("UTF-8","cp1251","C:\\ASED\\ғғғғғғғғғғғғ"),"w");
fopen(iconv("WINDOWS-1251","UTF-8","C:\\ASED\\ғғғғғғғғғғғғ"),"w");
fopen("C:\\ASED\\ғғғғғғғғғғғғ","w");
- во всех случаях получается гiвно какое-то.
Ну и всё пиздец? Не робити больше? Скажи оп ты тоже запердолился?
Для PHP лучше шторма еще ничего не придумали. Может у кого-то другой опыт, но я пробовал такие альтернативы:
Sublime
Atom
Eclipse
Для меня главная задача IDE
1) Автокомплит функций, классов, методов, переменных.
2) Удобное управление вкладками.
3) Максимальная поддержка синтаксисов из коробки (кроме основных нужны XML, JSON, YML, Twig)
4) Функционал сниппетов
5) С недавнего времени еще использую встроеный bash-терминал.
Sublime и Atom
Чтобы реализовать в них весь вышеперечисленный функционал (кроме вкладок) нужно наставить опен-сорс костылей. Пробовал и даже хотел привыкнуть, но не получилось. В Атоме нашел более менее сносный плагин для автокомплита. Но все равно он отстой по сравнению с тем, что есть в шторме.
В Eclipse автокомплит есть, но тормозит точно так же как и в Шторме при наличии в проекте Хуилиона файлов, потому решил что менять IDE нет смысла.
Для начала, если ты работаешь с большим проектом попробуй исключать из проекта те папки, которые не нужно индексировать (папки с кешем, папки с картинками)
Если у тебя реально проблемы с производительностью и тормозит только лишь на включении IDE, советую попробовать Atom, потому что Java-поделки со своей индексацией файлов все равно жрут одинаково. Там не будешь охуенного автокомплита, но работать в нем можно норм.
NetBeans не ставил, так как смысла нет, такая же тормозная Java поделка, как и Storm.
Сейчас я работают так: проект от корневой доменной папки веду в Phpstorm, если нужно открыть какие-то конфиги, за пределами проекта - открываю в Sublime. Алсо в шторме есть проблема с тем, что он не может открывать большие текстовые файлы. Их я тоже открываю в Sublime.
Для PHP лучше шторма еще ничего не придумали. Может у кого-то другой опыт, но я пробовал такие альтернативы:
Sublime
Atom
Eclipse
Для меня главная задача IDE
1) Автокомплит функций, классов, методов, переменных.
2) Удобное управление вкладками.
3) Максимальная поддержка синтаксисов из коробки (кроме основных нужны XML, JSON, YML, Twig)
4) Функционал сниппетов
5) С недавнего времени еще использую встроеный bash-терминал.
Sublime и Atom
Чтобы реализовать в них весь вышеперечисленный функционал (кроме вкладок) нужно наставить опен-сорс костылей. Пробовал и даже хотел привыкнуть, но не получилось. В Атоме нашел более менее сносный плагин для автокомплита. Но все равно он отстой по сравнению с тем, что есть в шторме.
В Eclipse автокомплит есть, но тормозит точно так же как и в Шторме при наличии в проекте Хуилиона файлов, потому решил что менять IDE нет смысла.
Для начала, если ты работаешь с большим проектом попробуй исключать из проекта те папки, которые не нужно индексировать (папки с кешем, папки с картинками)
Если у тебя реально проблемы с производительностью и тормозит только лишь на включении IDE, советую попробовать Atom, потому что Java-поделки со своей индексацией файлов все равно жрут одинаково. Там не будешь охуенного автокомплита, но работать в нем можно норм.
NetBeans не ставил, так как смысла нет, такая же тормозная Java поделка, как и Storm.
Сейчас я работают так: проект от корневой доменной папки веду в Phpstorm, если нужно открыть какие-то конфиги, за пределами проекта - открываю в Sublime. Алсо в шторме есть проблема с тем, что он не может открывать большие текстовые файлы. Их я тоже открываю в Sublime.
PHP соснет очень не скоро. Это как спрашивать: когда соснет Facebook или Двач.
Комьюнити у него очень огромное, а сейчас для продвижения это самое главное.
>\t
Ну хуй знает, что по твоим словам не очень скоро, для некоторых 3 года это не очень скоро, а для некоторых 2 десятка. Ну и сравнения тоже какие то мутные, социальную сеть сравнивать со скриптовым языком.
>Ну и сравнения тоже какие то мутные, социальную сеть сравнивать со скриптовым языком.
Без разницы. Потому что задачи в итоге у всех сводятся к одному - зарабатывание денег и ЧСВ.
Я говорю о том, что если у чего-то или у кого-то есть большая "аудитория", то бишь комьюнити, то при сегодняшних тенденциях это что-то будет актуально еще очень долго.
Очень долго в тоём понимании это сколько? 10 лет?
Ты дал неверную информацию и сбил меня с толку. Я ведь ничего не знаю про казахские кодировки.
Судя по википедии, в казахском исплоьзуется модифицированная кодировка, не та же 1251 что у нас в России.
Вот википедия: https://ru.wikipedia.org/wiki/Windows-1251#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0_CP1251-k_.28KazWin.2C_.D0.BA.D0.B0.D0.B7.D0.B0.D1.85.D1.81.D0.BA.D0.B0.D1.8F_.D0.BA.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0.29
(маразм конечно - давно пора переходить на юникод и забыть про 256-символьные кодировки).
Видно что символ ғ есть только в модифицированной версии. Значит, надо найти как эта кодировка назвается в iconv.
Гугление дает подобные списки: https://gist.github.com/hakre/4188459 в которых только обычная 1251. Казахской нет.
Значит придется перекодировать ручками - писать свои функции для перекодирования туда и обратно.
Перекодировать из 1251k в utf-8 просто: разбиваешь строку на символы по 1 байту, проходишься и перекодируешь. Коды 0-127 идут без изменений, а для 128-255 надо сделать массив где слева стоит код, справа коды или символ в utf-8. Символы можно скопировать из статьи про cp1251. советую показать код для проверки ну и самому потестировать на всех возможных символах.
Этот же массив с помощью array_flip переворачивается и используется для обратного раскодирования.
Обратное перекодирование делается так: разбиваем utf-8 строку на символы с помощью preg_split. В цикле обходим каждый символ:
- символы с кодами 0-127 остаются без изменений
- символы которые есть в массиве, заменяем на код из него
- остальные символы: выдаем ошибку или делаем еще что-то.
Помни такие особенности:
- в cp1251k всего 256 символов, в юникоде десятки тысяч. Значит надо решить что делать когда встречается тсутсвующий в 1251k символ
- в cp1251k 1 символ это 1 байт. В utf-8 символ может кодироваться либо 1 байтом от 0 до 127 либо несколькими из диапазона 128-255
Статья про utf-8 в помощь: https://ru.wikipedia.org/wiki/UTF-8
Есть вопросы - задавай.
Было бы хорошо написанные функции снабдить заголовком с нужными ключевыми словами и выложить куда-нибудь на гитхаб чтобы другие могли их нагуглить.
Ты дал неверную информацию и сбил меня с толку. Я ведь ничего не знаю про казахские кодировки.
Судя по википедии, в казахском исплоьзуется модифицированная кодировка, не та же 1251 что у нас в России.
Вот википедия: https://ru.wikipedia.org/wiki/Windows-1251#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0_CP1251-k_.28KazWin.2C_.D0.BA.D0.B0.D0.B7.D0.B0.D1.85.D1.81.D0.BA.D0.B0.D1.8F_.D0.BA.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0.29
(маразм конечно - давно пора переходить на юникод и забыть про 256-символьные кодировки).
Видно что символ ғ есть только в модифицированной версии. Значит, надо найти как эта кодировка назвается в iconv.
Гугление дает подобные списки: https://gist.github.com/hakre/4188459 в которых только обычная 1251. Казахской нет.
Значит придется перекодировать ручками - писать свои функции для перекодирования туда и обратно.
Перекодировать из 1251k в utf-8 просто: разбиваешь строку на символы по 1 байту, проходишься и перекодируешь. Коды 0-127 идут без изменений, а для 128-255 надо сделать массив где слева стоит код, справа коды или символ в utf-8. Символы можно скопировать из статьи про cp1251. советую показать код для проверки ну и самому потестировать на всех возможных символах.
Этот же массив с помощью array_flip переворачивается и используется для обратного раскодирования.
Обратное перекодирование делается так: разбиваем utf-8 строку на символы с помощью preg_split. В цикле обходим каждый символ:
- символы с кодами 0-127 остаются без изменений
- символы которые есть в массиве, заменяем на код из него
- остальные символы: выдаем ошибку или делаем еще что-то.
Помни такие особенности:
- в cp1251k всего 256 символов, в юникоде десятки тысяч. Значит надо решить что делать когда встречается тсутсвующий в 1251k символ
- в cp1251k 1 символ это 1 байт. В utf-8 символ может кодироваться либо 1 байтом от 0 до 127 либо несколькими из диапазона 128-255
Статья про utf-8 в помощь: https://ru.wikipedia.org/wiki/UTF-8
Есть вопросы - задавай.
Было бы хорошо написанные функции снабдить заголовком с нужными ключевыми словами и выложить куда-нибудь на гитхаб чтобы другие могли их нагуглить.
Еще в помощь тебе 2 функции:
ord - определяет числовой код первого байта (не символа!) в строке
chr - создает строку из 1 байта с указанным кодом.
Если ты можешь жить без автокомплита, рекомендую саблайм- он очень быстрый, запускается где-то за секунду-две, причем все что ты печатаешь сохраняется даже если комп зависнет или отключится.
Из плагинов: emmet для верстки, php companion для работы с неймспейсами, docblockr для комментариев.
За 5 лет при желании можно выучить еще несколько языков. Я бы не боялся того что с PHP что-то случится, веб вряд ли вымрет в среднесрочной перспективе, а поменять язык нетрудно.
Процессор правда слабый (AMD E1-6010), но все же.
Я вижу дырку в 2.5 секунды, с чего бы это?
Если тебе интересно развертывание апача как таковое, то можно и попердолиться, еще можно посмотреть в сторону nginx. В php так или иначе есть веб сервер встроенный и вроде как сторонние ИДЕхи поддерживают его.
По js все поправил, непонятно только это:
>var fileId = {{ fileId | json_encode | raw }};
>Предлагаю тебе самому подумать почему и зачем тут json_encode и raw.
Зачем тут json_encode и raw? Сам думать пробовал, не помогло.
Ну в кавычки обернет строку json_encode, а raw предотвратит экранирование этих кавычек. Зачем мне там кавычки?
Я бы еще понял, если бы передавались какие-то сомнительные данные из базы, полученные от пользователя, например логин или текст сообщения, где может содержаться csrf код.
Но я передаю суррогатный id. Ну ладно, видимо это чисто ради систематичности: мы же экранируем в твиге все что нужно и не нужно, значит и здесь так же.
Здесь кто-нибудь вообще может по делу ответить. Понимаю, вопрос нубский, но весь тред и состоит из таких вопросов, причем намного глупее. Вы че, совсем охуели?
>>624032
>Надо писать так, чтобы нотисов не было. Сам подумай, как можно писать надежный код. когда элементы в массиве могут быть, а могут не быть? Получается и код тогда может работать, а может и не работать, так? Не надо так.
Поехавший, ты с реальными приложениями вообще работал. Или только кукарекать можешь?
Допустим есть страница пользователя настроек с 1000 текстовыми инпутами. Пользователь допустим заполняет 2 из 1000 инпутов и нажимает сохранить. Формируется массив соответственно из всего из двух элементов, по принципу: ключ - id ипута, значение - value инпута. Этот массив сохраняется в БД. Но потом при извлечении данных из БД возможно придется пройтись по всем элементам, ведь неизвестно сколько инпутов заполнил пользователь.
Если пользователь заполнил всего 2 инпута, то, по твоему, в БД я буду заполнять эти два элемента, и еще 998 элементов ключей с пустыми значениями? А таких пользователей тоже несколько тысяч, со своей страницей настроек? И все это хранить в БД?
Я конечно сам нуб,но попробую помочь. Будем рассуждать логически. Если ты попытаешься обратиться по ключу которого нету в массиве ,то приложение вылетит. Значит надо либо через исключение обрабатывать вызов, либо назначать дефолтное значение.
Какой же ты долбоеб.
>>624330
ни в коем случае нотисов не должно быть, если вы уважаете себя и код.
если на на пальцах, то 1й случай быстрый но не факт что елемент в массиве будет существовать, будет как раз нотис потому правильней 2й вариант.
насчет массивов вы ошиблись, как раз если в массиве елемента не будет это не критично, хотя не хорошо, но если в обьекте это уже может быть критично.
как вы собираетесь проверять существование переменной в обьекте - очень неудобно, и обьекты больше жрут памяти и медленней обрабатываются.
Имхо я за массивы - минимум расходов максимум полезности, все легко проверить isset(ar[d]) и т.д.
Что-то вообще тебя не понял. Про какие объекты ты говоришь?
Суть в том, что отплавливает хсс, а что еще еадо для счастья?
Я например, в функции создаю объект
$order = new Class_Order($order_id);
Работаю с этим объектом, например получая его свойства
Затем вызываю др. функцию calc_sum_func($order_id), в которой также создаю новый объект с теми же именами так же с ним работаю
$order = new Class_Order($order_id);
и снова работа со свойствами этого объекта
И когда функция calc_sum_func() возвратит значение в основную функцию
снова происходит работа с первым объектом $order
То есть получается создается два объекта. Два разных объекта? Так можно делать? Конфликтов не возникает? Это норма?
Если соединить все вместе, то выглядит примерно так:
function some_func($order_id){
$order = new Class_Order($order_id);
$total = $order->total;
................................................
$sum = calc_sum_func($order_id);
................................................
$order->upadte_sum($sum);
}
function calc_sum_func($order_id){
$order = new Class_Order($order_id);
..................................................
return $order->yoba_eto_ti($ya);
}
Я например, в функции создаю объект
$order = new Class_Order($order_id);
Работаю с этим объектом, например получая его свойства
Затем вызываю др. функцию calc_sum_func($order_id), в которой также создаю новый объект с теми же именами так же с ним работаю
$order = new Class_Order($order_id);
и снова работа со свойствами этого объекта
И когда функция calc_sum_func() возвратит значение в основную функцию
снова происходит работа с первым объектом $order
То есть получается создается два объекта. Два разных объекта? Так можно делать? Конфликтов не возникает? Это норма?
Если соединить все вместе, то выглядит примерно так:
function some_func($order_id){
$order = new Class_Order($order_id);
$total = $order->total;
................................................
$sum = calc_sum_func($order_id);
................................................
$order->upadte_sum($sum);
}
function calc_sum_func($order_id){
$order = new Class_Order($order_id);
..................................................
return $order->yoba_eto_ti($ya);
}
Смысл в том, все вычисления по пересчете суммы заказа я хочу вынести в отдельную функцию calc_sum_func(), чтобы можно было вызывать ее из других частей программы, просто передавая Id заказа. Но опять же получается, что в основной функции some_func() я создаю экземпляр , и создаю еще один в calc_sum_func() ?
Конечно, все расчеты можно сделать в some_func() и обойтись одним экземпляром заказа, но теряется гибкость.
>>624128
Привет ОП, вчера попробовал твой метод, но суть в том, что функции ord и chr работают исключительно в рамках таблицы ASCII соответственно их невозможно применить для воспроизведения символов казахской кодировки.
ord - Returns the ASCII value of the first character of string.
chr - Returns a one-character string containing the character specified by ascii.
>разбиваешь строку на символы по 1 байту, проходишься и перекодируешь
не совсем понял, каким методом можно так разбить её? И куда в итоге девать эти байты? Если ord и chr, то гляди выше.
Нашел целый список кодировок казахского языка в iconv и все их пробовал переконвертировать через UTF-8, но исходных символов так и не удалось добиться.
Вот список который я пробовал.
CP154
CYRILLIC-ASIAN
PT154
PTCP154
CSPTCP154
KZ-1048
RK1048
STRK1048-2002
CSKZ1048
Для представления: iconv("UTF-8", "{Кодировка из списка например CP154}", "Ғ");
Всегда получалась лабуда вроде Ѓ или Є, но не как не Ғ.
Я так понимаю совместимости в данном случае ожидать невозможно, ибо CP1251-k отстутвует в PHP.
Может быть есть способ определения "сырого потока" данных для дальнейшего воспроизведения?
Ну чтобы передать винде списки кодов символов, а она их уже отобразила как надо?
>>624128
Привет ОП, вчера попробовал твой метод, но суть в том, что функции ord и chr работают исключительно в рамках таблицы ASCII соответственно их невозможно применить для воспроизведения символов казахской кодировки.
ord - Returns the ASCII value of the first character of string.
chr - Returns a one-character string containing the character specified by ascii.
>разбиваешь строку на символы по 1 байту, проходишься и перекодируешь
не совсем понял, каким методом можно так разбить её? И куда в итоге девать эти байты? Если ord и chr, то гляди выше.
Нашел целый список кодировок казахского языка в iconv и все их пробовал переконвертировать через UTF-8, но исходных символов так и не удалось добиться.
Вот список который я пробовал.
CP154
CYRILLIC-ASIAN
PT154
PTCP154
CSPTCP154
KZ-1048
RK1048
STRK1048-2002
CSKZ1048
Для представления: iconv("UTF-8", "{Кодировка из списка например CP154}", "Ғ");
Всегда получалась лабуда вроде Ѓ или Є, но не как не Ғ.
Я так понимаю совместимости в данном случае ожидать невозможно, ибо CP1251-k отстутвует в PHP.
Может быть есть способ определения "сырого потока" данных для дальнейшего воспроизведения?
Ну чтобы передать винде списки кодов символов, а она их уже отобразила как надо?
>Два разных объекта?
Да.
>Это норма?
Нет. Память/время х 2
Передавай уже готовый обьект заказа.
calc_sum_func($SomeOrder)
Да и по логике у объекта ордер должен быть метод пересчета стоимости который должен вызываться автоматически при добавлении/удалении товара.
Короче завязывай со своими глобальными функциями.
Спасибо. И еще вопрос, я правильно понимаю, что $order в функции calc_sum_func() виден только внутри этой функции? Как собственно и любая другая переменная?
>Да и по логике у объекта ордер должен быть метод пересчета стоимости который должен вызываться автоматически при добавлении/удалении товара.
Все верно, но задача стоит в написании что-то в виде плагина, который сможет сделать кастомный расчет, без изменения уже имеющегося класса.
Нотисы, варнинги информируют программистов и администраторов о том, что с приложением что-то не так и нужно вмешательство. А теперь подумай: если у тебя при нормальной работе тоже идут нотисы, то как ты поймешь: есть ошибки в коде или нет? лог становится завален мусором и бесполезен.
То что ты написал - это кривой код, если ты не можешь сделать чтобы он работал без нотисов. Если ты не знаешь как сделать, запости код, может сообразительный анон что-нибудь подскажет, тут таких много.
> ты с реальными приложениями вообще работал
Я самоучитель по PHP6 прочитал недавно.
>>624342
> и обьекты больше жрут памяти и медленней обрабатываются.
пруфы, цифры?
> но если в обьекте это уже может быть критично.
как в объекте может «не быть» элемента? Ты ничего не путаешь? У объектов есть только поля и методы.
>>624558
Нужны подробности.
>>624632
Нехорошо конечно. Надо посмотреть, может можно сразу объект в функцию и передавать.
Алсо названия функций у тебя кошмарные, зачем сокращать и зачем писать func?
> я хочу вынести в отдельную функцию calc_sum_func(), чтобы можно было вызывать ее из других частей программы, просто передавая Id заказа.
Можно сделать функцию, работающую только с объектом. Если где-то есть i то можно по нему получить объект и передать в функцию. хотя я вообще не понимаю, зачем тебе глобальные функции в ООП коде, лучше бы сделать Сервис Работы с Заказами и в нем нужные методы.
>>624650
Неправда. Они работают с байтами, и возвращают код первого байта строки либо создают строку из 1 байта. Работают с любыми значениями байт от 0 до 255.
> не совсем понял, каким методом можно так разбить её?
str_split например. Или цикл от 0 до strlen - 1, на каждом шаге берешь i-й байт строки через $string{$i}
В PHP строка это просто массив байт. Каждый байт имеет значение от 0 до 255. В 8-битных кодировках 1 символ кодируется ровно 1 байтом (и возможно до 256 разных символов), в utf-8 - 1 символ = от 1 до 6 байтов.
Чтобы получить i-й байт строки числом, пишешь ord($str{$i}). Чтобы создать строку из нескольких байт, пишешь либо chr(123) . chr(234) либо "\xa0\xc0".
Чтобы разбить utf-8 строку на массив символов (а там символы могут состоять из нескольких байт) нужен хак с preg_split.
> Может быть есть способ определения "сырого потока" данных для дальнейшего воспроизведения?
Нет, надо написать 2 функции перекодирования из cp1251k в utf-8 и обратно. Начинай писать, я могу проверить. Если что-то еще непонятно - уточняй.
Нотисы, варнинги информируют программистов и администраторов о том, что с приложением что-то не так и нужно вмешательство. А теперь подумай: если у тебя при нормальной работе тоже идут нотисы, то как ты поймешь: есть ошибки в коде или нет? лог становится завален мусором и бесполезен.
То что ты написал - это кривой код, если ты не можешь сделать чтобы он работал без нотисов. Если ты не знаешь как сделать, запости код, может сообразительный анон что-нибудь подскажет, тут таких много.
> ты с реальными приложениями вообще работал
Я самоучитель по PHP6 прочитал недавно.
>>624342
> и обьекты больше жрут памяти и медленней обрабатываются.
пруфы, цифры?
> но если в обьекте это уже может быть критично.
как в объекте может «не быть» элемента? Ты ничего не путаешь? У объектов есть только поля и методы.
>>624558
Нужны подробности.
>>624632
Нехорошо конечно. Надо посмотреть, может можно сразу объект в функцию и передавать.
Алсо названия функций у тебя кошмарные, зачем сокращать и зачем писать func?
> я хочу вынести в отдельную функцию calc_sum_func(), чтобы можно было вызывать ее из других частей программы, просто передавая Id заказа.
Можно сделать функцию, работающую только с объектом. Если где-то есть i то можно по нему получить объект и передать в функцию. хотя я вообще не понимаю, зачем тебе глобальные функции в ООП коде, лучше бы сделать Сервис Работы с Заказами и в нем нужные методы.
>>624650
Неправда. Они работают с байтами, и возвращают код первого байта строки либо создают строку из 1 байта. Работают с любыми значениями байт от 0 до 255.
> не совсем понял, каким методом можно так разбить её?
str_split например. Или цикл от 0 до strlen - 1, на каждом шаге берешь i-й байт строки через $string{$i}
В PHP строка это просто массив байт. Каждый байт имеет значение от 0 до 255. В 8-битных кодировках 1 символ кодируется ровно 1 байтом (и возможно до 256 разных символов), в utf-8 - 1 символ = от 1 до 6 байтов.
Чтобы получить i-й байт строки числом, пишешь ord($str{$i}). Чтобы создать строку из нескольких байт, пишешь либо chr(123) . chr(234) либо "\xa0\xc0".
Чтобы разбить utf-8 строку на массив символов (а там символы могут состоять из нескольких байт) нужен хак с preg_split.
> Может быть есть способ определения "сырого потока" данных для дальнейшего воспроизведения?
Нет, надо написать 2 функции перекодирования из cp1251k в utf-8 и обратно. Начинай писать, я могу проверить. Если что-то еще непонятно - уточняй.
Хех, я понял что мне можно по коду из ord вычислить символ и перекодировать его отобразив непосредственно на HTML странице или внутри файла текстом, это да, без проблем. Но мне нужно записать этот файл обратно же с именем из этих символов.
Я не очень понял, при чем тут отображение? Тебе надо функцию, получает на вход строку в одной кодировке, на выходе выдает строку в другой. Зачем что-то выводить?
Ты разбиваешь входную строку на символы (в зависимости от кодировки) и перекодируешь их посимвольно. И результат сохраняешь в другую строку.
Сводя всё конкретнее, мне нужно чтобы была возможность НЕ считывать из файла, а записывать файлы с именем ҒҒҒҒҒҒҒҒ. Именно меня интересует возможность присвоения имени ҒҒҒҒҒ к файлу в винде.
ОП, если это ты, скажи, у тебя получилось под виндой создать файл с именем ҒҒҒҒҒ? Если да, то я не буду спорить с тобой, а постараюсь вникнуть в твой текст.
Проверить можно так: посмотри 16-чный код этой буквы Ғ в cp1251k. Допустим это XX.
затем напиши имя файла так:
$name1251k = "\xXX\xXX\xXX.txt";
file_put_contents($name1251k, "test");
Вместо XX должен быть 16-чный код этого символа из страницы на википедии.
Они не помогут, поверь мне, я пропердолился с этим уже больше двух дней. Поставь виртуалочку на досуге, и затесть работу этого говна.
По идее же, должен работать такой код:
$file = chr(210);
fopen("C:\\ASED\\$file","w");
Так как судя по функции ord("Ғ"); - это 210. Но нет, нихера.
>>624763
Это вообще не работает. Тем более что 16-чной адресации не существует в cp1251k если я не ошибась конечно.
Есть мнение что файловая система NTFS использует кодировку символов UTF-16, но я пробовал опять таки делать конвертацию из UTF-8 в UTF-16 и тоже крякозябры.
> как судя по функции ord("Ғ"); - это 210.
Неверно. 210 это первый из 2 байт которыми эта буква кодируется в utf-8. А тебе надо передать в chr код этой буквы в cp1251-k. Судя по википедии, это 0x81 в 16-чной или 129 в десятичной.
> Поставь виртуалочку
Нет.
> Тем более что 16-чной адресации не существует в cp1251k если я не ошибась конечно.
Ты ошибаешься. 16-чные числа это просто другая форма записи чисел. Одно и то же число можно записывать в разных системах счисления, и оно выглядит в них по разному, но число это одно и то же.
> Есть мнение что файловая система NTFS использует
А я смотрел исходники PHP. В Windows есть 2 набора функций6 одни принимают данные в utf-16, другие в 8-битной кодировке (которая заивсит от языка винды и называется у майкрософт ANSI кодировка). PHP использует 8-битные функции.
Вот кстати таблица где записаны 16-чные коды символов в utf-8 и cp1251k: http://wiki.soiro.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Utf-8_cp1251-k.gif
В общем нужно сделать срипт, который принимает данные через get запрос, решает задачку и выводит ответ на страницу.
Срипт нужно расположить на сервере, чтобы к нему можно было обратиться по url.
Я справился со всем, кроме последнего. Где мне сервер найти? Можно как-то со своего компуктера запустить этот мини сайт?
дак и спроси у него, что ты от нас хочешь?
>>612606
>https://github.com/someApprentice - у тебя какие-нибудь вопросы к ОПу или анонам есть? Или мы все разобрали?
Да, есть. Все это время я прострировал потому что не как не понять как выглядит простая регистрация на ООП. Спасибо что вспомнил про меня.
Помимо этого, я, все же, пытался понять свою ошибку и пытался как-то переделать код. Сейчас я еще раз перечитаю пасты, подумаю и после попытаюсь сформулировать правильные вопросы.
Спасибо.
Спасибо анончик, я почитал пасты ОПа по твоим вопросам и понял как дальше делать студентов. Я тоже пилю с TableDataGateway.
При этом после нажатия на кнопку сенд данные в текстбоксах пропадают, как сделать, чтобы они оставались?
Можно подсмотреть у тебя?
>>621449
По 10-й задаче: надпись [2, 3, 4] слева надо сделать серой. Насчет картинки - меня беспокоит что из-за width 100% картинка может в каких-то условиях увеличиться. Нельзя ли сделать через max-width: 100%? В остальном, все ок.
По 11-й задаче: нет рамки при фокусировании верхнего переключателя с клавиатуры (тот что на радиокнопках) - почему?
Вместо label.button лучше писать просто .button в CSS коде, так как имени класса достаточно чтобы идентифицировать элемент.
Не уверен, хорошая ли идея использовать span, не лучше ли взять какой-нибудь другой тег, но что-то у меня идей нет что бы тут подошло, так что пусть остается как сделано. Кроме проблемы с фокусом, других замечаний нет. Хорошие переключатели, может тебе самому когда-нибудь пригодятся.
Ну и вроде я еще тут что-то отвечал: >>621519
>>621602
Можно но непонятно зачем. Что тебе мешает сразу написать $x = new SomeClass ?
>>621665
> cavinSpacey
Не надо так. Название функции начинается с глагола и обозначает что она делает. А пошутить можно в комментарии к ней.
> $dots = "/( ?)+([,.?!])( ?)+/";
приучайся везде ставить флаг u, а то потом не заработает регулярка с русскими буквами
> ( ?)+
В чем смысл писать вопрос и плюс? Это по моему можно заменить на звездочку.
Названия переменных тоже выбраны не очень удачно:
> $reg = preg_split('/(?<=[.?!])\s+/', $a);
Лучше заменить:
$reg -> $sentences
$a -> $text
$jobsAlmostDone -> $sentences
> for ($i = 0; $i < count($reg); $i++) {
Лучше foreach использовать для перебора массива
> mb_strtoupper(mb_substr($reg[$i],0,1)).mb_substr($reg[$i],1);
Это лучше вынести в отдельную функцию
Сам принцип работы программы правильный, молодец, но вот код можно еще улучшить.
>>621449
По 10-й задаче: надпись [2, 3, 4] слева надо сделать серой. Насчет картинки - меня беспокоит что из-за width 100% картинка может в каких-то условиях увеличиться. Нельзя ли сделать через max-width: 100%? В остальном, все ок.
По 11-й задаче: нет рамки при фокусировании верхнего переключателя с клавиатуры (тот что на радиокнопках) - почему?
Вместо label.button лучше писать просто .button в CSS коде, так как имени класса достаточно чтобы идентифицировать элемент.
Не уверен, хорошая ли идея использовать span, не лучше ли взять какой-нибудь другой тег, но что-то у меня идей нет что бы тут подошло, так что пусть остается как сделано. Кроме проблемы с фокусом, других замечаний нет. Хорошие переключатели, может тебе самому когда-нибудь пригодятся.
Ну и вроде я еще тут что-то отвечал: >>621519
>>621602
Можно но непонятно зачем. Что тебе мешает сразу написать $x = new SomeClass ?
>>621665
> cavinSpacey
Не надо так. Название функции начинается с глагола и обозначает что она делает. А пошутить можно в комментарии к ней.
> $dots = "/( ?)+([,.?!])( ?)+/";
приучайся везде ставить флаг u, а то потом не заработает регулярка с русскими буквами
> ( ?)+
В чем смысл писать вопрос и плюс? Это по моему можно заменить на звездочку.
Названия переменных тоже выбраны не очень удачно:
> $reg = preg_split('/(?<=[.?!])\s+/', $a);
Лучше заменить:
$reg -> $sentences
$a -> $text
$jobsAlmostDone -> $sentences
> for ($i = 0; $i < count($reg); $i++) {
Лучше foreach использовать для перебора массива
> mb_strtoupper(mb_substr($reg[$i],0,1)).mb_substr($reg[$i],1);
Это лучше вынести в отдельную функцию
Сам принцип работы программы правильный, молодец, но вот код можно еще улучшить.
> $creditBalance x $percent) + $servicePayment
Это повторяется там 3 раза, подумай как избавиться от повтора и упростить код. Если не знаешь как, можешь попросить подсказку.
>>621694
Для начала, усядься поудобнее на диване. Сейчас лучшие эксперты этого раздела подготовят тебе индивидуальный бизнес-план.
>>621697
Никаких
>>621781
Ой-ой, как код плохо оформлен. Ну что это за переменные, что значат их названия?
> $a
> $array1
> $array2
> $value
Надо их переименовать, а то читать тяжело.
> preg_replace('/[,;]/', "", $a);
Лучше заменять на пробел, а то слова могут склеиться
> for ($i = 0; $i < count($array2); $i++) {
Тут лучше foreach
> $array2[$i] = array_reverse($array2[$i]);
> $array2[$i] = implode(" ", $array2[$i]);
Лучше использовать временную переменную вместо элемента массива (меньше скобок будет)
> mb_strtoupper(mb_substr($array2[$i],0,1)).mb_substr($array2[$i],1);
Это надо вынести в отдельную функцию с понятным названием
Сам алгоритм решения верный, но вот код очень неаккуратно выглядит.
>>621820
Вот тут http://docs.slimframework.com/configuration/settings/ нет настройки slim.errors
Вот тут http://docs.slimframework.com/errors/output/ эта настройка меняется через environment
Я бы проверил исходники, поискал эту настройку там и проверил, можно ее передавать как конфиг или нет.
> $creditBalance x $percent) + $servicePayment
Это повторяется там 3 раза, подумай как избавиться от повтора и упростить код. Если не знаешь как, можешь попросить подсказку.
>>621694
Для начала, усядься поудобнее на диване. Сейчас лучшие эксперты этого раздела подготовят тебе индивидуальный бизнес-план.
>>621697
Никаких
>>621781
Ой-ой, как код плохо оформлен. Ну что это за переменные, что значат их названия?
> $a
> $array1
> $array2
> $value
Надо их переименовать, а то читать тяжело.
> preg_replace('/[,;]/', "", $a);
Лучше заменять на пробел, а то слова могут склеиться
> for ($i = 0; $i < count($array2); $i++) {
Тут лучше foreach
> $array2[$i] = array_reverse($array2[$i]);
> $array2[$i] = implode(" ", $array2[$i]);
Лучше использовать временную переменную вместо элемента массива (меньше скобок будет)
> mb_strtoupper(mb_substr($array2[$i],0,1)).mb_substr($array2[$i],1);
Это надо вынести в отдельную функцию с понятным названием
Сам алгоритм решения верный, но вот код очень неаккуратно выглядит.
>>621820
Вот тут http://docs.slimframework.com/configuration/settings/ нет настройки slim.errors
Вот тут http://docs.slimframework.com/errors/output/ эта настройка меняется через environment
Я бы проверил исходники, поискал эту настройку там и проверил, можно ее передавать как конфиг или нет.
> $test_preg_split = array();
Эту строчку можно не писать, она ничего не делает полезного. Саму переменную надо назвать осмысленнее, например $sentences
> for ($i = 0; $i < $index-1; $i++) {
Тут лучше использовать foreach. Также, по моему из-за $i < $index-1; ты пропускаешь последнее предложение.
> ( ?)+
Тут можно использовать звездочку вместо вопроса и плюса
> [,]
Квадратные скобки не требуются
В остальном, верно.
>>621997
у тебя удивитеьные способности видеть скрытый смысл даже в идентификаторах.
Советы:
> '/\\,/' => ', ',
> '/\\;/' => '; ',
> '/\\!/' => '! ',
Эти выражения можно объединить в одно, а при замене использовать $1 .. $9 для обозначения знака препинания. Более того, получившееся выражение можно засунуть в первый массив с регулярками для поиска ошибок.
> '/жы/ui' => 'жи',
> '/шы/ui' => 'ши',
Тоже можно объединить.
> '/ а /u' => ', а ',
> '/ а, /u' => ', а, ',
> '/ а \\-/u' => ', а \\-',
> '/ но /u' => ', но ',
> '/ но, /u' => ', но, ',
Тоже можно объединить
> "/.{3,5}координально.{3,5}/ui",
Не выводит сообщение об ошибке если слово стоит в самом начале текста: https://ideone.com/jdUhTn
> [^а-яё]здела
Здесь наверно лучше использовать \\b которое значит «граница слова» и ищет место, где с одной строны строит \\w (буква, цифра, подчеркивание), а с другой - не \\w.
> [а-яёa-z]\\sа
Здесь лучше разрешить использовать больше 1 пробела, для обозначения того что в начале идет буква, можно испоьзовать \\w (любые буквы, цифры, подчеркивание)
> ...
ТОчка значит «любой символ». Чтобы искать многтточие, надо писать \\.\\.\\. Имей в виду, что в юникоде есть многоточие одним символом: …
Я думаю, там лучше использовать \\b чтобы сказать что справа от слова «но» не должно быть букв или цифр.
> "/.{3,5}[а-яёa-z]\\sа(\\s?|,|...| \\-).{3,5}/u",
> "/.{3,5}[а-яёa-z]\\sно(\\s?|,|...| \\-).{3,5}/u",
Можно объединить вместе
> [^\\s]
То же самое что \\S
> [,\\.!\\?:;][^\\s]
Это может сработать на многоточие .. или 2 воскл знака: !!. Надо вместо ^\\s написать «любая буква»
> for ($i=0; $i < $possibleErrorsCount; $i++)
Тут удобнее исплоьзовать foreach
> if (preg_match_all($possibleErrors[$i]['pattern'], $text, $matches)) {
if можно не использтовать для preg_match_all, если она ничего не найдет то массив будет пустой и цикл не выполнится ни разу.
> foreach ($cleanMatches as $key => $value)
$value надо переименовать. $key не надо писать если ты его не используешь.
Длинные комментарии надо писать над строчкой, а не справа.
В общем, попробуй улучшить код теперь. Пока не все идеально.
>>622088
Да, старые, так что в дополнение к ним почитай php the right way и узнай что поменялось в PHP. Насчет книг - не знаю хороших и современных.
>>622092
> 0 => array (
> 1 => array
Не надо писать тут 0, 1, PHP сам их пронумерует.
Ну и все замечания выше надо исправить, регулярки объединить, исправить, упростить итд.
> И получается, что ошибок не найдено, а текст исправляется.
> Как скрипт остановить в этом случае?
Можно проверять количество найденных ошибок через if и не исправлять если их ноль.
> $test_preg_split = array();
Эту строчку можно не писать, она ничего не делает полезного. Саму переменную надо назвать осмысленнее, например $sentences
> for ($i = 0; $i < $index-1; $i++) {
Тут лучше использовать foreach. Также, по моему из-за $i < $index-1; ты пропускаешь последнее предложение.
> ( ?)+
Тут можно использовать звездочку вместо вопроса и плюса
> [,]
Квадратные скобки не требуются
В остальном, верно.
>>621997
у тебя удивитеьные способности видеть скрытый смысл даже в идентификаторах.
Советы:
> '/\\,/' => ', ',
> '/\\;/' => '; ',
> '/\\!/' => '! ',
Эти выражения можно объединить в одно, а при замене использовать $1 .. $9 для обозначения знака препинания. Более того, получившееся выражение можно засунуть в первый массив с регулярками для поиска ошибок.
> '/жы/ui' => 'жи',
> '/шы/ui' => 'ши',
Тоже можно объединить.
> '/ а /u' => ', а ',
> '/ а, /u' => ', а, ',
> '/ а \\-/u' => ', а \\-',
> '/ но /u' => ', но ',
> '/ но, /u' => ', но, ',
Тоже можно объединить
> "/.{3,5}координально.{3,5}/ui",
Не выводит сообщение об ошибке если слово стоит в самом начале текста: https://ideone.com/jdUhTn
> [^а-яё]здела
Здесь наверно лучше использовать \\b которое значит «граница слова» и ищет место, где с одной строны строит \\w (буква, цифра, подчеркивание), а с другой - не \\w.
> [а-яёa-z]\\sа
Здесь лучше разрешить использовать больше 1 пробела, для обозначения того что в начале идет буква, можно испоьзовать \\w (любые буквы, цифры, подчеркивание)
> ...
ТОчка значит «любой символ». Чтобы искать многтточие, надо писать \\.\\.\\. Имей в виду, что в юникоде есть многоточие одним символом: …
Я думаю, там лучше использовать \\b чтобы сказать что справа от слова «но» не должно быть букв или цифр.
> "/.{3,5}[а-яёa-z]\\sа(\\s?|,|...| \\-).{3,5}/u",
> "/.{3,5}[а-яёa-z]\\sно(\\s?|,|...| \\-).{3,5}/u",
Можно объединить вместе
> [^\\s]
То же самое что \\S
> [,\\.!\\?:;][^\\s]
Это может сработать на многоточие .. или 2 воскл знака: !!. Надо вместо ^\\s написать «любая буква»
> for ($i=0; $i < $possibleErrorsCount; $i++)
Тут удобнее исплоьзовать foreach
> if (preg_match_all($possibleErrors[$i]['pattern'], $text, $matches)) {
if можно не использтовать для preg_match_all, если она ничего не найдет то массив будет пустой и цикл не выполнится ни разу.
> foreach ($cleanMatches as $key => $value)
$value надо переименовать. $key не надо писать если ты его не используешь.
Длинные комментарии надо писать над строчкой, а не справа.
В общем, попробуй улучшить код теперь. Пока не все идеально.
>>622088
Да, старые, так что в дополнение к ним почитай php the right way и узнай что поменялось в PHP. Насчет книг - не знаю хороших и современных.
>>622092
> 0 => array (
> 1 => array
Не надо писать тут 0, 1, PHP сам их пронумерует.
Ну и все замечания выше надо исправить, регулярки объединить, исправить, упростить итд.
> И получается, что ошибок не найдено, а текст исправляется.
> Как скрипт остановить в этом случае?
Можно проверять количество найденных ошибок через if и не исправлять если их ноль.
sql, серверный язык вроде PHP, ООП, MVC, фреймворки
>>622273
> $bigRegexp = "/координально|сдесь|
Не, это не лучшая идея, у тебя уже получается на каждую ошибку аж 3 регулярки (общая, для поиска и для исправления), раскиданных по программе. Это уже перебор. Очень неудобно будет их добавлять или исправлять в 3 местах сразу.
Для проверки есть ли ошибки можно завести переменную и в нее суммировать число найденных ошибок каждой регуляркой. А еще можно регулярки для исправления поместить в ощий массив регулярок и применять только если есть ошибка данного типа.
Все замечания выше надо исправить.
>>622288
Увы, модель предметной области пока сделана неправильно. Ну например у тебя все засунуто в один класс, и мы не можем добавить новую профессию не правя код. Пока это не ООП, а код который притворяетя что он ООП. Ну и с твоим кодом будет сложно сделать вот это дополнительное задание (оно проверяет насколько твой код гибок и насколько удобно его изменять под требования заказчика):
----------------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коллектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
----------------
Теперь давай посмотрим, как тут сделать классы правильно.
----------------
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент, может быть еще Компания?)
— какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег.
— как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии. Правда в этом случае мы не можем поменять профессию сотрудника.
Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php
«Абстрактный» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php
Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.
В общем, чем меньше публичных свойств и методов, тем лучше. Ведь когда другой разработчик или ты сам захочет использовать класс, он будет смотреть только на публичные элементы, и чем их меньше, тем проще разобраться как класс работает. Но не стоит закрывать вообще все: надо думать, является ли метод частью вунтренней логики класса или он предназначен для выдачи полезной информации.
Когда ты проектируешь класс, ты можешь представить себе что ты делаешь некую коробочку, из которой торчат переключатели и провода. Публичные свойства и методы - это то, что ты разрешаешь использовать другим программистам. Приватное - это то, что скрыто внутри коробки и что они трогать не должны.
----------------
Вот что надо сделать:
- заменить один класс на несколько, чтобы каждый соответствовал одной сущности
- убрать из классов все что к ним не относится. Например разбор строки с должностью и уровнем надо убрать. Также, посмотреть и избавиться от лишних массивов.
- проставить правильно private/public
- сделать еще и вторую часть задания
Советую показывать промежуточные варианты.
>>622296
> Ни разу не встретил и не читал такого: "На работе у нас возникла такая то задача, мы применили такие то паттерны, и это принесло профиты."
А ты слышал такое?
- мы применили if и это принесло профиты
- мы применили цикл и массив и это принесло профиты
Вряд ли кто-то будет хвастаться что он знает основы языка? Паттерны это те же основы только в плане архитектуры. Они используются например в общении между программистами: «там в проекте есть FrontController, мы можем наш код в него дописать» или «давайте тут не будем заморачиваться, а используем Single table Inheritance».
sql, серверный язык вроде PHP, ООП, MVC, фреймворки
>>622273
> $bigRegexp = "/координально|сдесь|
Не, это не лучшая идея, у тебя уже получается на каждую ошибку аж 3 регулярки (общая, для поиска и для исправления), раскиданных по программе. Это уже перебор. Очень неудобно будет их добавлять или исправлять в 3 местах сразу.
Для проверки есть ли ошибки можно завести переменную и в нее суммировать число найденных ошибок каждой регуляркой. А еще можно регулярки для исправления поместить в ощий массив регулярок и применять только если есть ошибка данного типа.
Все замечания выше надо исправить.
>>622288
Увы, модель предметной области пока сделана неправильно. Ну например у тебя все засунуто в один класс, и мы не можем добавить новую профессию не правя код. Пока это не ООП, а код который притворяетя что он ООП. Ну и с твоим кодом будет сложно сделать вот это дополнительное задание (оно проверяет насколько твой код гибок и насколько удобно его изменять под требования заказчика):
----------------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коллектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
----------------
Теперь давай посмотрим, как тут сделать классы правильно.
----------------
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент, может быть еще Компания?)
— какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег.
— как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии. Правда в этом случае мы не можем поменять профессию сотрудника.
Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php
«Абстрактный» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php
Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. Ну к примеру, в Департаменте метод посчитатьОбщиеЗатратыНаЗарплату() должен быть публичным - для этого мы и пишем класс, чтобы считать затраты.
В общем, чем меньше публичных свойств и методов, тем лучше. Ведь когда другой разработчик или ты сам захочет использовать класс, он будет смотреть только на публичные элементы, и чем их меньше, тем проще разобраться как класс работает. Но не стоит закрывать вообще все: надо думать, является ли метод частью вунтренней логики класса или он предназначен для выдачи полезной информации.
Когда ты проектируешь класс, ты можешь представить себе что ты делаешь некую коробочку, из которой торчат переключатели и провода. Публичные свойства и методы - это то, что ты разрешаешь использовать другим программистам. Приватное - это то, что скрыто внутри коробки и что они трогать не должны.
----------------
Вот что надо сделать:
- заменить один класс на несколько, чтобы каждый соответствовал одной сущности
- убрать из классов все что к ним не относится. Например разбор строки с должностью и уровнем надо убрать. Также, посмотреть и избавиться от лишних массивов.
- проставить правильно private/public
- сделать еще и вторую часть задания
Советую показывать промежуточные варианты.
>>622296
> Ни разу не встретил и не читал такого: "На работе у нас возникла такая то задача, мы применили такие то паттерны, и это принесло профиты."
А ты слышал такое?
- мы применили if и это принесло профиты
- мы применили цикл и массив и это принесло профиты
Вряд ли кто-то будет хвастаться что он знает основы языка? Паттерны это те же основы только в плане архитектуры. Они используются например в общении между программистами: «там в проекте есть FrontController, мы можем наш код в него дописать» или «давайте тут не будем заморачиваться, а используем Single table Inheritance».
>>622300
Все зависит от тебя
>>622862
Почему? Пусть напоминает о себе, меньше вероятность что я пропущу его. Ничего плохого в том чтобы раз в день напомнить о себе, нет.
>>622383
Используй dependency injection, то есть создай сначала калсс с сокетом и передай его в класс Imap через конструктор или аргумент метода.
Урок https://gist.github.com/codedokode/e1d31a31b37d5f635057
>>622403
А наши задачки на HTML прошел? Может стоит глянуть? А так, я бы советовал учить JS/DOm/jQuery, верстальщик без яваскрипта маловостребован, тем более в кризис. В Оп посте есть задачки и ссылки на учебник learn.javascript.ru .
>>622428
> $number = 0;
> $op = $char;
Это там раз 5 повторено, надо бы вынести из свитча.
В свитче поставь default и в нем сделай die чтобы если ты допустишь ошибку, ее было видно (потом когда выучишь исключения, будешь исплоьзовать их).
> case ("+"):
Скобки не требуются
Еще там 2 раза скопирован свитч с операциями - убери копипасту.
>>622437
Поищи команду SET NAMES в дампе, если ее нет, то надо определить кодировку дампа и поставить эту команду. Также, посмотри какая кодировка стоит, если есть, в CREATE TABLE. Лучше всего использовать utf8 (в mysql она пишется без дефиса). Если кодировка не указана в CREATE TABEL то она берется из кодировки базы или настроек mysql в конфиге.
>>622445
Неправильно советуешь. iconv не нужен если все правильно настроено. В коде надо использовать utf-8, при соединении с БД делать set_charset или SET NAMES utf8
>>622520
Сложнй модуль судя по описанию. даже если найти готовые плагины, надо их допиливать.
ulogin по моему имеет какие-то недостатки, то ли он данные какие-то собирает то ли что-то на страницу ставит, не помню уже.
>>622670
> Лучше напишу свою функцию/метод, где запрос будет слепливаться в цикле и там же привязать параметры.
Можно но удобнее конечно когда это библиотека делает
> доктрина это королева orm,
Да, стоит рано или поздно с ней знакомиться. Лучше пока ничего нету.
> Может есть более кошерный фреймворк, кроме бутстрапа?
Я не знаю. Бутстрап вроде самый известный.
> Чтобы была нормальная структура html и не было этой мешанины типа class class-another class-abc class-class-class
Это нормально.
>>622691
Можешь сделать и так, и так, можешь сделать функцию для заквочивания массивов, можешь подключить квери билдер. Но не стоит генерировать тысячи плейсхолдеров для каждого элемента массива.
>>622300
Все зависит от тебя
>>622862
Почему? Пусть напоминает о себе, меньше вероятность что я пропущу его. Ничего плохого в том чтобы раз в день напомнить о себе, нет.
>>622383
Используй dependency injection, то есть создай сначала калсс с сокетом и передай его в класс Imap через конструктор или аргумент метода.
Урок https://gist.github.com/codedokode/e1d31a31b37d5f635057
>>622403
А наши задачки на HTML прошел? Может стоит глянуть? А так, я бы советовал учить JS/DOm/jQuery, верстальщик без яваскрипта маловостребован, тем более в кризис. В Оп посте есть задачки и ссылки на учебник learn.javascript.ru .
>>622428
> $number = 0;
> $op = $char;
Это там раз 5 повторено, надо бы вынести из свитча.
В свитче поставь default и в нем сделай die чтобы если ты допустишь ошибку, ее было видно (потом когда выучишь исключения, будешь исплоьзовать их).
> case ("+"):
Скобки не требуются
Еще там 2 раза скопирован свитч с операциями - убери копипасту.
>>622437
Поищи команду SET NAMES в дампе, если ее нет, то надо определить кодировку дампа и поставить эту команду. Также, посмотри какая кодировка стоит, если есть, в CREATE TABLE. Лучше всего использовать utf8 (в mysql она пишется без дефиса). Если кодировка не указана в CREATE TABEL то она берется из кодировки базы или настроек mysql в конфиге.
>>622445
Неправильно советуешь. iconv не нужен если все правильно настроено. В коде надо использовать utf-8, при соединении с БД делать set_charset или SET NAMES utf8
>>622520
Сложнй модуль судя по описанию. даже если найти готовые плагины, надо их допиливать.
ulogin по моему имеет какие-то недостатки, то ли он данные какие-то собирает то ли что-то на страницу ставит, не помню уже.
>>622670
> Лучше напишу свою функцию/метод, где запрос будет слепливаться в цикле и там же привязать параметры.
Можно но удобнее конечно когда это библиотека делает
> доктрина это королева orm,
Да, стоит рано или поздно с ней знакомиться. Лучше пока ничего нету.
> Может есть более кошерный фреймворк, кроме бутстрапа?
Я не знаю. Бутстрап вроде самый известный.
> Чтобы была нормальная структура html и не было этой мешанины типа class class-another class-abc class-class-class
Это нормально.
>>622691
Можешь сделать и так, и так, можешь сделать функцию для заквочивания массивов, можешь подключить квери билдер. Но не стоит генерировать тысячи плейсхолдеров для каждого элемента массива.
>>622820
> Выполнил кубики
Неплохо, но с даблами там по другому, там ничья если у обоих выпали даблы независимо от числа очков.
> циклы
Там ошибки, смотри внизу на ideone:
> PHP Notice: Undefined variable: paymentAfterAll in /home/si1YgK/prog.php on line 12
> PHP Notice: Undefined variable: month in /home/si1YgK/prog.php on line 20
Обращаешься к несуществующей на тот момент переменной.
> if ($totalCredit <= $paymentAfterAll
Это явно непраивльно так как переменная справа еще не существует.
>>622890
При ошибке надо бы завершать скрипт, а не продолжать выполнять
>>622902
Все зависит от тебя, как ты воспользуешься своими знаниями. Цифры смотри на сайте вакансий и фрилансе.
Молодец.
А ты пройди наши задачки из Оп поста по этим темам - этого будет достаточно. Конечно нужны, ведь тебе надо будет работать с чужой версткой и важно не разломать ее и не писать код которй потом будет тяжело поддерживать.
Да, спасибо, я пока финальные задачи по пхп доделываю. Хтлм там следующим идёт. Эх, жалко второго уровня нет
Проиграл на весь офис.
>>612606
>>625108
https://github.com/someApprentice/Students
Вроде бы разобрался. Один вопрос, у меня init написан процедурно, не возникнет ли у меня проблем, если, например, в этом же коде, я захочу написать его как класс? Я помню что так можно делать, просто не понимаю почему сейчас лучше процедурно. Это потому что так удобней делать внедрение зависимостей? Я бы классом сделал и внедрял её статически __construct(PDO Init::$pdo).
1) Все эти мвц, паттерны, алгоритмы - зачем это все? Попытался написать код в стиле дезигн паттернс, он разросся и расплодил сущностей, а реальное изменение его все равно потребует перепила половины файла. Да и вообще, ооп в пхп - к чему это? К чему все эти симфони и прочие фреймворки, если все равно пишутся бесконечные админки, круды и проверка форм? Куда расти и зачем? Чтоб смотрите как могу? Ведь все равно, я так понимаю, хайлоад на пхп не пишут, каких-то хардкорных вычислений не делают и уж тем более не рисуют красивой картинки или каких-то распределенных систем, например. Так зачем все это?
2) А что в итоге? Вот подучился я. Приехал в ДС. На какую зарплату рассчитывать стажеру? А после пары лет? А к тридцатнику? А дальше куда деваться? Хэдхантерам и прочим фрилансим.ру не доверяю, хочу твоего мнения.
И вопрос не по теме: где искать таких няш, как ты, по другим языкам - с++, шарп, питон, етц. Ну, наставничество и вот это все. Не в рашке, надо понимать, лол?
> Все эти мвц, паттерны, алгоритмы - зачем это все?
Циклы, переменные, функции - зачем это все? Это основы без которых ничего не сделать.
> он разросся и расплодил сущностей, а реальное изменение его все равно потребует перепила половины файла.
Зато не половину приложения. Ну и я не видел твой код, может он на самом деле не ООП, а процедурщина с классами.
> К чему все эти симфони и прочие фреймворки, если все равно пишутся бесконечные админки, круды и проверка форм?
Ну так с ООП и ORM формы и круды делать проще и быстрее. Это же ад, делать без готовых библиотек форму с валидацией и работой с БД.
> хайлоад на пхп не пишут,
фейсбук, википедия не хайлоад?
> На какую зарплату рассчитывать стажеру?
С этим на hh.ru или в wrk
> по другим языкам
Не знаю. Но я думаю если ты хорошо изучил PHP то с другимии языками ты и сам наверно справишься.
Ты разве ОП?
Циклы, переменные и функции - это основы. А фабрики абстрактных адаптеров - это ебанина.
Чего писать-то, те же скрипты на 300 строчек.
Почему не хочешь ответить на вопрос о зп? Сколько сам получаешь, например? А аноны, которые тут к успеху пришли? Друзья, знакомые?
>или в wrk
Там ничего толкового не будет точно, дам одни долбоёбы-версталы да сис. админы сидят у которые ждут полной автоматизации в настройке и развертывании сети, чтобы остаться безработными.
ОП в принципе тоже не совсем компетентный.
> Почему не хочешь ответить на вопрос о зп?
Потому что не хочу. Мне не нравится когда людей оценивают исключительно по этой цифре. Сам никогда не интересуюсь кто сколько зарабатывает.
Но это же показывает степень мастерства? Не? Просто так же не будут платить РНР разработчику.
Тогда тебе лучше ориентироваться на тренеров по дзюдо, владельцев нефтяных компаний и получателей господрядов - такому мастерству как у них, в нашем треде точно не научат.
Вообще это не имел ввиду. Сколько получает СРЕДНИЙ стажер по дс? А хуй с 3 годами стажа? А сеньор? А дальше что делать и какие перспективы?
Может тебе стоит определиться, чем ты хочешь занимать? Бек енд или можете тебе больше нравится фронтенд?
Вротенд на РНР? ЩО?
>Почему не хочешь ответить на вопрос о зп? Сколько сам получаешь, например? А аноны, которые тут к успеху пришли? Друзья, знакомые?
ОП успешный человек! У него, очевидно, пассивный доход или уже накопленные капиталы раз у него есть время и на нас! А ведь он отвечает почти каждый день, и это длиться уже не первый год. Ты представляешь насколько ОП поразителен? говорите что он не компетентен? Я после его уроков диву даюсь какой у меня красивый и простой код. Я лично после его уроков за год-полгода устроился в веб-конторку с первого раза, просто оставив ссылку на свой гитхаб в резюме, и продолжаю идти к успеху который, как я хотел бы, не уступил успеху ОПа.
Нет
>Он охуенен, базара нет. Вопроса про зарплаты в отрасли это не снимает.
>базара
Тебя это ебать не должно.
>Допустим, дальше что?
Когда ты это допустишь, тебя уже ебать не будет соклько ты получаешь, ты будешь получать удовольствие от кодинга в первую очередь.
>Гениальный вопрос с учетом заголовка треда.
Ну ОП еще тут развел верстку и JS тред. Только меня не одного наверное это дико напрягает, когда вёрстко-макаки его вопросами забрасывают.
>Он охуенен, базара нет. Вопроса про зарплаты в отрасли это не снимает.
Значит ты еще не определился для себя охуенен или нет, раз тебя волнует размер его хуя.
Тебе же дали совет зайти на hh.ru и сделать анализ рынка труда. Алсо, где-то тут в разделе есть зарплата-тред.
Больше подходит определение - кодовая разметка, ибо сводится всё к конкретному позиционированию объектов. Так или иначе всё гораздо примитивнее как по мне. Не в обиду сказано.
только почему-то многие верстальщики и php-разработчики даже эту «примитивную» технологию освоить не смогли и верстают наугад переставляя свойства. Быдлокодеры, в общем.
>php-разработчики
Примитивнее относительно даже скриптовых языков я имел в виду. Но говноедом PHPшника так или иначе нельзя назвать, если он верстает на похуй.
>>>625378
>Такс, такс, с такими нервишками ты много денег не заработаешь.
Да какой-то поехавший чсв в вкатился в тред что-то требует от нас. Его интеллигентно посылают нахуй, а он питушится от того что тут его величесивупетуху никто ничего не должен. Таким как он здесь не рады, мы тут обсуждаем кошек-мышек и аниме!
Человек просто запланировал зарабатывать много денег программированием.
Не обращай внимание на тупого семена
Это вряд-ли. Мне даже своих студентов стыдно показывать, я уж не говорю про вещи попроще.
Два горячих чаю налил с разбега и по хардкору!
ОП - это мощь и глыба, плюс хороший человек.
У меня именно с такими, как наш ОП, ассоциируется практически всё то лучшее, что есть на анонимных имиджбордах: бескорыстная помощь, братство, освещение новых горизонтов, непредвзятая оценка.
Так ты делай нормально. Переделай их, чтобы бы было не стыдно.
Но некоторые из них уже устроились на работу, ёпта. Хотя я тоже не очень отношусь к познаниям ОПа.
Как будто это что-то сложное.
И я ничего не имею ни против опа, ни против его малолетних поклонников. Просто это выглядит смешно, вот и все.
И флуда слишком много в треде, поэтому призываю всех хоть чуть-чуть думать перед тем как писать.
Желательно чтобы тред состоял из полезной инфы, то есть вопросов и ответов, а не чата как сейчас.
Ты первый начал.
Да в чем неприемлемо-то? И для кого? Это двач, детка. Вежливо спросил, какие в среднем с зарплатами у проггеров на php разного уровня. Начались какие-то предъявы, нравоучения и оскорбления.
Тебе не менее вежливо предложили посмотреть на hh.ru.
Тут был анон из ДС с зп 120к у джуна, есть знакомый с зп 150к опять же в ДС, но там питон и он админ.
Хз, чё тебе надо, возьми да сам посмотри.
Ну попросил же мнение анонов
Эх, опять платина...
Нет никаких полезных книг, это не история и не география, чтобы научиться по книжке.
Учиться нужно по документации и постоянно практиковать, то есть писать код и пытаться его улучшить.
В любой нормальной конторе ведущий программист делает ревью кода стажеров и джуниоров.
Сделай задания из шапки на сайт регистрации студентов и файлообменник, выложи сюда, оп напишет замечания. Когда исправишь понимание кода станет значительно лучше. Затем нужно устроиться в контору где поставлена командная работа. Потом можешь попробовать читать Фаулера и Мартина.
>>625536
Серьезно. Не путай стажера с джуниором.
Не путай веб-студии, которые занимаются версткой и cms, с крупными программистскими конторами.
Не занимайся щит-постингом на дваче, пиши код.
120 у джуна это как-то слишком прохладно, постоянно вижу вакансии в ДС с зараплатой что-то около 120 но это для сеньоров и мидлов, у джунов дай бог 60к.
ОП, сам сказал, кто до 10го еще не проверен откликнитесь. Ну ты где?
ОП, привет.
Я снова проклятые регекспы принёс, посмотри, пожалуйста:
http://ideone.com/Z2veAt
Задача про опечаточников, вместе с заменой, по сути первая часть задачи там же содержится. Ты в прошлый раз мне посоветовал замену проводить через strtr() и бить строку на слова, что я и сделал (хоть и перестал чувствовать себя регексп-ниндзя).
И со всеми праздниками тебя! Спасибо, что тратишь своё время.
2. приведите пример проекта, где красиво и правильно записаны эксепшены в логи.
Я уже практически не пишу в этом треде, смотря на все это безумие, когда задачки школьников на дивы и регулярки комментируют огромными пастами, а мои мини-приложения тонут в потоках задачек и флуда без внимания. Рак, геи, аниме, задачки, школьники, верстка убили этот тред.
Отличное решение, а у меня фуфло какое-то с кучей регулярок и без функций, при этом без замены кириллицы в латинских словах: >>623605
Заменить-то, пожалуй, не сложно, но только я бы снова лепил отдельную регулярку для этого...
А у тебя не понял, как так функция checkText() работает и всё передаёт без return?
Я сделал клавишу Shift вчера, там только столкнулся с тем, что return возвращает единожды, поэтому надо собирать то, что происходило в цикле через array_push в пустой массив, выводить его return'ом.
Снова вижу, что ни хрена не понимаю.
Я что-то не разберусь никак с нормальной заменой регулярок с помощью $1, $2 и так далее - какая-то каша на выходе, приходится несколько разных регулярок делать для такого, ОП уже отругал. Вот это подтянуть надо.
Чёртов двощ, с трудом понял, троллишь ты или нет. Спасибо, если нет. У тебя даже компактнее как-то это всё, хотя способ выделения опечаток [] и правда выглядит топорно.
У меня, как видишь, для обратной замены ещё один массив с буквами, и ещё один регексп, только наоборот, так что...
А checkText() у меня ничего и не передаёт, она выводит словом из массива, и всё.
Про клавишу Shift только тебя не понял.
Насчёт $1 и скобок, я где-то прочитал годную статью, но не смог её найти сейчас. В мануале есть, посмотри пример с подмасками: http://php.net/manual/ru/function.preg-replace.php . Суть в том, что ты ставишь скобки в регэкспе, и можешь потом в preg_replace() в $replacement к ним обращаться, по номеру скобки, в том порядке, в котором они у тебя стоят, начиная с $1 ($0 это всё выражение вроде). Очень прикольно! Мне пришлось понять, когда Grammar Nazi делал, хотя чем дальше в лес, тем больше дров, хочется уже с ними закончить и ООП всякое пройти. Жду ОПа вот.
Ноуп, даже и не думал троллить.
>У тебя даже компактнее как-то это всё, хотя способ выделения опечаток [] и правда выглядит топорно.
Да, надо бы сделать как раз через массив с переворачиванием регулярок с кириллицы на латиницу и наоборот и через '$1[$2]', как у тебя это реализовано. Так намного компактнее всё выходит.
>А checkText() у меня ничего и не передаёт, она выводит словом из массива, и всё.
Я вот как раз не знал, что там может быть просто echo, думал, что только return там работает. Думал, что иначе нельзя сделать какой-то результат доступным вне функции.
>Насчёт $1 и скобок, я где-то прочитал годную статью, но не смог её найти сейчас. В мануале есть, посмотри пример с подмасками: http://php.net/manual/ru/function.preg-replace.php . Суть в том, что ты ставишь скобки в регэкспе, и можешь потом в preg_replace() в $replacement к ним обращаться, по номеру скобки, в том порядке, в котором они у тебя стоят, начиная с $1 ($0 это всё выражение вроде). Очень прикольно!
Спасибо, бро, сейчас читаю. Вроде же всё понятно, действительно, всё даже и совсем не сложно. А я почему-то их у ОПа на сайте попробовал, как-то толком не пошло - я и забыл про них.
У меня и Grammar Nazi написан с кучей регулярок, за что ОП и отругал.
Перепишу всё теперь.
>чем дальше в лес, тем больше дров, хочется уже с ними закончить и ООП всякое пройти
Я хочу потом ещё кучу всяких задачек пройти и весь учебник ОПа полностью без подсказок и возвращения к уже решённым задачам - хочу набить руку на этом, чтобы уже не задумываться о том, как там массив с помощью foreach разложить на ключи и значения и такого типа.
На разные функции хочу какие-нибудь задачки потом порешать, а то совсем неуверенно себя чувствую.
Клавиша Shift - это следующая задача, уже после опечаточника идёт.
Вот так: что-то пропустишь или не придашь чему-либо должного значения, а потом лепишь кучу лишнего кода и выдаёшь топорные решения...
Спасибо анончику и ОПу, всё-всё переделаю теперь, где лепил лишние регулярки, вместо того чтобы просто использовать $n.
Также узнал (здесь звучит смех), что достаточно просто подставить в preg_replace массив из регулярок и массив из замен, чтобы всё работало так же, как работает при цикле с foreach и сложным массивом из массивов с регулярками и заменами...
Функция, оказывается, сама обходит всё значения в массиве, подставляя их в $pattern и (из другого массива) в $replacement.
Откровения уровня... короче, очень невысокого уровня.
>Также узнал (здесь звучит смех), что достаточно просто подставить в preg_replace массив из регулярок и массив из замен
Я тебе это еще месяц назад втолковывал.
Нет, я еще до ОПа это говорил.
САП ОП и все наблюдающие за этой проблемой >>624650
>>624126
>>624077
>>624066
>>624051
>>622641
>>622533
В итоге я нашел.
Действительно, как я и предполагал изначально дело заключается в том, что PHP использует устаревший виндовый API , который работает только с ASCII или ANSI. Соответственно невозможно было никаким образом записать имя в файловую систему с любым Юникод символом под Виндой. Решение я нагуглил на стэк оверфлоу, чел написал класс для работы с winAPI, похоже, что напрямую через COM(ОП поправь если не так).
https://gist.github.com/nicolas-grekas/2665437 - решение.
Просьба кстати ознакомиться с поделием этого человека к ОПу и всем профи.
У меня стремление всё усложнять же.
Наверное, пару недель назад, когда я возился с задачей на проверку и исправление ошибок и всех терроризировал ею?
Я просто как раз начал всё изучать числа 12-15 декабря, месяц назад, когда впервые открыл сайт ОПа.
Да, да, уже понел, спасибо. Тормознул.
Объясните, пожалуйста, аутисту, почему с русским Аргентина манит негра и вообще с чем-то русским работать не хочет, хоть и mb_internal_encoding('utf-8'); присутствует.
Заебал, шутничок.
Сделай что-то типа соцсети для универа.
Преподы регистрируются, студентота. Могут выбирать факультет, курс, выкладывать файлы (фотографии, аудио- и текстовые файлы в разных форматах), переписываться друг с другом, подписываться на новости друг друга, ставить лайки и дислайки.
Циклы №1 http://ideone.com/AS8oDo
Циклы №2 http://ideone.com/KILTAI или вот так http://ideone.com/XTIYdg
На каком-нибудь Moodle, наверное?
Ну, тут у анона была годная идея в одном из тредов: сервис по уборке города.
Суть токова: анон проходит по городу и видит кучку грязи. Он фотает сию кучу, заходит на сайт, постит фотку и указывает место расположения (либо оно автоматически берётся из его данных). Далее анон-дворник берёт заказ - выставляет какую-нибудь плашку "в работе", быстро убирает кучку в этом городе, фотографирует и загружает готовый вариант.
За это другие аноны скидываются ему на пивасик либо лайкают и т.п.
Что-то уровня стартапа, а может даже выше.
С каждой задачей немного яснеет в этой голове. Всё яснее и яснее, что правильно я пошёл 15 лет назад учиться на филологический факультет.
В этот раз регулярки подставляются в preg_replace не через foreach, а просто так.
При этом возникает вопрос: можно ли как-то избежать дублирования... - пока писал вопрос, понял, что можно сделать одну большую регулярку с | и разными знаками, сейчас исправлю.
>>626216
Даже в качестве диплома?
А зачем в дипломе использовать явно мертворожденную задачу? Куда потом ее развивать в магистерской?
Например, можно развивать вширь.
Сделать Бюро находок - для каждого города. Вещи, документы, животные.
Фотографировать разрушенные участки дорог, зданий, опасно висящие сосульки и т.п., чтобы можно было обратиться в ЖЭУ для устранения или коллективного обращения, сбора подписей.
Если бы такая система была у самих ЖЭУ, то уже сейчас, скорее всего, многие проблемы решались бы намного оперативнее.
Сейчас в группах по городам в соцсетях такое бывает - жалуются, сообщают о пропаже или находке вещей или животных.
А тут такой анончик со своим проектом.
Это что-то уровня Росямы, но только во всех сферах.
Да в том-то и дело, что уже есть Росяма, а пожертвования какие-то, это совсем другое, нищая страна, какое куда кто чего платить будет, лол.
>Фотографировать разрушенные участки дорог, зданий, опасно висящие сосульки и т.п., чтобы можно было обратиться в ЖЭУ для устранения или коллективного обращения, сбора подписей.
У нас даже фотографирование хуево стоящих машин не работает. Алсо, есть всякие активные-сердитые гражданины уже давно. От нонейм хуя никому такая система не нужна абсолютно. Алсоалсо, у дворников нет телефонов с камерами, лол. Все эти пропажи-находки итак есть, они не работают, никто туда не ходит, местечковые форумы все сплошняком мёртвые.
Вот какой момент ещё: есть такой сайт vsezverushki.ru, на нём только по одной Москве можно отдать в дар или продать любое животное.
Посещаемость в районе 2к человек, что не особо и много.
Внимание, вопрос: во сколько такой сайт оценивается на известной бирже сайтов Telderi.ru?
Внимание, ответ: в 3 миллиона рублей.
Доход от размещения объявления на главной странице, месячный доход - выше 120 тысяч рублей. И это только Москва, а есть ведь и другие города.
А у вас всё ещё нет идей для собственных проектов.
Один проект для всего.
Покажи аналог, кроме Росямы, там же только ямы, ну ты понял.
И чтобы на всю Россию по городам.
Чтобы не быть голословным про зверюшек: http://www.telderi.ru/ru/viewsite/198901
Человеку давали больше миллиона рублей за него, но он же не дурак, чтобы продавать за годовую окупаемость.
Я не пойму, чего тебе от нас то надо? Ты ждешь, что тебе кто-то предложит супер-уникальную и прибыльную идею?
Активный гражданин и т.п. - это не то, что я имею в виду. Там какие-то предложения по улучшению и тому подобное.
Нужен простой и удобный сайт для всякого такого - всего, что цепляет внимание сознательного гражданина.
>чем этот лучше?
Наверное, ничем. Про него знают разные крупные заводчики, питомники и прочие люди с деньгами (один какой-нибудь котёнок с родословной стоит от 15к рублей - самый дешёвый). Поэтому для них 200р за рекламу питомника или зверька в день на главной странице сайта - мелочи, окупающиеся с лихвой.
Но я тебе и говорю, что в соцсетях многое есть, что как раз даёт пищу для размышлений.
И да - в соцсетях всё смывает ещё получше, чем в /b, ну ты понял.
Сейчас есть новость, а через пять минут потонула среди кучи других, очень неудобно.
А тут разделение по толковым группам, всё на виду и понятно.
Я просто так это говорю, не пытаюсь что-то доказать. Просто мне кажется, что это вполне хорошая идея для приложения сил как для диплома, так и для последующей работы.
Но поступай как знаешь, конечно.
Ух ты, не совсем начинающий в треде?
Калькулятор Айфона считает верно, но там много повторов, ОП не одобрит.
$creditBalance = ( $creditBalance * $percent ) + $servicePayment - $monthlyPayment; - вот это повторяется, можно от этого избавиться.
В расчёте вклада анончика 10к под 10% недочёт - в первый год анону 16 лет, хотя он клал в 16, а прошёл уже год. Так, мелочь, остальное верно считает, однако дождись ОПа, он даёт делает отличные замечания.
Про прибыльность вообще речи не шло, если затраты небольшие, то даже на самоокупаемость похер. Но так да - какую-то оригинальную идею хочу, которую анону самому лень реализовывать, а я возьму в качестве дипломной работы.
>>626249
>Но я тебе и говорю, что в соцсетях многое есть, что как раз даёт пищу для размышлений.
Не очень понял. Вытащить из соц-сетей идею в качестве отдельного проекта? Троллейбус из хлеба какой-то.
>>626251
Спасибо, подумаю.
>Вытащить из соц-сетей идею в качестве отдельного проекта?
Соцсеть - это показатель интересов, проблем и желаний людей же. У людей проблемы - часто теряют вещи, видят разор или неустройство, хотят как-то повлиять на это, попивая чай у себя на кухне.
В соцсетях, как и на имиджборждах, можно орать, сколько душе угодно - почти никто не услышит, пока журналисты не сделают репортаж, например.
А тут сайт, который собирает всё в себя, каким-то образом формирует инициативные группы либо привлекает непосредственных исполнителей за какие-либо профиты (не обязательно, денежные). Например, меня вот лично сейчас раздражает, что дорожка у дома с обратной стороны не расчищена от снега. Идти ругаться в ЖЭУ мне не хочется, напишу-ка я на сайте, что вот такое есть, готов заплатить 100р анону-школьнику, если уберёт. На счету резервируются деньги, кто-нибудь выполняет, ну ты понял.
Это можно в любую сферу растянуть же.
Сломалась дверь в квартире, нужно поклеить обои, вынести строительный мусор и тому подобное - различные услуги - создаёшь заявку, находятся исполнители.
Привязка к региону, резервирование денег на самом сайте, чтобы исполнитель был уверен.
Короче, фриланс, но связанный с реальной работой или услугами.
Я не в курсе, есть ли именно такое на Авито? Чтобы не искать заявку, а создавать?
Так или иначе - идея имеет право на жизнь, как считаешь?
> А еще я подумал, если у меня нужно работать с одной моделью почему бы и не использовать только один контроллер
Ты случайно не думаешь ли что число моделей = числу контроллеров? Если так то ты плохо понял зачем они нужны. Контроллер = раздел сайта или страница, модель = сущность в БД. между ними не обязательно должно быть соотношение 1 к 1.
Далее: http://pastebin.ru/vKfLkBPw
Какая от него польза? Обычно верстку изучать не хотят из-за лени, и вряд ли это будет плюсом на собеседовании.
>>623227
Что сложного в том чтобы сверстать что-то? Не за бесплатно же.
>>623239
TDG это просто класс где собраны методы работы с таблицей в БД. Он не обязан выглядеть как в зенде. У меня в уроке про паттерны работы с БД есть более простой пример, без всяких initialize.
> Смотри вот есть класс TableDataGateway, в нем есть метод initialize. Я правильно понимаю, что прямо в этом классе происходит подключение к бд?
Нет, это нелогично. Логичнее передать готовый объект PDO в конструктор. В зенде сделано по-другому - там базовый класс получает объект для работы с БД через какой-то статический метод. Но тебе делать так не стоит. Вот урок по теме: https://gist.github.com/codedokode/e1d31a31b37d5f635057
> Почему не подключаться к бд сразу в конструкторе?
Потому что это не задача класса TDG, подключаться к базе.
> Итак, я так понимаю, что в TableDataGateway я должен реализовать примитивные методы update, insert, where, select, которые будут применимы для всех моделей, а уже работая с каждой моделью, она должна будет наследовать этот класс и использовать эти методы?
Нет не обязана. Наследование впрочем имеет смысл, так как эти классы однотипные и логично им иметь общего предка. Но делать методы типа insert ты не обязан.
> Вообщем объясни мне, ОП, как это все работает? Я хочу применить это в студентах и понять как оно устроено.
Тогда тебе придется самому читать код и документацию. И если что-то непонятно, задавать конкретные вопросы.
ServiceLocator/Manager это классы для создания объектов и передачи им нужных зависимостей, они мельком упомянуты в моем уроке про Dependency Injection.
> Создаю класс TableDataGateway, там создаю все эти "примитивные методы".
Это не обязательно.
> В самой модели Student в конструкторе будет создаваться объект класса UserDataGateway с аргументом "students" (имя таблицы).
Не вижу логики. Student это объект представляющий информацию об одном студенте. зачем в нем должно быть что-то внутри для работы с базой данных? (это вопрос к тебе) Студент вполне может существовать и без нее. И второй вопрос, а если у тебя 10 объектов-студентов, ты внутри них создашь 10 объектов TDG?
Ты пытаешься смешать все в кучу, это не ООП подход. В ООП каждый класс занимается своим делом. Класс Student отдельно, классы TDG отдельно.
> Там будут использоваться такие же методы add, update, edit и т.д., которые будут вызывать аналогичные методы класса UserDataGateway
Это нелогично, зачем каждый метод дублировать в 2 классах?
> Контроллер опять же будет иметь методы action_add, action_edit, в каждом из которых будет создавать экземпляр класса Student и вызывать аналогичный метод модели.
Методы контроллера не обязаны соответствовать методам модели.
> Но пугает меня то, что во всех трех классах будут одинаковые методы, которые по цепочке будут вызывать другу друга до обращения в базу. Правильно ли это?
Неправильно. У тебя культ карго - ты пытаешься сделать так же как сделано в других фреймворках, при этом не понимая почему там сделано именно так. Надо разобраться.
Ну и урок по паттернам работы с БД, может ты не видел ссылку: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
>>623260
В общем неплохо. ENUM надо сделать латинницей. Учти также что при такой схеме нельзя никогда удалять товары если они связаны хоть с одним заказом (вроде у тебя так и сделано), значит надо сделать в них флаг показывающий виден товар на сайте или нет.
cEtegories - опечатка.
>>623281
Не, я чаще видел что таблицы во множественном.
Какая от него польза? Обычно верстку изучать не хотят из-за лени, и вряд ли это будет плюсом на собеседовании.
>>623227
Что сложного в том чтобы сверстать что-то? Не за бесплатно же.
>>623239
TDG это просто класс где собраны методы работы с таблицей в БД. Он не обязан выглядеть как в зенде. У меня в уроке про паттерны работы с БД есть более простой пример, без всяких initialize.
> Смотри вот есть класс TableDataGateway, в нем есть метод initialize. Я правильно понимаю, что прямо в этом классе происходит подключение к бд?
Нет, это нелогично. Логичнее передать готовый объект PDO в конструктор. В зенде сделано по-другому - там базовый класс получает объект для работы с БД через какой-то статический метод. Но тебе делать так не стоит. Вот урок по теме: https://gist.github.com/codedokode/e1d31a31b37d5f635057
> Почему не подключаться к бд сразу в конструкторе?
Потому что это не задача класса TDG, подключаться к базе.
> Итак, я так понимаю, что в TableDataGateway я должен реализовать примитивные методы update, insert, where, select, которые будут применимы для всех моделей, а уже работая с каждой моделью, она должна будет наследовать этот класс и использовать эти методы?
Нет не обязана. Наследование впрочем имеет смысл, так как эти классы однотипные и логично им иметь общего предка. Но делать методы типа insert ты не обязан.
> Вообщем объясни мне, ОП, как это все работает? Я хочу применить это в студентах и понять как оно устроено.
Тогда тебе придется самому читать код и документацию. И если что-то непонятно, задавать конкретные вопросы.
ServiceLocator/Manager это классы для создания объектов и передачи им нужных зависимостей, они мельком упомянуты в моем уроке про Dependency Injection.
> Создаю класс TableDataGateway, там создаю все эти "примитивные методы".
Это не обязательно.
> В самой модели Student в конструкторе будет создаваться объект класса UserDataGateway с аргументом "students" (имя таблицы).
Не вижу логики. Student это объект представляющий информацию об одном студенте. зачем в нем должно быть что-то внутри для работы с базой данных? (это вопрос к тебе) Студент вполне может существовать и без нее. И второй вопрос, а если у тебя 10 объектов-студентов, ты внутри них создашь 10 объектов TDG?
Ты пытаешься смешать все в кучу, это не ООП подход. В ООП каждый класс занимается своим делом. Класс Student отдельно, классы TDG отдельно.
> Там будут использоваться такие же методы add, update, edit и т.д., которые будут вызывать аналогичные методы класса UserDataGateway
Это нелогично, зачем каждый метод дублировать в 2 классах?
> Контроллер опять же будет иметь методы action_add, action_edit, в каждом из которых будет создавать экземпляр класса Student и вызывать аналогичный метод модели.
Методы контроллера не обязаны соответствовать методам модели.
> Но пугает меня то, что во всех трех классах будут одинаковые методы, которые по цепочке будут вызывать другу друга до обращения в базу. Правильно ли это?
Неправильно. У тебя культ карго - ты пытаешься сделать так же как сделано в других фреймворках, при этом не понимая почему там сделано именно так. Надо разобраться.
Ну и урок по паттернам работы с БД, может ты не видел ссылку: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
>>623260
В общем неплохо. ENUM надо сделать латинницей. Учти также что при такой схеме нельзя никогда удалять товары если они связаны хоть с одним заказом (вроде у тебя так и сделано), значит надо сделать в них флаг показывающий виден товар на сайте или нет.
cEtegories - опечатка.
>>623281
Не, я чаще видел что таблицы во множественном.
> Для каждой из них я должен создать класс-модель этой сущности, свойства которой будут полями, которые есть в БД для этой таблицы, верно?
Да
> И еще должны быть классы, которые уже непосредственно работают с БД, типа select, update и т.д. причем опять же для каждого объекта/сущности свой такой класс в котором должны быть описаны все возможны методы для взаимодействия с БД?
Да, все методы которые тебе нужны. Те что не нужны можно не делать.
>>623401
Ты пишешь глупости, анон пока только изучает работу с Бд и хочет разобраться как это вообще делается. А потом и за доктрину возьмется. И кстати чем хорош пропел если есть доктрина? И чем твой совет поможет если анон хочет разобраться в паттернах работы с БД а не получить готовое решение?
> $app->error(function (\Exception $e) use ($app) {
> $app->log->info($e);
А почему уровень логгирования такой низкий (info)? Типа неважная информация? И я не уверен что надо использовать логгер Слима, не лучше ли писать в стандартный лог ошибок PHP?
> Про html5 валидацию слышу второй раз в жизни. Ты имеешь ввиду эти атрибуты типа required и pattern?
Да
> Во-первых, это поддерживается не во всех браузерах,
Да, но это ведь не мешает пользователю работать с формой? Просто об ошибке он узнает позже, при отправке формы.
Ну и ты в любом случае должен уметь ими пользоваться, так что давай-ка изучай пока есть время.
> мне просто не нравится внешний вид этих попапов
Да, поменять его (пока) нельзя: http://stackoverflow.com/questions/5328883/how-do-i-style-the-html5-form-validation-error-messages-with-css/6072950#6072950
Вот тут есть статья по переделке внешнего вида сообщений (сделать их самому), можешь попробовать сделать, но хорошо бы сделать это как-то универсально, чтобы можно было подключить к любому сайту: http://developer.telerik.com/featured/building-html5-form-validation-bubble-replacements/
> Helper\Token::init
Имя метода не говорит о том что он делает
На формы (включая логаут) надо поставить защиту от CSRF. У меня есть урок про нее.
> $isAjax =
> $author_id
Стиль наименования надо выдерживать одинаковый
> ($app->request->get('ajax') !== null) ? true : false;
!!$app->request->get('ajax')
> ajaxResponse($app->response, $uploadForm->getFile()->id);
Глобальные функции, нехорошо-то как. можно сделать это статическим или обычнм методом где-нибудь? Можешь кстати посмотреть, нельзя ли расширить слимовский $app->response и всунуть туда свой класс с поддержкой аякса?
https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L55
> if ($isAjax) {
> ajaxResponse($app->response, null, $uploadForm->errorMessage);
Я думаю это надо перенести ниже, туда где идет вывод шаблона $app->render('upload_form.twig',...
> $uploadForm = new Form\UploadForm($app->request, $_FILES, $author_id);
Нужно ли форме ид автора? Может тогда лучше не id а полноценный обьъект передавать?
> $fileUploadService->upload($uploadForm)
Вот надо ли завязывать загрузку файла на форму? Нельзя ли отвязать эти классы, то есть сделать чтобы сервис загрузки ничего не знал о форме? И чтобы например можно было загрузить просто файл с диска, не из формы? Или это усложнит все?
> $loginForm = new Form\LoginForm($app->request);
> if ($app->loginManager->validateLoginForm($loginForm)) {
Опять же, нельзя ли сделать чтобы LoginManager ничего не знал о форме? И вообще ничего не знал ни про HTML, ни про HTTP? Мне кажется это лишние знания. Нехорошо, привязывать внутренний сервис к интерфейсу пользователя. Так мы в LoginManager половину приложения затащим. Он должен только проверять данные ему имя и пароль, а про формы он знать ничего не должен. Пусть уж лучше форма знает о нем, если без этого никак.
Ну и подумай сам: форм логина и способов входа в теории может быть несколько. Ты будешь для каждой методы в LoginManager добавлять?
https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L119
> Helper\Pager( $page, $app->fileMapper->getFileCount(), 15 );
Магическое число 15
> https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L137
> $pageViewService = new Helper\PageViewService(
Сервисы лучше сделать через синглтоны слима наверно.
https://github.com/nsdvw/file-sharing/blob/master/app/Form/UploadForm.php#L11
Хранить текст в константах не очень удобно, например не получится сделать локализацию (перевод на другой язык).
> https://github.com/nsdvw/file-sharing/blob/master/app/Form/UploadForm.php#L66
> private function setFile()
Вот это мне кажется надо бы перенести в файловый сервис, создание объекта на основе файла на диске. Это ведь может не только в форме загрузки пригодиться. а например если ты хочещь с диска загрузить файл.
https://github.com/nsdvw/file-sharing/blob/master/app/Helper/FileUploadService.php#L16
> $this->viewHelper = new ViewHelper;
Логично бы тоже передавать через конструктор. А то завтра ты захочешь например добавить аргументы в конструктор ViewHelper.
https://github.com/nsdvw/file-sharing/blob/master/app/Form/AbstractFormWithCaptcha.php
Странный класс. Нельзя сделать капчу обычным полем, а то так мы дойдем до FormwithTextarea, FormWithHiddenField и так далее.
https://github.com/nsdvw/file-sharing/blob/master/app/Form/AbstractFormWithCaptcha.php#L15
> if ($this->$field != $_SESSION['captcha']) {
Неправильно. Сессия общая для всех вкладок браузера. Что если открыть несколько форм с капчами? Что если на странице несколько форм с капчами?
> class AbstractMapper implements TransactionableInterface
Вот это интересный код, но я не уверен что правильно добавлять транзакции во все мапперы. Создается впечатление что это какие-то независимые транзакции, и непонятно в каком классе надо начинать транзакцию если ты хочешь что-то сделать в нескольких мапперах.
Транзакции лучше сделать на уровне PDO или аналогичного класса. И есть еще интересный способ их сделать через анонимную функцию: http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/transactions.html
Смотри функцию Connection#transactional($func). выгода такая: 1) не забудешь сделать коммит 2) при исключении транзакция откатится.
>>623458
Формально ActiveRecord и Datamapper это альтернативные подходы реализации ORM.
> И то и то - частный случай DBAL.
Нет. У нас DBAL это низкоуровневый объект вроде PDO.
> $app->error(function (\Exception $e) use ($app) {
> $app->log->info($e);
А почему уровень логгирования такой низкий (info)? Типа неважная информация? И я не уверен что надо использовать логгер Слима, не лучше ли писать в стандартный лог ошибок PHP?
> Про html5 валидацию слышу второй раз в жизни. Ты имеешь ввиду эти атрибуты типа required и pattern?
Да
> Во-первых, это поддерживается не во всех браузерах,
Да, но это ведь не мешает пользователю работать с формой? Просто об ошибке он узнает позже, при отправке формы.
Ну и ты в любом случае должен уметь ими пользоваться, так что давай-ка изучай пока есть время.
> мне просто не нравится внешний вид этих попапов
Да, поменять его (пока) нельзя: http://stackoverflow.com/questions/5328883/how-do-i-style-the-html5-form-validation-error-messages-with-css/6072950#6072950
Вот тут есть статья по переделке внешнего вида сообщений (сделать их самому), можешь попробовать сделать, но хорошо бы сделать это как-то универсально, чтобы можно было подключить к любому сайту: http://developer.telerik.com/featured/building-html5-form-validation-bubble-replacements/
> Helper\Token::init
Имя метода не говорит о том что он делает
На формы (включая логаут) надо поставить защиту от CSRF. У меня есть урок про нее.
> $isAjax =
> $author_id
Стиль наименования надо выдерживать одинаковый
> ($app->request->get('ajax') !== null) ? true : false;
!!$app->request->get('ajax')
> ajaxResponse($app->response, $uploadForm->getFile()->id);
Глобальные функции, нехорошо-то как. можно сделать это статическим или обычнм методом где-нибудь? Можешь кстати посмотреть, нельзя ли расширить слимовский $app->response и всунуть туда свой класс с поддержкой аякса?
https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L55
> if ($isAjax) {
> ajaxResponse($app->response, null, $uploadForm->errorMessage);
Я думаю это надо перенести ниже, туда где идет вывод шаблона $app->render('upload_form.twig',...
> $uploadForm = new Form\UploadForm($app->request, $_FILES, $author_id);
Нужно ли форме ид автора? Может тогда лучше не id а полноценный обьъект передавать?
> $fileUploadService->upload($uploadForm)
Вот надо ли завязывать загрузку файла на форму? Нельзя ли отвязать эти классы, то есть сделать чтобы сервис загрузки ничего не знал о форме? И чтобы например можно было загрузить просто файл с диска, не из формы? Или это усложнит все?
> $loginForm = new Form\LoginForm($app->request);
> if ($app->loginManager->validateLoginForm($loginForm)) {
Опять же, нельзя ли сделать чтобы LoginManager ничего не знал о форме? И вообще ничего не знал ни про HTML, ни про HTTP? Мне кажется это лишние знания. Нехорошо, привязывать внутренний сервис к интерфейсу пользователя. Так мы в LoginManager половину приложения затащим. Он должен только проверять данные ему имя и пароль, а про формы он знать ничего не должен. Пусть уж лучше форма знает о нем, если без этого никак.
Ну и подумай сам: форм логина и способов входа в теории может быть несколько. Ты будешь для каждой методы в LoginManager добавлять?
https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L119
> Helper\Pager( $page, $app->fileMapper->getFileCount(), 15 );
Магическое число 15
> https://github.com/nsdvw/file-sharing/blob/master/web/index.php#L137
> $pageViewService = new Helper\PageViewService(
Сервисы лучше сделать через синглтоны слима наверно.
https://github.com/nsdvw/file-sharing/blob/master/app/Form/UploadForm.php#L11
Хранить текст в константах не очень удобно, например не получится сделать локализацию (перевод на другой язык).
> https://github.com/nsdvw/file-sharing/blob/master/app/Form/UploadForm.php#L66
> private function setFile()
Вот это мне кажется надо бы перенести в файловый сервис, создание объекта на основе файла на диске. Это ведь может не только в форме загрузки пригодиться. а например если ты хочещь с диска загрузить файл.
https://github.com/nsdvw/file-sharing/blob/master/app/Helper/FileUploadService.php#L16
> $this->viewHelper = new ViewHelper;
Логично бы тоже передавать через конструктор. А то завтра ты захочешь например добавить аргументы в конструктор ViewHelper.
https://github.com/nsdvw/file-sharing/blob/master/app/Form/AbstractFormWithCaptcha.php
Странный класс. Нельзя сделать капчу обычным полем, а то так мы дойдем до FormwithTextarea, FormWithHiddenField и так далее.
https://github.com/nsdvw/file-sharing/blob/master/app/Form/AbstractFormWithCaptcha.php#L15
> if ($this->$field != $_SESSION['captcha']) {
Неправильно. Сессия общая для всех вкладок браузера. Что если открыть несколько форм с капчами? Что если на странице несколько форм с капчами?
> class AbstractMapper implements TransactionableInterface
Вот это интересный код, но я не уверен что правильно добавлять транзакции во все мапперы. Создается впечатление что это какие-то независимые транзакции, и непонятно в каком классе надо начинать транзакцию если ты хочешь что-то сделать в нескольких мапперах.
Транзакции лучше сделать на уровне PDO или аналогичного класса. И есть еще интересный способ их сделать через анонимную функцию: http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/transactions.html
Смотри функцию Connection#transactional($func). выгода такая: 1) не забудешь сделать коммит 2) при исключении транзакция откатится.
>>623458
Формально ActiveRecord и Datamapper это альтернативные подходы реализации ORM.
> И то и то - частный случай DBAL.
Нет. У нас DBAL это низкоуровневый объект вроде PDO.
Раз ты не знаешь уровни логгирования то почитай PSR http://www.php-fig.org/psr/psr-3/
Названия уровней придумали не они, эти уровни придуманы много лет назад, я даже не знаю откуда они взялись.
1) http://ideone.com/ivV3tG - про клавишу "Shift";
2) http://ideone.com/gXSbfE - про Йоду. Тут я не сохранял знаки препинания внутри предложений, решил, что так подразумевалось (глянул в примере, что их нет). А так вроде бы получилось всё.
Спасибо!
Я не ОП, но могу сказать, что из-за обилия комментариев читать просто невозможно. Я пишу комменты обычно сбоку, а не между строк, и вообще рекомендуют переменные и функции называть так, чтобы они сами за себя говорили, а комменты - если происходит особая, уличная магия какая-нибудь, неясная без подсказки.
вообще я не программист, можно меня не слушать
Ну и дам наводку: прогляди ещё раз урок про регекспы, там есть про разбиение предложений.
Блджад, разумничался, это ж не та задача...
>Я не ОП, но могу сказать, что из-за обилия комментариев читать просто невозможно.
Кому как. Я это делаю как раз для облегчения понимания кода. Я писал комменты сбоку, но ОП сказал, что лучше сверху, когда со слешами и звёздочками, я сделал так. Можно слешами сбоку, так удобнее смотреть на сам код. Наверное, лучше так буду делать всё-таки, действительно.
>вообще рекомендуют переменные и функции называть так, чтобы они сами за себя говорили
Стараюсь так и называть.
>комменты - если происходит особая, уличная магия какая-нибудь, неясная без подсказки
У меня комменты - это разбитый на части алгоритм написания скрипта. Я обычно сначала пишу алгоритм, а потом пишу скрипт.
Я тоже не программист, поэтому всё пока коряво получается.
Спасибо, что посмотрел.
>>626334
Какое хорошее решение.
Всякие preg_replace_callback применяешь прямо вот так впервые? Так-то несложно вроде, но я бы вообще не додумался до такого.
Я пока оперирую только разложением до простейших шагов: отрезать часть строки, отрезать начальные буквы, поменять регистр у начальных букв, приклеить к предложениям и т.п. Что-то изящное пока неподвластно.
>>626340
Там у меня вроде всё нормально с этим.
>ОП сказал, что лучше сверху
Ну да, наверное и правда кому как. И алгоритм пока в голове не держится сам, наверное, лучше оформить письменно.
>прямо вот так впервые
Ну нет, про preg_replace_callback() ОП подсказал, когда я граммарнаци делал (вообще долго с ней ковырялся). Теперь если что-то неочевидное надо сделать, ею пользуюсь, не знаю, хорошо это или нет.
Вообще признаюсь, опыт у меня кое-какой есть, потому и быстрее всё выходит.
Ок, я просто сяду вот тут и подожду ОПа.
Не должно быть такого.
Форма авторизации должна обрабатываться действием авторизации <form action="/login" method="post">
При успешной валидации редирект обратно на ту страницу, с которой был запрос. Если форма не прошла валидацию, подставить сообщение об ошибке и введенные пользователем данные в поля на странице авторизации.
https://github.com/codedokode/pasta/blob/master/forms.md
Спасибо, почему-то не додумался, что в action="" можно не только путь к конкретной странице указывать
SELECT name, comment, date, INET_NTOA(ip_address) FROM comments
Почему твиг проходится по массиву и не вытаскивает айпишник? все вытаскивает, а айпи нет. ip_address в массиве есть, вардампом проверено. Не могу даже пхп код в шаблонизатор засунуть.
{% for item in data %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.comment }}</td>
<td>{{ item.date }}</td>
<td>{{ ite.ip_address }}</td>
</tr>
{% endfor %}
Сделай экстремистский сайт, где вскрываются многомиллионные кражи из бюджета, попилы, дебильные указы чинушей, приводящие к разорению предприятий и страны, типа южного потока, заброшенные НЗП, военные преступления пидорах в чечне и украине. Посадят конечно, но зато какой проект.
Две спасибушки тебе.
Твое время еще не пришло, анон. Жди смиренно.
http://pastebin.com/kyyA8VQ9
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: :x' in /usr/share/nginx/html/student-list/app/Model/Model_StudentDataGateway.php:24 Stack trace: #0 /usr/share/nginx/html/student-list/app/Model/Model_StudentDataGateway.php(24): PDOStatement->bindValue(':x', 'Testvar', 2) #1 /usr/share/nginx/html/student-list/app/Controller/Controller_Form.php(34): Model_StudentDataGateway->add_student(Object(Model_Student)) #2 /usr/share/nginx/html/student-list/form.php(13): Controller_Form->process_post_request(Array) #3 {main} thrown in /usr/share/nginx/html/student-list/app/Model/Model_StudentDataGateway.php on line 24
Блять, не заметил. Спасибо.
Ну что, опунь, я уже какое-то время учусь по твоим урокам, в кодинг уже какое-то время могу, но не в РНР, так что по мелочи не хотел тебя дёргать, но вот настала пора поинтересоваться, насколько грамотно с точки зрения эстетики, так сказать, написан код: http://ideone.com/n9iSCv
То есть, работает он отлично, но вот насколько принято писать вот так, не знаю.
Банк 1: после месячного взноса она уменьшается до -971.61787934484.
Зачем ты банку переплачиваешь? Остался должен 10 рублей. Плати 10 рублей, а не тысячу.
http://ideone.com/Yjs5K9
Вопрос в том, стоит ли переделать её с использованием switch'а? Или пускай так и остается?
Охуительное решение, но оно мне не подходит. Что делать-то?
ты не правильно понял. Они не обязательны для существования конструкции в целом. Т.е. if достаточно. Но для компактной записи и вообще для торжества здравого смысла их надо использовать. Ну и плюс в задачах посложней без этого никуда
Про задачи посложнее я догадывался, а так - спасибо за разжевывание и критику, пойду переделаю.
Там у тебя в некоторых местах просто отнимается сумма, которую анон платит в месяц, не прибавляются проценты почему-то. Например, осталось выплатить 41000, а в другой месяц осталось выплатить 36000, такого типа.
Хотя в функции первой есть умножение на проценты, вот это всё.
Подход вообще не верен: там нужна переменная для общих выплат, а её не заметил у тебя. В минус не должно уходить: если после умножения на проценты и прибавления платы за обслуживание счёта остаётся меньше месячной выплаты - необходимо просто выплатить оставшуюся часть.
Также для обхода массива нужно использовать foreach, а не for, ОП пишет об этом на странице "Повторим?".
Бамп вопросу. Просто нахуярить <?php ?> в html-код не выйдет, потому что у меня цикл под них.
Код вбрось.
Нужно использование ssl. ssl://imap.yandex.ru не работает.
Интересует именно socket_extension.
fsockopen,stream_функции я знаю, но интересует именно то о чем выше писал.
Цикл в хтмл тоже можно красиво запихнуть, типа
<?php foreach($arr as $key => $value):?>
htmlhtmlhtmlhtml
htmlhtmlhtmlhtml
<?php endforeach;?>
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, "imap.yandex.ru", 993)
?
Например если сделать много кликов по элементу, то сработают все один за другим.
https://jsfiddle.net/3qz5n02q/
>PHP Notice: Undefined offset: 1 in /home/U8hptw/prog.php on line 12
>PHP Notice: Undefined offset: 1 in /home/U8hptw/prog.php on line 13
Сейчас не соображу, в чём там дело. Тешу себя мыслью, что соображу завтра.
Вроде бы всё у меня там работает и выглядит простым, как табуретка.
Гибкости не хватает мне, в следующий раз попробую совладать с call_back функцией, что ли, позавидовал простому и краткому решению братишки выше.
>>627266
Так и не разобрался, почему там вылезала ошибка. Наверное, передавать из одной функции в другую массив и там из неё сразу доставать значение ($array[n]) не считается правильным.
Также ОП говорит, что вообще неправильно массив раскладывать через for.
Сделал разложение массивов в обеих функциях через foreach - всё теперь без ошибки.
>>627357
Не политоты ради. Просто столкнулся с тем, что эту поделку в Photoshop'е считают реальностью - на полном серьёзе.
>>627384
Оригинал не находится в поиске по картинкам, когда ищешь по какой-нибудь фразе, вылезают только различные варианты подделки.
уже рахобрался. Надо либо по \r\n (хз почему), либо PHP_EOL
>Пайп (вертикальная черта) позволяет перенаправить выход одной программы на вход другой. Программа ls выводит список файлов в каталоге. Программа head -10 читает строки с клавиатуры и выводит только первые 10 из них. Вот, как можно вывести имена первых 10 файлов:
>
>ls | head -10
>Пайп (вертикальная черта) позволяет перенаправить выход одной программы на вход другой.
А что за Пайп? Может кто-нибудь объяснить на примере как это работает? Я что смогу брать данные, например, из браузера и делать с ними что захочу в другой программе? Как это работает? Я не понимаю.
А причем тут ls и head?
Все понял.
А почему синтаксис такой странный? Почему не 2> & 1> file.txt или 2&1 > file.txt? Так же понятней!
Аа, увидел и испугался этих задачек, аж ладошки вспотели.
А где предыдущие, почему не по порядку идёшь?
Я, например, даже когда научусь всему буду продолжать иногда заходить в клуб любителей php и помогать анонам, если буду знать как. Подозреваю, что здесь много таких же как я.
>Я, например, даже когда научусь
А как ты поймешь, что научился? Когда наступает этот сокровенный момент? Тебе приходит письмо из хогвартса или что?
Бывает открываешь код анона и становится смешно, и ты сразу понимаешь как правильно сделать. Вот это уже показатель того, что ты можешь поправить анона и дать ему совет.
Это же такие перспективы! Такие как __мгновенная__ передача информации на n ≤ ∞
Задачу на студентов, а ты?
Пока ОПа нету, сижу читаю про линукс и верстку - настроение просто отличное от того, что я это понимаю и занимаюсь этим. Программирование это жизнь, это сила, это победа человеческого разума над законами природы!
Ну я кстати как раз на линупсах сижу, и работаю по большей части версталой.
А я уже подсматривал в твой гитхаб
>$router->run();
Мне тоже так предстоит делать или это какой-то особенный подход?
https://github.com/someApprentice/Students
У меня есть роутер, у тебя нет. В этом задании он не обязателен, просто мне интересно еще и роутер пилить. И все приложение у меня с него как раз и начинается, я так понял это паттерн FrontController. Хотя не уверен. Жду ответа ОПа и дизайн пилю пока для списка и формы.
Я в общем-то уже знаю как по-быстрому сделать эту задачу. Но я постоянно ковыряюсь, потому что хочу сделать не быстро, а правильно.
Кстати я гуглил разные mvc приложения на php. Часто делается так, $app->run(); и поехало. Ну я так сразу к роутеру обратился.
>Я в общем-то уже знаю как по-быстрому сделать эту задачу. Но я постоянно ковыряюсь, потому что хочу сделать не быстро, а правильно.
Я тоже уже примерно представляю как она делается, думаю сделаю быстро - мне главное понять принцип работы а дальше нужно просто выразить это в коде.
да я по порядку иду, сделал почти все и в треде выкладывал, пропустил 1 только, вроде, т.к. лень было
У тебя есть LoginController.php, то есть ты будешь делать форму входа? По заданию вроде просто после регистрации сохранять в куках юзера.
>У тебя есть LoginController.php, то есть ты будешь делать форму входа? По заданию вроде просто после регистрации сохранять в куках юзера.
Почему бы и нет?
Ну в принципе да, может тоже запилить. Еще я не увидел у тебя полей sex, gender, firstname, surname и т.д. Их не будет?
Будут, сейчас ОП проверит меня и буду допиливать.
Я так и делаю сам со своими месячными познаниями: разбираю код новичков. Те задачи, которые сам уже решил.
Что именно непонятно?
Качаешь пак с файлами, запускаешь на локалке или хостинге.
Пока не дошёл до БД и прочего - это сложно.
А он знает тебя?
я пока только задачи для перехода на второй лвл доделываю. Да вообще непонятно, что за файлы, как качать и как запускать. Пишу на phpstorm
Скоро дойдёшь, значит, и сам.
Надо локальный сервер установить, базы данных, всё это запустить, архив сайта с Гитхаба распаковать, запустить index.php, создать соединение с БД.
Либо сразу установить Денвер, там всё необходимое уже есть.
А если расшарить файлы, создать ветку, то по-другому.
Да просто интересно, какой люд тут обитает со мной вместе и бьётся над задачками
А мне всегда интересно, изучал ли человек программирование прежде, когда припекает от лёгкости решения задач у многих. Сам я бьюсь над задачами уровня клавиши Shift или речи Йоды по нескольку часов.
Благодаря постоянному чтению учебника ОПа, сразу по стилю решения задачи многое становится понятно об общих познаниях человека.
Жаль, что некоторые задорно проходят первые задачки, а потом пропадают.
Куда делся, спрашивается, Олег, где Onyx, которые вроде отлично шли с самого начала.
>Олег, где Onyx
Потише, братишка, в этой ситуации, ты на АИБ сидишь или в убтном чятике? Какие Олег, какой Оникс? Оглянись вокруг, мы вдвоём. Ты да я
В phpstorm работает идеально, но ideone отказывается показывать правильно. Не знаю в чём причина.
попробуй в шторме. работает же!!
http://ideone.com/oZMTZp
дело в том, что я старый и знание, что я не один такой тут меня греет. вот и всё
Тебя будет греть сильнее денюжки которые ты будешь зарабатывать на программировании
т.е. много, лол, проебался
Зандстра из шапки и все. Книг по php нормальных нет. Смирись.
Мне твенти сикс.
Вэт ваз ми, раз уж мы по-английски.
http://ideone.com/ahVN35
2>&1 значит перенаправить данные, из потока №2 (поток ошибок stderr) в поток №1 (поток вывода stdout)
> значит перенаправить stdout в файл
Таким образом и stderr и stdout перенаправлены в один и тот же файл.
Погугли по этим словам.
> 2> & 1> file.txt
и что это должно значить?
> 2&1 > file.txt
и это?
Вообще, синтаксис такой по историческим причинам, написаны миллионы скриптов и никто их уже не переделает.
> explode("\r\n", $text);
Лучше разбивать по символу перевода строки \n (Enter как раз вставляет в текст \n или \r\n в зависимости от настроек редактора и способа перевода строк)
На ideone скорее всего перевод строки вставляется как просто \n а не \r\n отсюда и баги.
Скачивание phpstorm (что я не могу сделать, это надо много времени) вряд ли поможет.
Какое отношение научная фантастика имеет к PHP? Сука, козёл.
>ля поиска по всем колонкам можно применить оператор LIKE к соединенным через пробел значениям столбцов.
Что это значит? Как их соединить? Или может забить хуй и сделать поиск через OR?
Попробовал сделать так
SELECT * FROM student_list JOIN(SELECT id, name || surname concatenated FROM student_list) T ON T.Id = student_list.id WHERE t.concatenated LIKE :pattern_bind ORDER BY student_list.id ASC LIMIT 15 OFFSET :offset_bind
ищет только по первому параметру после id (в моем случае это name)
Бро, задача решена неверно.
1. В итоге переменная $paymentTotal должна быть 61270 со многими копейками.
2. Функция intval не нужна, без неё можно обойтись, лучше посчитать со всеми копейками.
3. $creditBalance = ( $creditBalance * $percent ) + $servicePayment - $monthlyPayment; - повторяется в разных местах, а это значит, что может быть вынесено за пределы if с else.
4. Всегда первым делом надо к остатку прибавлять процент и 1000 за обслуживание кредита, после этого проверять, меньше или больше сумма $monthlyPayment.
Можно создать поле с ключами, куда заносятся через пробел значения остальных полей, например "Ваня Ерохин А56 Москва 1990 муж", и делать поиск по ней. Это как вариант, ОП может не одобрить. А есть ещё составные индексы.
А в контакте не с айпи, там аккаунт может один раз лайкнуть.
Я нагуглил, полнотекстовый поиск называется. Используется примерно так match (index) against (search_string)
Index - полнотекстовый индекс
А если индексов несколько? Там же вся суть в том, чтобы искать во всей таблице.
Наверное, $_SERVER['REMOTE_ADDR'], при этом сохранять инфу об айпи и лайкнувшем, а дальше условия, чтобы не повторялся или айпи, или сам лайкнувший, если он залогинен.
А в нашем случае зачем несколько? У нас один поиск по все полям таблицы. Лучше ОПа дождаться.
Кстати а если CONCAT() использовать?
Тоже заметил. Значит, у тех, кто дойдёт до конца, всё меньше и меньше конкуренции.
спасибо. добра
К этому времени - имею в виду к более сложным задачам
С какими еще джоинами? У тебя там больше одной таблицы?
Каждому лайку таблицу с айпи лайкнувших что ли создавать и по ней проверять есть ли лайк у айпи к такойто записи?
Я долго размышлял над этой проблемой и решил, что понадобится как минимум три таблицы. Первая это сами публикации или что там у тебя лайкают, второе - таблица айпишников и третье - таблица лайков.
Случайно процитировал.
Я сказал минимум 3, можно и больше, а вот меньшим количеством таблиц не обойтись.
Квантовые компьютеры не позволяют передавать информацию быстрее других средств связи. Более того, пока они больше существуют в реальности чем в теории.
Для тех кто не знает - там примерно такая идея: вместо обычных битов которые принимают значение либо 0 либо 1, мы используем кубиты которые могут быть одновременно в 2 состояниях.Например 8 обычных битов могут быть в одной из 256 комбинаций, а вот 8 кубитов могут быть в этих 256 комбинациях одновременно. И соответственно мы можем делать какие-то операции надо ними всеми одновременно. Условно говоря, если есть задача найти пароль, хеш от которого равен x, то обычный компьютер может лишь перебирать пароли по одному, проверяя не имеет ли он нужный хеш. А квантовый может перебирать все возможные пароли одновременно, вычисляя все их хеши одновременно. По крайней мере это я так понимаю.
Ну это пока больше в теории существует. В реальности чтобы манипулировать кубитами нужны большие сложные установки, вакуум, температуры в районе абсолютного нуля (-273 градуса), кубитов там от силы несколько, чуть что все это сложное состояние разрушается. И ни одного пароля пока на квантовом компьютере не взломано.
Либо
WHERE name LIKE ... OR surname LIKE ...
либо
WHERE CONCAT(name, ' ', surname, ' '...) LIKE ...
Преимущества и недостатки способов попробй понять сам. Полнотекстовый поиск может и не подойдет так как он рассчитан на поиск по целым словам а не по кускам слов.
использование JOIN тут бессмысленное - все эти поля ты можешь получить без него. Советую порешать наши задачки на SQL из оп поста чтобы разобраться в джойнах получше.
>>628006
Тут можно без этого. Составные индексы никак тут не помогут, они не ищут по части слова.
>>628011
Может не помочь так как он рассчитан на поиск по словам а не фильтрацию по части слова.
>>628030
О, интересно, а я и не подумал что можно смотреть число форков. Там идеон еще раньше показывал последние программы на определенный язык - и наших было довольно много.
короче та же задача но уже с функциями http://ideone.com/WCiRRb
почему то не работает сложение int и float в строке
f ($dolg<$deposite){
\t$pereplata=$pereplata + $dolg;
\tbreak;\t
\t}
чтобы прибавить остаток к выплате и закончить выполнения цикла, в предыдущий разя я делал через фукнцию intval тоесть таким образом из флоат в инт перевел.
а епта понял свою ошибку, исправил http://ideone.com/WCiRRb , но бля какие то цифры странные мне кажется программа работает некорректно, потому что не выполняется последний шаг, ведь если остается допустим 3000 рублей заплатить, мы же ее не выплачиваем в этот месяц, а ждем следущего, и платим с коммисией вся хуйня
Бро, опять же неправильно считает, я же говорю, какая там цифра в том банке должна получиться: 61270 с копейками. Там как раз для проверки второй банк точно такие же параметры имеет, как в задаче на кредит за Айфон.
Не пойму, для чего так усложнять с float, с этой плавающей точкой?
Там же абсолютно простой алгоритм:
1. Имеем сумму кредита.
2. Умножаем её на 0.0n (сразу прибавляем таким образом процент к сумме кредита) и прибавляем комиссию за обслуживание кредита.
3. Проверяем, получившаяся сумма больше или меньше 5000, которые может выплачивать Анончик в месяц.
4. В соответствии с результатом проверки или продолжаем цикл выплат, или выплачиваем имеющуюся сумму (не забывай, что она у нас уже должна быть умножена на процент и к ней должна быть уже прибавлена комиссия за обслуживание кредита).
Всё.
Ещё замечание: лучше переводить названия переменных, а не писать транслитом.
Я не ОП, он пояснит теперь не скоро, наверное, я вообще недавно начал изучать РНР и возился с задачей на кредит Айфона несколько дней, зато потом сократил до нескольких строк её, изучил нормально работу циклов на ней.
С плавающими точками пока не работал и, честно говоря, не совсем понимаю, для чего она там.
*кредит на Айфон
Также усложнения с плавающей точкой особого нет, просто она там абсолютно ни к чему.
>>628255
ты можешь просто код исправить http://ideone.com/WCiRRb , или свой прислать как должно быть я не понимаю.
require_once 'google-api-php-client/src/Google/autoload.php';
Получается такая ошибка:
Fatal error: Uncaught exception 'Exception' with message 'This library must be installed via composer or by downloading the full package. See the instructions at https://github.com/google/google-api-php-client#installation.' in C:\OpenServer\domains\zorge\otc\google-api-php-client-master\src\Google\autoload.php:14 Stack trace: #0 C:\OpenServer\domains\zorge\otc\index.php(2): require_once() #1 {main} thrown in C:\OpenServer\domains\zorge\otc\google-api-php-client-master\src\Google\autoload.php on line 14
https://jsfiddle.net/kkpjnqc1/2/
>>628254
переделал как ты сказал,
http://ideone.com/WCiRRb
все равно получается сумма 60260.891466803
а все теперь точно исправил получилось
56423.563121625
61268.718210807
51029.365496746,
короче спасибо за помощь, пиздец я долбоеб, ЗАТО АЙТИ ВЫШКА ЕСТЬ.
Лучше сам попробуй разобраться, это стоит того, я гарантирую.
>>628282
Бро, я не пойму обозначения у переменных. Почему месячная выплата называется $deposit?
Сейчас с телефона, тогда чуть позже.
>for($dolg;$dolg>=0;$month++)
Вот тут уже не вполне верно всё, там лучше из количества месяцев исходить, а не из общей суммы, потому что она не известна. Месяцы нам тоже не известны, но можно поставить хоть 100 - не суть важно.
Аа, ну тогда молодца!
Ты неправильно его подключаешь. Там же написано в инструкции как это правильно делать
Много лишнего кода, ОП не одобряет такое.
Там можно повторяющиеся части вынести из if и else.
А с привязкой цикла к $dolg > 0 - шикарная идея! А я и не понял сразу.
Теперь пропала зависимость от непонятного и с потолка взятого числа 20 месяцев.
Отличная находка, поздравляю себя, кому ещё это интересно
ОП вроде тоже говорил об ограничении цикла годами жизни, или я что-то путаю. Тоже не подсказал такого почему-то.
Скачал и распаковал, там кажется написано что так можно, если качаешь всю папку.
Ну посмотри, ты же делаешь require_once файла которого не существует. Autoload.php находится в папке vendor
В самих скачанных файлах есть autoload.php по тому адресу который я подключаю. И во всех примерах что находил в гугле, подключают именно так.
>Там можно повторяющиеся части вынести из if и else.
атвичаю нельзя это вынести, я уже 2 дня думаю как это сделать хз.
вышка-кун.
Если два дня, то вот: http://ideone.com/YfN1KR
Мы делаем общую переменную перед условиями с if и else, а далее её подставляем в условия.
А какая специальность, что именно изучал?
И даже вот здесь, используется такой пример https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-php?hl=ru
Вышка в постсовке настолько обесценилась, что всем похуй если скиллы есть. А вот для перевоза жопы в золотой миллиард, нужен диплом приличного места.
Ввожу в командной строке путь к проекты C:\OpenServer\domains\mysite\>composer init
мне пишет """"""" не является внутренней или внешней командной и т.д.
В переменной PATH прописать путь к композеру.
https://github.com/nsdvw/PreviewGenerator
Задача была такая: сделать несколько виджетов со списком элементов с иконками. Размер, пропорции, цвет фона иконок зависят от дизайна. Значит нужен класс для генерации картинок. Для работы с изображениями используется библиотека, не известно какая. Значит код должен быть универсальным, чтобы можно было подключить любую библиотеку и реализовать под нее адаптер.
Опо-замечания приветствуются.
ну по сути в моем коде нет двух абсолютно повторяющихся строк, но твой чутка покороче да.
изучал МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ И АДМИНИСТРИРОВАНИЕ ИНФОРМАЦИОННЫХ СИСТЕМ. на первом курсе даже хуярили одновременно задачи на бейсике и на паскале. ЧТО БЫ КОД ЛУЧШИ ПОНЯТЬ. потом всякие с++, с#, ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ, ДАЖЕ ЛИСП был ебать ИСКУСТВЕННЫЙ ИНТЕЛЕКТ. ну все по чуть чуть, тонны матана, геометрии, УРАВНЕНИЯ МАТ ФИЗИКИ, ну в итоге нихуя ни кто ни чего не научился, из 50 человек, человек 5 работают в айти, в том числе и я, эникейщик в хелп деске, получаю 30, рядом сидят 1с получающие по 70-80, меня жопа в клочьях, решил перекатвыаться в кодинг. пока с натягом если честно.
Там одни и те же вычисления два раза повторяются, это имел в виду.
РНР вроде верный выбор в этом случае, потом должно быть проще перекидываться на другие языки. Сам надеюсь, что мне потом будет проще изучить уже JS для фронт-энда.
И что, таблицы-то все равно нужны, долбоёбина. Причем тут json/аякс вообще? Это лишь способ добавления лайка в таблицу.
Лайк!
Буду ждать комментарий!
http://ideone.com/NmOdH8
http://ideone.com/6tiLc8
your requirements could not be resolved to an installable set of packages
Это значит в моём композере чего-то не хватает? Каких-то настроек?
Одна таблица нужна, а ты бы три наплодил, говношкальник ебаный. задачку решил уже?
http://ideone.com/S7ja4y - не воспринимает номер.
>([ ]|[-]|[(])
Подумай, как можно упростить это выражение. Квадратные скобки - это "один из указанных символов в любой последовательности".
Также нет ни одного пробела, а они могут там быть.
Вот паста ОПа, как минимум, все эти номера должно проверять верно:
----------
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
с хуертиком, анус себе дернул уже мразота?
ахаах бля, долбоеб с вышкой обученный как макака крестам и прочее функциональнищине не может веб и регулярки, вот это потеха.
>как сделать допущение о том что (скобка, пробел, минус) могут присутствовать а могут и быть в строке
Для этого есть один из символов на скриншоте.
Почаще смотри на эту страницу в учебнике ОПа во время решения задач.
Анон, если ты юзал Vagrant, чем он лучше обычного VirtualBox'a с установленой руками ОС и веб сервером например nginx php-fpm? Есть какие-то профиты для сингл разработчика или нинужно?
Это на замена виртуалбоксу. Это система конфигурирования виртуалбокса. Там в конфиге можно прописать все нужные настройки виртуальной машины + установить какие-то программы (еслиречь о линуксе).
То есть сценарий использования такой: старший разработчик или администратор делает вагрант-скрипт, новичок ставит себе вагрант, запускает скрипт и получает настроенную виртуальную машину с линуксом и установленным в нее софтом (ну например mysql + дамп залитый в него) и начинает работать над проектом, не тратя время на настройку окружения, скачивание чего то итд.
Альтернатива - распространять образ жесткого диска для вирт машины, но это менее удобно: образ тяжелый, ты не можешь в нем что-то поменять итд.
Там еще докер есть, он отличается от вагранта, но я наверно сейчас не смогу подробно расписать чем именно.
http://pastebin.com/ufnVLanq
ОП, в дополнение к этому еще бы хотел задать вопрос. Я как понимаю форма будет в action иметь значение "/". Значит мой роутер должен понимать гет у меня или пост и вызывать соответствующий контроллер и метод?
Вообще я хочу переписать свой роутер и сделать как у фреймворков. Где нибудь в index.php прописать все роуты моего приложения:
return array(
'/' => '/base/index',
....
);
Ну или как там делается:
$router = new Router();
$router->add('GET', array('/' => '/base/index'));
Или мне это нафиг не нужно и я все усложняю?
т.е. вот для меня как сингл разработчика не стоит игра свечь и можно дальше продолжать пользовать настроенную ВБ машину?
> Я как понимаю форма будет в action иметь значение "/".
Почему? Обычно ПОСТ обработчик формы располагается по тому же URL что и ГЕТ, например /register. Ты читал урок про формы?
> Значит мой роутер должен понимать гет у меня или пост и вызывать соответствующий контроллер и метод?
теоретически роутер может при гет/пост вызывать разные методы. Но я бы не советовал это делать так как это усложняет понимание кода.
> Где нибудь в index.php прописать все роуты моего приложения:
Попробуй, почему нет. Почитай также на досуге про роутинг в сифмони и посмотри как он конфигурируется через yml
> Или мне это нафиг не нужно и я все усложняю?
можно попробоавть если хочешь.
Да, это инструмент не для тебя. Хотя возможно тебе бы он пригодился если тебе например периодически приходится создавать ВМ например для тестирования.
Я не он, но пользуюсь вагрантом поверх виртуалбокса. Сильно упрощает жизнь. Он может почти моментально поднимать машины из скрипта. После того, как вырубили свет и у меня приказал долго жить мой няшный дебиан я перешел на вагрант.
ОП, если что по ссылке на пастебин у меня тоже вопросы. На случай, если ты подумал, что там только твои ответы.
блеванул с фронтенда.
w1: https://ideone.com/sgIZfu
w2: https://ideone.com/DBu62z
w3: https://ideone.com/7hEeAu
w4: https://ideone.com/rdAHwD
С иксами?
>\tЯ все равно не понимаю. Вот есть у меня в контроллере addAction, он создает модель студента и запускает ее метод add, а там вызывается метод класса работы с БД тот же add? Или как? Мне не нравится это дублирование. И я не знаю других способов. Давай вот на этом моменте подробнее остановимся.
Неверно.
- у тебя скорее будет не метод addAction, а метод вроде registerAction. При ГЕТ запросе он выводит форму, при ПОСТ обрабатывает (читал урок про формы? задай вопросы если непонятно)
> он создает модель студента и запускает ее метод add
неверно. У модели студента нет такого метода, она лишь хранит информацию о студенте. Перечитай урок про паттерны работы с БД, задай вопросы.
> а там вызывается метод класса работы с БД тот же add?
Он вызывается из контроллера:
$studentGateway->insert($student);
> Мне не нравится это дублирование.
Интуиция тебя не подвела, это действительно неправильно.
> А еще про 404 ошибку, думаю надо отдельный файл шаблона создать, и чтобы роутер вызывал метод indexAction в контроллере с аргументом '404' например. Верно?
Можно так, можно просто сделать где-то метод вывода 404. Контроллер вряд ли получится назвать цифрами.
https://github.com/fxsloker/Student/tree/master/vendor - папку вендор надо убрать из репозитория и добавить в гитигнор, зачем она? В репозитории должен быть в первую очередь твой код а не сторонний. Скачивающий запустит композер инсталл.
https://github.com/fxsloker/Student/blob/master/public/index.php#L12
> error_reporting(0);
Объясни зачем? Зачем ты включаешь игнорирование любых видов ошибок?
> https://github.com/fxsloker/Student/blob/master/app/students.sql#L33
> `sex` enum('0','1') NOT NULL,
не используй цифры в енумах, http://www.mysql.ru/docs/man/ENUM.html
mysql воспринимает числа как номер элемента и это ведет к трудноотлаживаемым багам.
> Если вы вставляете число в столбец ENUM, это число воспринимается как индекс, и в таблицу записывается соответствующее этому индексу значение перечисления. (Однако, это не будет работать с LOAD DATA, который воспринимает все входящие данные как строки.) Не рекомендуется сохранять числа в перечислении, т.к. это может привести к излишней путаннице.
> CREATE TABLE IF NOT EXISTS
чуть надежнее делать DROP + CREATE или только CREATE так ка кв базе может быть не та таблица что надо.
> FrontController это тот же роутер что ли? Он вызывает нужный контроллер и экшен. Значит мой роутер уже FrontController?
примерно так. Фронт контроллер это когда все запросы проходят через этот самый фронт контроллер, а он уже запускает конкретный контроллер действия. Так что у тебя фронт контроллером является Router (не совсем точно названный)
https://github.com/fxsloker/Student/blob/master/app/bootstrap.php#L13
строки длиннее 80 символов надо переносить как описано в PSR
> set_error_handler("exception_error_handler");
можно бы и через анонимную функцию чтобы не загрязнять пространтство имен функций.
> Не понял, что не читабельно. Сделал, вроде также читабельно как и раньше.
ну ок можешь сделать как хочешь
https://github.com/fxsloker/Student/blob/master/app/Router.php#L17
> strtolower($controllerName)
не очень понятно зачем? в урл регистр букв имеет значение везде кроме протокола и домена.
В режиме отладки полезно на странице 404 писать причину ошибки чтобы упростить себе же жизнь. Это не обязательно делать. ТАкже надо сделать отлов непойманных исключений и вывод страницы-заглушки со всеми нужными ХТТП заголовками.
>\tЯ все равно не понимаю. Вот есть у меня в контроллере addAction, он создает модель студента и запускает ее метод add, а там вызывается метод класса работы с БД тот же add? Или как? Мне не нравится это дублирование. И я не знаю других способов. Давай вот на этом моменте подробнее остановимся.
Неверно.
- у тебя скорее будет не метод addAction, а метод вроде registerAction. При ГЕТ запросе он выводит форму, при ПОСТ обрабатывает (читал урок про формы? задай вопросы если непонятно)
> он создает модель студента и запускает ее метод add
неверно. У модели студента нет такого метода, она лишь хранит информацию о студенте. Перечитай урок про паттерны работы с БД, задай вопросы.
> а там вызывается метод класса работы с БД тот же add?
Он вызывается из контроллера:
$studentGateway->insert($student);
> Мне не нравится это дублирование.
Интуиция тебя не подвела, это действительно неправильно.
> А еще про 404 ошибку, думаю надо отдельный файл шаблона создать, и чтобы роутер вызывал метод indexAction в контроллере с аргументом '404' например. Верно?
Можно так, можно просто сделать где-то метод вывода 404. Контроллер вряд ли получится назвать цифрами.
https://github.com/fxsloker/Student/tree/master/vendor - папку вендор надо убрать из репозитория и добавить в гитигнор, зачем она? В репозитории должен быть в первую очередь твой код а не сторонний. Скачивающий запустит композер инсталл.
https://github.com/fxsloker/Student/blob/master/public/index.php#L12
> error_reporting(0);
Объясни зачем? Зачем ты включаешь игнорирование любых видов ошибок?
> https://github.com/fxsloker/Student/blob/master/app/students.sql#L33
> `sex` enum('0','1') NOT NULL,
не используй цифры в енумах, http://www.mysql.ru/docs/man/ENUM.html
mysql воспринимает числа как номер элемента и это ведет к трудноотлаживаемым багам.
> Если вы вставляете число в столбец ENUM, это число воспринимается как индекс, и в таблицу записывается соответствующее этому индексу значение перечисления. (Однако, это не будет работать с LOAD DATA, который воспринимает все входящие данные как строки.) Не рекомендуется сохранять числа в перечислении, т.к. это может привести к излишней путаннице.
> CREATE TABLE IF NOT EXISTS
чуть надежнее делать DROP + CREATE или только CREATE так ка кв базе может быть не та таблица что надо.
> FrontController это тот же роутер что ли? Он вызывает нужный контроллер и экшен. Значит мой роутер уже FrontController?
примерно так. Фронт контроллер это когда все запросы проходят через этот самый фронт контроллер, а он уже запускает конкретный контроллер действия. Так что у тебя фронт контроллером является Router (не совсем точно названный)
https://github.com/fxsloker/Student/blob/master/app/bootstrap.php#L13
строки длиннее 80 символов надо переносить как описано в PSR
> set_error_handler("exception_error_handler");
можно бы и через анонимную функцию чтобы не загрязнять пространтство имен функций.
> Не понял, что не читабельно. Сделал, вроде также читабельно как и раньше.
ну ок можешь сделать как хочешь
https://github.com/fxsloker/Student/blob/master/app/Router.php#L17
> strtolower($controllerName)
не очень понятно зачем? в урл регистр букв имеет значение везде кроме протокола и домена.
В режиме отладки полезно на странице 404 писать причину ошибки чтобы упростить себе же жизнь. Это не обязательно делать. ТАкже надо сделать отлов непойманных исключений и вывод страницы-заглушки со всеми нужными ХТТП заголовками.
Лол, салага. Там же пару ерундовин прописать в ОПовском коде, какие советы-критика? Всё там у тебя верно, конечно же.
Я когда эти задачки начал в середине декабря решать, был уверен, что дойду до ООП к Новому году.
Сейчас думаю, дойти бы до ООП к началу-середине марта.
Просто до этого мне приходилось подумать над всякими там кредитными калькуляторами, а так да, очень просто когда-нибудь я дойду до ооп... когда-нибудь
За пять минут поигрался сейчас: http://ideone.com/eAd4Ye
Дойдём до ООП и перейдём, я базарю и гарантирую.
>Перенаправить и вывод, и ошибки в файл можно так:
>команда 2>&1 > file.txt
>и вывод, и ошибки
>&
В моем представлении символ > означает перенаправление, а символ & - логическое "и", пробел, опять же повторяюсь, в моем представлении, должен быть "разделителем" не знаю правильно назвать.
>Перенаправить и вывод, и ошибки в файл можно так:
>команда 2>&1 > file.txt
>и вывод, и ошибки
>&
В моем представлении символ > означает перенаправление, а символ & - логическое "и", пробел, опять же повторяюсь, в моем представлении, должен быть "разделителем" не знаю правильно назвать.
Следовательно, часть выражения 2>&1 мне кажется совершенно не связанной кучемалой. Получается: 2перенаправитьИ1 перенаправить в файл.тхт
По моему, 2перенаправить и 1перенаправить в файл.тхт или 2и1 перенаправить в файл.тхт 2> & 1> file.txt как-то логичней записть представляется представляется.
>Вообще, синтаксис такой по историческим причинам, написаны миллионы скриптов и никто их уже не переделает.
Понимаю что исходя из этого мой вопрос становиться дурацким, но мне так не понятно и так кажется странным это.
> 2>&1 значит перенаправить данные, из потока №2 (поток ошибок stderr) в поток №1 (поток вывода stdout)
А зачем тут тогда &? И почему первый раз мы не отделяем пробелами символ перенаправления, а второй разделяем? Не понимаю.
Короче в сессии в силексе каждому лайку по уникальному айди создается значение айпи и кол-во лайков. Может быть либо 1 либо 0, т.к. больше одного нельзя ставить.Я так понимаю, что при лайкании с каждого нового айпишника значение айпи и лайк будет заново переписываться для айдишки лайка? Получается без таблиц не обойтись?
Как кукисы только значения на сервере, а у пользователя только айди сессии.
вот зацените тестовое и лайки.
А соус где?
абу ну не сри
http://ideone.com/eAd4Ye - смотри, как я могу.
Я, наверное, слегка поехал уже, но делаю сейчас задачу на числа прописью - она способствует.
Тут бамплимит 500 или 1000? Судя по тому что мы тонем и не всплываем, скорее всего 500.
С почином! Один маленький шажок для человечества, но зато какой огромный шаг для анона! Точнее, наоборот.
Рекомендуется со строчной буквы писать if, а также слитно писать elseif. А так всё правильно.
В данном случае он является признаком того что справа от > указано не имя файла, а номер потока. Если написать 2>1 то это значило бы "перенаправить поток ошибок в файл с именем 1"
> как-то логичней записть представляется представляется.
я думаю это субъективно. Тем более мы не знаем, может в то время когда появился синтаксис он был скопирован с какой-то другой программы и всем казался привычным.
> И почему первый раз мы не отделяем пробелами символ перенаправления
не знаю, по моему это ни на что не влияет
>>628913
Ты по моему плохо понимаешь что такое сессии. Не имеет никакого смысла записывать ip в сессию так как она у каждого пользователя своя. Тебе надо бы вернуться и подучить эту тему.
Касательно вопроса, твоя задача разбивается на 2 независимые части:
- что считать идентификатором пользователя? (id залогиненного? ip? токен в куке?) - тут есть несколько вариантов, у каждого свои особенности. Если ты не понимаешь какие то вернись и изучи как работают куки, как делается авторизаци
- как запрещать повторное голосование. Ну тут все просто - надо в БД сохранять факт что пользователь с данным ид проголосовал за данную запись и не позволять голосовать второй раз
Вернись и изучи теорию про куки, сессию и авторизацию. Без этих знаний ты ничего нормально сделать не сможешь. Если у тебя есть вопросы, можешь задавать.
>>628914
А гуглить пробовал?
https://www.google.ru/search?q=%D1%81%D0%B5%D1%81%D1%81%D0%B8%D0%B8+%D0%B2+php&newwindow=1&gbv=1&sei=5wKeVrHNLsisygOy7ZqYBw
на phpfaq неплохое объяснение
я готов ответить на вопросы, но на конкретные вопросы по какой-то статье, а не вопросы вида "погуглите за меня"
Алсо во многих случаях сессии не требуются. Я вообще не понимаю, почему их везде использовать пытаются. Надо наверно урок про них сделать.
В данном случае он является признаком того что справа от > указано не имя файла, а номер потока. Если написать 2>1 то это значило бы "перенаправить поток ошибок в файл с именем 1"
> как-то логичней записть представляется представляется.
я думаю это субъективно. Тем более мы не знаем, может в то время когда появился синтаксис он был скопирован с какой-то другой программы и всем казался привычным.
> И почему первый раз мы не отделяем пробелами символ перенаправления
не знаю, по моему это ни на что не влияет
>>628913
Ты по моему плохо понимаешь что такое сессии. Не имеет никакого смысла записывать ip в сессию так как она у каждого пользователя своя. Тебе надо бы вернуться и подучить эту тему.
Касательно вопроса, твоя задача разбивается на 2 независимые части:
- что считать идентификатором пользователя? (id залогиненного? ip? токен в куке?) - тут есть несколько вариантов, у каждого свои особенности. Если ты не понимаешь какие то вернись и изучи как работают куки, как делается авторизаци
- как запрещать повторное голосование. Ну тут все просто - надо в БД сохранять факт что пользователь с данным ид проголосовал за данную запись и не позволять голосовать второй раз
Вернись и изучи теорию про куки, сессию и авторизацию. Без этих знаний ты ничего нормально сделать не сможешь. Если у тебя есть вопросы, можешь задавать.
>>628914
А гуглить пробовал?
https://www.google.ru/search?q=%D1%81%D0%B5%D1%81%D1%81%D0%B8%D0%B8+%D0%B2+php&newwindow=1&gbv=1&sei=5wKeVrHNLsisygOy7ZqYBw
на phpfaq неплохое объяснение
я готов ответить на вопросы, но на конкретные вопросы по какой-то статье, а не вопросы вида "погуглите за меня"
Алсо во многих случаях сессии не требуются. Я вообще не понимаю, почему их везде использовать пытаются. Надо наверно урок про них сделать.
идентификатор - это идентификатор записи в бд, к которой ставятся лайки. каждому пользователю в сессию свой айпи записываестя. у пользователя нет идентификатора, в глаза долбишься мразь тупая. ой все нахуй иди.
https://github.com/foobar1643/student-list
Сделал вот задачу из ОП-поста на список студентов, реализовал все что нужно было, код все равно получился говном (но работает). Подскажите что переделать, что сделано не так.
Поддержки mysql нет потому что мне лень было её ставить на сервер. Взял вместо неё postgresql, хотя в теории если поменять одну строчку в конфиге, то всё должно заработать и с mysql (дамп базы очевидно не подойдет).
постгрес можно использовать, никакой проблемы в этом нет. Насчет поля поиска, лучше было бы написать подсказку более конкретно, например "введите часть имени, фамилии, номера группы"
Я насчет текста и подсказок не особо задумывался.
Мне не нравится код. Как-то читать тяжело.
Неудобно, что страница после лайка полность перезагружается.
Аяксом или жквери можносделать без перезагрузки.
Можно и с ним, и без него.
Код парсера:
<?php
//error_reporting();
@ini_set('max_execution_time', 0);
echo "<title>Парсер YouTube V2.1 (с) by Gogres</title>";
echo "<form method = \"POST\" >";
echo "Кейворды (по одному на строку):
медвед
креветка
<br><br>";
echo "<textarea name=\"keys\" cols=\"70\" rows=\"10\"></textarea><br>";
echo "<input name=\"page\" size=5 type=\"text\" value=\"1\"> :Количество страниц<br>";
echo "<input type=\"submit\" value=\"Click & Parse\">";
echo "</form>";
$data=fopen('data.txt','a');
if ($_POST['page']) $pages=$_POST['page']; else $pages=1;
if ($_POST['keys']){
$filename=$_POST['filename'];
$papkaname=$_POST['papkaname'];
$keys=split("\n", $_POST['keys']);
foreach ($keys as $k=>$key){
$key=trim($key);
$reskey=$key;
$key=urlencode($key);
$key=str_replace("%20", "+", $key);
for($i=0; $i<$pages; $i++)
{
$pageparse=file_get_contents("http://www.youtube.com/results?search_type=videos&search_query=".$key."&page=".$page);
if(strpos($pageparse, "/watch?v=")!=false)
{
$matches=array();
$pattern = "/href=\"\/watch\?v=([^\"]*)\"/sU";
preg_match_all($pattern, $pageparse, $matches);
$resultmovies=implode(" ", $matches[1]);
$resultmovies=str_replace("&hd=1", "", $resultmovies);
$resultmovies=str_replace("&feature=browch", "", $resultmovies);
$resultmovies=explode(" ", $resultmovies);
$resultmovies=array_unique($resultmovies);
$moviescount=count($resultmovies);
//$query="http://www.youtube.com/watch?v=".$resultmovies;
foreach($resultmovies as $movielink)
{
$link = trim($movielink);
if ($link!="EMPTY")
{
\t$text='<object width="425" height="350">';
\t$text.='<param name="movie" value="http://www.youtube.com/v/'.$link.'"></param>';
\t$text.='<param name="wmode" value="transparent"></param>';
\t$text.='<embed src="http://www.youtube.com/v/'.$link.'"';
\t$text.='type="application/x-shockwave-flash" wmode="transparent"';
\t$text.='width="425" height="350"></embed></object>';
fwrite($data, $text."\n");
\t}
}
sleep(1);
}
} }
}
fclose($data);
?>
Код парсера:
<?php
//error_reporting();
@ini_set('max_execution_time', 0);
echo "<title>Парсер YouTube V2.1 (с) by Gogres</title>";
echo "<form method = \"POST\" >";
echo "Кейворды (по одному на строку):
медвед
креветка
<br><br>";
echo "<textarea name=\"keys\" cols=\"70\" rows=\"10\"></textarea><br>";
echo "<input name=\"page\" size=5 type=\"text\" value=\"1\"> :Количество страниц<br>";
echo "<input type=\"submit\" value=\"Click & Parse\">";
echo "</form>";
$data=fopen('data.txt','a');
if ($_POST['page']) $pages=$_POST['page']; else $pages=1;
if ($_POST['keys']){
$filename=$_POST['filename'];
$papkaname=$_POST['papkaname'];
$keys=split("\n", $_POST['keys']);
foreach ($keys as $k=>$key){
$key=trim($key);
$reskey=$key;
$key=urlencode($key);
$key=str_replace("%20", "+", $key);
for($i=0; $i<$pages; $i++)
{
$pageparse=file_get_contents("http://www.youtube.com/results?search_type=videos&search_query=".$key."&page=".$page);
if(strpos($pageparse, "/watch?v=")!=false)
{
$matches=array();
$pattern = "/href=\"\/watch\?v=([^\"]*)\"/sU";
preg_match_all($pattern, $pageparse, $matches);
$resultmovies=implode(" ", $matches[1]);
$resultmovies=str_replace("&hd=1", "", $resultmovies);
$resultmovies=str_replace("&feature=browch", "", $resultmovies);
$resultmovies=explode(" ", $resultmovies);
$resultmovies=array_unique($resultmovies);
$moviescount=count($resultmovies);
//$query="http://www.youtube.com/watch?v=".$resultmovies;
foreach($resultmovies as $movielink)
{
$link = trim($movielink);
if ($link!="EMPTY")
{
\t$text='<object width="425" height="350">';
\t$text.='<param name="movie" value="http://www.youtube.com/v/'.$link.'"></param>';
\t$text.='<param name="wmode" value="transparent"></param>';
\t$text.='<embed src="http://www.youtube.com/v/'.$link.'"';
\t$text.='type="application/x-shockwave-flash" wmode="transparent"';
\t$text.='width="425" height="350"></embed></object>';
fwrite($data, $text."\n");
\t}
}
sleep(1);
}
} }
}
fclose($data);
?>
Для джуниора хватит того что ты описал.
Научись еще создавать ветки и работать с ними. Потом уже по обстоятельствам.
А где про это почитать? Вообще ничего не знаю по гиту пока что. И гитхабу(это ж сайт, не?)
Git - система контроля версий, GitHub - сайт, который работает на основе этой системы контроля версий. Так же существуют и другие системы контроля версий (Apache Subversion, Mercurial), но это уже другая история.
У гитхаба есть серия интерактивных уроков которые помогут понять новичку как это работает.
https://try.github.io/
Ох щи, я думал, что это просто сайт, на котором все компоненты системы выложены в виде структуры, можно тупо почитать код, скачать его и т.п.
http://ideone.com/bNsZj2
Значит попал в бесконечный цикл, проверь условие.
Ты все время увеличиваешь сумму кредита и ничего не отнимаешь от нее. Т.е. условие < 0 не наступит никогда.
PHP-ны. Скажите, как реализовать следующую задачу:(Пожалуйста, подробно, в вебе я вообще ни разу ничего не делал)
1)Создать страницу, на которой есть возможность просмотра видео.
2)На этой странице есть возможность залить видео. После заливки видео обрабатывается(обрезается на половину(тут по подробней распишите, пожалуйста, если можете)). Не знаю куда заливать, посоветовали бесплатное амазноновское хранилище. После заливки идет запись в БД о том, куда залито обработанное видео и есть возможность на странице воспроизвести это видео. Добра вам сразу!
>Советую показывать промежуточные варианты.
http://ideone.com/TxblFr - вот, первую часть сделал. Что надо исправить?
Анончики, помогайте, я застрял в бесконечном мысленном цикле и не могу выбраться. Задачка на проверку грамматики: http://ideone.com/VRhfc0
Почему при проверке в массив выводится только первая ошибка? После долгих размышлений я решил, что само регулярное выражение задано неправильно и вариант с "или-или" в данном случае - неверный выбор. Но если так, то получается, выражение можно заточить лишь под проверку конкретного предложения? Ткните пальцем в страницу из руководства, дайте подсказку, что угодно, я совсем запутался.
Черт! Забыл вывести "Всего" и "Среднее".
Вместо $lowerCase = mb_strtolower($text); можно просто в регулярку добавить модификатор i.
Там про preg_match_all дальше говорится, же после Граммар Наци.
Сам помню, как тыкался с имеющейся до этого информацией, а потом просто прочитал дальше на странице всё.
А почему вывод ошибок не сделал нормальный, чего var_dump-то всего лишь?
Если нужна подсказка для этого, то сделай вот так: раскладываешь циклом с foreach массив с ошибками на ключи и значения, другим циклом с foreach раскладываешь значения так же на ключи и значения - там же в массиве $mistakes у нас массивы в массивах. Далее просто выводишь в echo последние значения вложенных массивов. Если не получится сразу, то подсмотри: http://ideone.com/T4ewwV Но лучше сам пробуй сделать, конечно.
Не дрейфь, сухопутная крыса. Всем оставаться на своих местах, держим курс в бездну!
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L8
> "host" => $host,
Лучше назвать настройку db.host, чтобы было понятно что это за опция. И переменную тогда dbHost.
Добавление функций в твиг можно сделать без переменных:
$twig->addFunction(new Twig_SimpleFunction(...);
или можно вынести конфигурирование твига в метод класса, допустим, TwigHelper::initTwig(...). Хотя я не уверен, может лучше в index это оставить, давай пока оставим. Ну и помни что кроме экспортирования функций по одной есть еще вариант просто отказаться от статических методов и передать объект в твиг.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L84
> $comment = $file->getComment();
незачем передавать комментарий отдельной переменной, его можно получить в шаблоне через file.getComment()
> $pathToFile = $app->filesHelper->getPathToFile($id . $file->getFileName());
что за ерунда? Почему для функции getPathTofile надо делать какие-то манипуляции? Это ведь верный путь к ошибкам, легко забыть склеить или что-то передать. Плюс ты ухудшаешь код, вынося знание о том как получается путь к файлу из функции и размазывая его по всему коду.
Надо либо функцию принимабщую объект File (не ошибешься) либо по отдельности id и filename. либо обе функции сразу.
Более того, вместо того чтобы передавать 4 переменных вроде pathToFile, relPathToThumb проще тут передать filesHelper в твиг.
> $app->get("/files/:id"
> $app->post("/files/:id",
Эти 2 функции содержат много общего кода и отвечают примерно за одну и ту же страницу, логично их объединить в одну. Также, читал ли ты урок по работе с формами? После успешной обработки формы надо делать редирект (можно на ту же страницу) чтобы при нажатии кнопки обновить запрос не отправлялся. Перечитай урок про формы и проверь соответствует ли твой код написанному там алгоритму.
> $fileName = $app->filesMapper->fetchFileName($id);
> $fileName = $fileName['filename'];
почему бы не возвращать сразу filename, а не массив?
> exit;
в слиме есть $app->stop(), он в отличие от exit корректно вызывает все нужные обработчики завершения скрипта в слиме.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L159
Создание папок для превьюшки наверно должно быть не здесь а в функции создания превьюшки.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L178
> if ($_FILES['userfile']['error'] == UPLOAD_ERR_OK) {
а где проверка на размер файла?допустим ли он?
Там еще не все я проверил, если я забуду и не напишу продолжение, напомни мне.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L8
> "host" => $host,
Лучше назвать настройку db.host, чтобы было понятно что это за опция. И переменную тогда dbHost.
Добавление функций в твиг можно сделать без переменных:
$twig->addFunction(new Twig_SimpleFunction(...);
или можно вынести конфигурирование твига в метод класса, допустим, TwigHelper::initTwig(...). Хотя я не уверен, может лучше в index это оставить, давай пока оставим. Ну и помни что кроме экспортирования функций по одной есть еще вариант просто отказаться от статических методов и передать объект в твиг.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L84
> $comment = $file->getComment();
незачем передавать комментарий отдельной переменной, его можно получить в шаблоне через file.getComment()
> $pathToFile = $app->filesHelper->getPathToFile($id . $file->getFileName());
что за ерунда? Почему для функции getPathTofile надо делать какие-то манипуляции? Это ведь верный путь к ошибкам, легко забыть склеить или что-то передать. Плюс ты ухудшаешь код, вынося знание о том как получается путь к файлу из функции и размазывая его по всему коду.
Надо либо функцию принимабщую объект File (не ошибешься) либо по отдельности id и filename. либо обе функции сразу.
Более того, вместо того чтобы передавать 4 переменных вроде pathToFile, relPathToThumb проще тут передать filesHelper в твиг.
> $app->get("/files/:id"
> $app->post("/files/:id",
Эти 2 функции содержат много общего кода и отвечают примерно за одну и ту же страницу, логично их объединить в одну. Также, читал ли ты урок по работе с формами? После успешной обработки формы надо делать редирект (можно на ту же страницу) чтобы при нажатии кнопки обновить запрос не отправлялся. Перечитай урок про формы и проверь соответствует ли твой код написанному там алгоритму.
> $fileName = $app->filesMapper->fetchFileName($id);
> $fileName = $fileName['filename'];
почему бы не возвращать сразу filename, а не массив?
> exit;
в слиме есть $app->stop(), он в отличие от exit корректно вызывает все нужные обработчики завершения скрипта в слиме.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L159
Создание папок для превьюшки наверно должно быть не здесь а в функции создания превьюшки.
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L178
> if ($_FILES['userfile']['error'] == UPLOAD_ERR_OK) {
а где проверка на размер файла?допустим ли он?
Там еще не все я проверил, если я забуду и не напишу продолжение, напомни мне.
>незачем передавать комментарий отдельной переменной
Это комментарий для модального окна, он может отличаться от того, что в объекте, например, когда пользователь введет невалидный коммент, он будет там отображаться.
Оп проверь пожалуйста:
http://integer64.github.io/site-layout/exercise/mainTask/index.html
Сделал под ослика.
Можете начать тыкать в мои косяки
Дали какую то выгрузку. Логики с первого взгляда не вижу никакой. Сказали заебаш интеграцию с 1с на сайте, а я в душе не ебу что эти люди понимают под интеграцией.
Предоставить выгрузку в формате CommerceML отказались.
Не прошу ничего делать за меня, а прошу - подкиньте ключевых слов для поиска (интеграция с 1с не предлагать).
http://ideone.com/H8NBFd
Получается вывести победу и проигрыш. Когда игрок=компьютер, почему-то не выводится надпись "Ничья!". Что я делаю не так?
} elseif (($anonDice1 + $anondice2) == ($compDice1 + $compDice2)) {
echo "Ничья!";
Когда сделал вот так, всё получилось. Почему?
http://ideone.com/OuuiCM
$aSum = ($anonDice1 + $anonDice2);
$cSum = ($compDice1 + $compDice2);
} elseif ($aSum > $cSum) {
\techo "Проиграл";
Ну где PHP-макаки то? Элементарщина же.
Это оказалась задача W4.2, простите
Считает неправильно.
Ориентир для Софтобанка - 61270 с копейками.
Значит, у тебя и кредит за Айфон рассчитывался неправильно.
>$creditSum = ($creditSum / 100 * (100 + $percent)) + $servicePay - $payout
Забавно, можно проще всё представить.
Ошибка заключается у тебя в том, что ты не обновляешь сумму кредита перед всеми условиями с if и else.
>>629605
Ошибка в написании переменной вот тут: if (($anonDice1 == $anondice2) && ($compDice1 == $compDice2))
Отыщи сам, надо это тренировать тоже.
Подсказка: $anondice2 - должно быть $anonDice2
И эта же ошибка в другой строке, номер 16.
>>629619
Потому что тут переменные в одном месте названы без ошибок, а в 16 строке по-прежнему ошибка.
>>629624
Тебе спасибо, я так повторяю пройденный материал.
Также в самой функции обозначь переменную $paymentTotal, иначе будет вылезать ошибка.
Вот твой исправленный калькулятор - но ни в коем случае не открывай, пока сам не попытаешься сделать: http://ideone.com/jaYrBg
Вот алгоритм:
1. Имеем сумму кредита.
2. Прибавляем к ней нужный процент и прибавляем комиссию за обслуживание кредита.
3. Проверяем, получившаяся сумма больше или меньше 5000, которые может выплачивать Анончик в месяц.
4. В соответствии с результатом проверки или продолжаем цикл выплат, или выплачиваем имеющуюся сумму и обрываем цикл (не забывай, что она у нас уже должна быть умножена на процент и к ней должна быть уже прибавлена комиссия за обслуживание кредита).
Всё.
>уже должна быть умножена на процент
То есть к ней должен быть прибавлен процент.
Я делал не в скобках, как ты, а через умножение суммы кредита на 0.0n - так всё экономится.
Спасибо, добрый человек. Нашёл ошибку без спойлера, как только ты сказал "надо это тренировать тоже". После основной работы учусь, внимание уже не такое. Буду иметь в виду)
Короче, у меня депресузха походу начинается. Думал на этих каникулах в колледже буду вкалывать - изучать пхп и потихоньку пилить диплом. Диплом должен делаться с базой, которую нам должен был скинуть препод. Я думал что пхначну делать как он скинет базу.
Получилось, что базу он так и не скинул, до конца каникул осталось +-10 дней. Так на каникулах я почти ничего не учил, немного по мелочи пхп и mysql. Еще я расчитывал кстроитьсч на практику, то место куда мне нашли родители, сказали мол там будем погромирование и всё такое, оказалось что там пограммирования нет впринципе. Я понимаю, что каникулы и собственно свободные дни почти проёбаны, а я почти ничего и не делал, диплом даже и не начинал.
Для диплома надо как минимум знания php. Вижу тут у вас есть свои уроки, они норм повышают уровень? Или сразу в какую-то книгу вникать? Помогите пожалуйста. Сейчас почти утро, я сейчас лягу спать и буду вкалывать весь день как проснусь. Мне нужны ваши советы по этому поводу, что дрочить чтоб повышать уровень php. Спасибо, не бросьте в беде.
Добавлю, не скинул препод потому, что говорит мол траблы с компом. Вот так звёзды неудачно стали.
Нет, считает неверно. Должно получиться 61270 и много знаков после запятой.
У тебя в последний раз когда $creditBalance участвует в выражении с $paymentTotal - от него уже отнята месячная плата.
Вот тут:
if ($creditBalance < 5000) {
$paymentTotal += $creditBalance;
А нужно просто выплачивать чистый $creditBalance на тот момент.
Учебник ОПа отлично поможет в освоении синтаксиса, вообще всех основ. Если постоянно работать, то за месяц основы усвоишь, вплоть до БД.
Но писать код придется постоянно.
>А нужно просто выплачивать чистый $creditBalance на тот момент.
Но к нему уже должны быть прибавлены проценты и комиссия за кредит.
>if ($creditBalance < 500)
Странный ориентир.
ОП проверял, подставляя в сумму кредита 1000 - должно выйти 2030 рублей.
А с твоим ориентиром - не факт.
http://ideone.com/X6MUaK - ноуп, считает неверно, если 1000 подставить.
Он при любых суммах должен считать одинаково правильно.
Карочи мне нужен скрипт. Если кому не трудно, то помогите позязя.
Есть страница /redirect.php, есть ссылки на неё вида /redirect.php?id=1 (2,3,4,5 итд).
Нужно редиректить трафик на разные url, в зависимости от значения параметра id (т.е. если id=1 то редирект на url1, если id=2 то на url2 итд).
С меня как и всегда огромное спасибо.
Хм, нет, бро: http://ideone.com/SvK7TK - если подставить 1000 в кредитбаланс.
Введи дополнительную переменную для суммы кредита, когда она увеличена на проценты и с прибавленной комиссией за кредит.
С ней именно оперируй, когда надо просто её и выплатить.
Просто каждый раз перед if проверяй, не стала ли чистая сумма кредитбаланса со своими 3 процентами и 1000 комиссии меньше 5000 возможной выплаты анончика.
Если стала - сразу выплачиваешь только её и прекращаешь цикл.
Попробуй так базарю, еще захочешь, поцене 38 рублей
Сейчас под лайки по айпи таблицы создаю.
https://github.com/toppestkek/GuestBook
>Просто каждый раз перед if
Просто каждый раз в if, опечатался.
За пределами условий в этом цикле получай сумму кредитбаланса со своими 3 процентами и 1000 комиссии, ну а дальше подставляй её в условия, хоть в if, хоть в else.
Нет, работает, но чувство мне подсказывает, что каждый раз заново переписывать лайку сессию по идентификатору на новый айпи неправильно.
Скоро будет
>>623492
https://github.com/MindiMakridi/filehosting/tree/master/templates
для шаблонов лучше поставить расширение вроде file.html.twig чтобы было видно что это шаблон, чтобы редактор подсвечивал синтаксис и тд
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L20
сделай-ка вывод даты в виде "12:00 Jun 12, 1991"
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L23
> {% if canEdit(token, file.getToken()) %}
странный набор аргументов у функции. По моему логичнее бы смотрелось if canEdit(file) или if canEdit(user, file). возможно эта функция спроектирована неверно?
https://github.com/MindiMakridi/filehosting/blob/master/templates/layout.html#L6
> <meta name="viewport"
у тебя верстка адаптирована под мобильные устройства? Если нет, зачем тег?
зачем это? Также, почему держишь файлы на каком-то левом стороннем сайте, а не у себя?
https://github.com/MindiMakridi/filehosting/blob/master/templates/layout.html#L39
> <a href="http://filehosting.ru
Не надо вписывать тут имя домена. Как твой сайт выгрузить на другой домен не правя код? Если нужно имя домена, его надо вынести в конфиг, но лучше бы определять его автоматически через хттп заголовок HOST. Хотя тебе по моему оно вообще не нужно.
Почему скрипты на стороннем сайте?
Почему в интерфейсе смешан русский и английский? Выбери один язык (либо сделай поддержку переключения языков, если тебе интересно, я подскажу куда копать).
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L34
> <textarea
может тут стоит какие-то HTML5 атрибуты для валидации поставить, например что это обязательное поле или ограничение на длину, или не требуется?
https://github.com/MindiMakridi/filehosting/blob/master/public/css/style.css#L1
> input[type="file"]{
Этот стиль применяется ко всем файловым инпутам на сайте. Наверняка ты хотел тут сделать стиль только для инпута в форме загрузки. Если так, то надо исправить.
> textarea.form-control
> .modal
То же самое. Ты хочешь стили воообще к любым модальным окнам применять или к одному конкретному?
https://github.com/MindiMakridi/filehosting/blob/master/lib/config.php
Странное название папки lib что значит "библиотеки"
https://github.com/MindiMakridi/filehosting/tree/master/models
не очень удалчное название так как в эту папку куча разных классов сброшена, не только модели
https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L15
строки длиннее 80 символов рекомендуется переносить
https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L71
логичнее назвать функцию editFileComment
> $STH
> DBH
переменные и поля принято писать с маленькой буквы
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L10
> $this->rootDirectory = $root;
одинаковые вещи лучше называть одинаково
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L39
> return md5($salt1 . $cypher . $salt2);
Эта функция не добавляет ничего к токену, а лишь увеличивает его объем. На входе мы имеем комбинацию из 20 символов (20 ^ 36 вариантов, гугл говорит что это 6.87194767 × 10^46). На выходе получаем 128-битный хеш, 2^128 вариантов (2^128 = 3.40282367 × 10^38). То есть ты уменьшаешь число возможных вариантов, снижаешь стойкость ключа (хотя 2^128 тоже много), да еще и увеличиваешь длину (md5 генерирует 32 символа на выходе). Объясни-ка, с какой целью это делается?
Скоро будет
>>623492
https://github.com/MindiMakridi/filehosting/tree/master/templates
для шаблонов лучше поставить расширение вроде file.html.twig чтобы было видно что это шаблон, чтобы редактор подсвечивал синтаксис и тд
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L20
сделай-ка вывод даты в виде "12:00 Jun 12, 1991"
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L23
> {% if canEdit(token, file.getToken()) %}
странный набор аргументов у функции. По моему логичнее бы смотрелось if canEdit(file) или if canEdit(user, file). возможно эта функция спроектирована неверно?
https://github.com/MindiMakridi/filehosting/blob/master/templates/layout.html#L6
> <meta name="viewport"
у тебя верстка адаптирована под мобильные устройства? Если нет, зачем тег?
зачем это? Также, почему держишь файлы на каком-то левом стороннем сайте, а не у себя?
https://github.com/MindiMakridi/filehosting/blob/master/templates/layout.html#L39
> <a href="http://filehosting.ru
Не надо вписывать тут имя домена. Как твой сайт выгрузить на другой домен не правя код? Если нужно имя домена, его надо вынести в конфиг, но лучше бы определять его автоматически через хттп заголовок HOST. Хотя тебе по моему оно вообще не нужно.
Почему скрипты на стороннем сайте?
Почему в интерфейсе смешан русский и английский? Выбери один язык (либо сделай поддержку переключения языков, если тебе интересно, я подскажу куда копать).
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html#L34
> <textarea
может тут стоит какие-то HTML5 атрибуты для валидации поставить, например что это обязательное поле или ограничение на длину, или не требуется?
https://github.com/MindiMakridi/filehosting/blob/master/public/css/style.css#L1
> input[type="file"]{
Этот стиль применяется ко всем файловым инпутам на сайте. Наверняка ты хотел тут сделать стиль только для инпута в форме загрузки. Если так, то надо исправить.
> textarea.form-control
> .modal
То же самое. Ты хочешь стили воообще к любым модальным окнам применять или к одному конкретному?
https://github.com/MindiMakridi/filehosting/blob/master/lib/config.php
Странное название папки lib что значит "библиотеки"
https://github.com/MindiMakridi/filehosting/tree/master/models
не очень удалчное название так как в эту папку куча разных классов сброшена, не только модели
https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L15
строки длиннее 80 символов рекомендуется переносить
https://github.com/MindiMakridi/filehosting/blob/master/models/FilesMapper.php#L71
логичнее назвать функцию editFileComment
> $STH
> DBH
переменные и поля принято писать с маленькой буквы
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L10
> $this->rootDirectory = $root;
одинаковые вещи лучше называть одинаково
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L39
> return md5($salt1 . $cypher . $salt2);
Эта функция не добавляет ничего к токену, а лишь увеличивает его объем. На входе мы имеем комбинацию из 20 символов (20 ^ 36 вариантов, гугл говорит что это 6.87194767 × 10^46). На выходе получаем 128-битный хеш, 2^128 вариантов (2^128 = 3.40282367 × 10^38). То есть ты уменьшаешь число возможных вариантов, снижаешь стойкость ключа (хотя 2^128 тоже много), да еще и увеличиваешь длину (md5 генерирует 32 символа на выходе). Объясни-ка, с какой целью это делается?
Если сузить экран (или открыть сайт в режиме эмуляции мобильного устройства) то меню переносится на вторую строчку и смотрится как-то криво (строчки близко друг к другу, меня вываливается из своей области).
Надо бы сделать адаптивную версию, например для устройств меньше 800 по ширине. Протестировать можно в отладчике браузера, нажав иконку с смартфоном или на реальном устройстве, если оно у тебя есть. Размеры экранов: http://mydevice.io/devices/
Примеры адаптивной верстки можно нагуглить. Также, в адаптивной версии возможно стоит похимичить с размерами картинок портфолио, чтобы они занимали по ширине весь экран без полей, но не увеличивай растровые картинки.
В HTML коде нет метатега, переключающего режимы совместимости ИЕ.
Фраза digital & branding выделена у тебя ариалом, а на макете - курсивным шрифтом.
В бледно-сером блоке с 4 колонками Consectetur у тебя нет паддинга снизу, а на макете есть.
Над надписью Our Featured Works маргин у тебя намного меньше макета.
На кнопках ALL GRAPHIC ... правильный ли размер шрифта и паддинги? Что-то они у меня пикселя на 4 выше чем на макете.
Маргин под портфолио у тебя намного меньше чем на макете. зато над Get in Touch больше чем надо.
На html, body не задан основной стиль и размер шрифта (в данном случае как мне кажется, основной это шрифт которым написано Vestibulum id ligula porta euismod semper...).
> font-family: "Lato-Black"
> font-family: "Lato-Regular"
Неправильно подключен шрифт. Это одно семейство - Lato, просто с разеым весом и начертанием.
> <i class="logo-icon"></i><span class="logo-text">ebpaint
неудачно получилось, поисковик не проиндексирует настоящее название компании. Также, я думаю тут проще лого целиком сделать картинкой чем подключать шрифт ради нескольких букв.
> <i class="service-block-icon icon-android"></i>
Лишний тег, не несущий никакого смысла. Иконку можно сделать просто фоном на псевдоэлементе ::before
> data-all="All"
Не очень понятен смысл атрибута, ведь по кнопке All мы показываем все?
> data-id="Graphic"
А как работу отнести в несколько категорий? Сделай-ка лучше атрибут чтобы там через пробел или другой символ перечислялись категории (но я не знаю есть ли в ксс поддержка для разделителей кроме пробела. По моему еще дефис поддерживается).
> <span class="phone"
Сделай-ка телефон ссылкой с протоколом tel: чтобы она была кликабельна и звонибельна. А адрес - ссылкой на любой картографический сервис (например open street map, яндекс карты, гугл карты).
Также, разметь блок адреса по микроформату hcard https://yandex.ru/support/webmaster/hcard/general.xml . Микроформаты позволяют роботам извлекать информацию в понятном им виде. Проверь свою разметку валидатором, например http://hcard.geekhood.net/
> & # 64 ;
есть же & copy ;
Спрайты соц иконок вроде бы в PNG8, а не в PNG24 - почему?
Насчет эффекта при наведении на картинки портфолио - ты используешь изменение opacity, но я его уже кучу раз видел, так неинтересно, нельзя ли сделать тут немного другой эффект? Например картинки выводятся чуть более темными пока на них не наведена мышь (и по моему это реально сделать даже без ксс фильтров). Или при наведении снизу плавно выезжает название работы (его можно хранить в атрибуте, чтобы не создавать новых тегов в разметке). Подумай, можно ли тут что-то такое сделать. Может можно как-то CSS3 фильтры применить: http://habrahabr.ru/post/144852/
Если сузить экран (или открыть сайт в режиме эмуляции мобильного устройства) то меню переносится на вторую строчку и смотрится как-то криво (строчки близко друг к другу, меня вываливается из своей области).
Надо бы сделать адаптивную версию, например для устройств меньше 800 по ширине. Протестировать можно в отладчике браузера, нажав иконку с смартфоном или на реальном устройстве, если оно у тебя есть. Размеры экранов: http://mydevice.io/devices/
Примеры адаптивной верстки можно нагуглить. Также, в адаптивной версии возможно стоит похимичить с размерами картинок портфолио, чтобы они занимали по ширине весь экран без полей, но не увеличивай растровые картинки.
В HTML коде нет метатега, переключающего режимы совместимости ИЕ.
Фраза digital & branding выделена у тебя ариалом, а на макете - курсивным шрифтом.
В бледно-сером блоке с 4 колонками Consectetur у тебя нет паддинга снизу, а на макете есть.
Над надписью Our Featured Works маргин у тебя намного меньше макета.
На кнопках ALL GRAPHIC ... правильный ли размер шрифта и паддинги? Что-то они у меня пикселя на 4 выше чем на макете.
Маргин под портфолио у тебя намного меньше чем на макете. зато над Get in Touch больше чем надо.
На html, body не задан основной стиль и размер шрифта (в данном случае как мне кажется, основной это шрифт которым написано Vestibulum id ligula porta euismod semper...).
> font-family: "Lato-Black"
> font-family: "Lato-Regular"
Неправильно подключен шрифт. Это одно семейство - Lato, просто с разеым весом и начертанием.
> <i class="logo-icon"></i><span class="logo-text">ebpaint
неудачно получилось, поисковик не проиндексирует настоящее название компании. Также, я думаю тут проще лого целиком сделать картинкой чем подключать шрифт ради нескольких букв.
> <i class="service-block-icon icon-android"></i>
Лишний тег, не несущий никакого смысла. Иконку можно сделать просто фоном на псевдоэлементе ::before
> data-all="All"
Не очень понятен смысл атрибута, ведь по кнопке All мы показываем все?
> data-id="Graphic"
А как работу отнести в несколько категорий? Сделай-ка лучше атрибут чтобы там через пробел или другой символ перечислялись категории (но я не знаю есть ли в ксс поддержка для разделителей кроме пробела. По моему еще дефис поддерживается).
> <span class="phone"
Сделай-ка телефон ссылкой с протоколом tel: чтобы она была кликабельна и звонибельна. А адрес - ссылкой на любой картографический сервис (например open street map, яндекс карты, гугл карты).
Также, разметь блок адреса по микроформату hcard https://yandex.ru/support/webmaster/hcard/general.xml . Микроформаты позволяют роботам извлекать информацию в понятном им виде. Проверь свою разметку валидатором, например http://hcard.geekhood.net/
> & # 64 ;
есть же & copy ;
Спрайты соц иконок вроде бы в PNG8, а не в PNG24 - почему?
Насчет эффекта при наведении на картинки портфолио - ты используешь изменение opacity, но я его уже кучу раз видел, так неинтересно, нельзя ли сделать тут немного другой эффект? Например картинки выводятся чуть более темными пока на них не наведена мышь (и по моему это реально сделать даже без ксс фильтров). Или при наведении снизу плавно выезжает название работы (его можно хранить в атрибуте, чтобы не создавать новых тегов в разметке). Подумай, можно ли тут что-то такое сделать. Может можно как-то CSS3 фильтры применить: http://habrahabr.ru/post/144852/
> $originalamount
Надо писать $originalAmount
> if ($bills[5000] > 0) {
> if ($bills[1000] > 0) {
> if ($bills[500] > 0) {
Во-первых это копипаста, а копипаста - зло. Во-вторых, из-за этого очень сложно поменять номиналы купюр не переделывая половину кода. Надо избавиться от этих недостатков, например использовать цикл.
> if ($bills[5000] >= floor($amount / 5000)) {
> $count5000 = floor($amount / 5000);
> } else {
> $count5000 = $bills[5000];
> }
Это короче и удобнее записать через min/max
> echo "\n\nWe are temporarily unable to give you amount of money you asked.
Ты выводишь это уже после того как вывел вариант выдачи, нехорошо. Если сумму выдать нельзя, не надо выводить вариант выдачи.
Сам алгоритм (так называемый жадный алгоритм) верный и годится для указанных в задаче номиналов купюр.
https://github.com/toppestkek/Test/blob/master/data.js#L2
> function Formdata
Название похоже на объект FormData из DOM, это верный путь к ошибкам и опечаткам. Надо назвать по-другому, также, функции надо называть начиная с глагола: сделайЧтоТо.
> div.inne rHTML = '';
> div.inne rHTML += 'Заполните поле "Пароль. Пароль должен быть длиннее 6 символов."';
Лучше сделать чтобы функция возвращала результат проверки, а уже другая функция его выводила.
> data.age.value.match(/^[-\+]?\d+/
Почему разрешен отрицательный возраст? И почему разрешено вводить мусор после цифр?
Далее тут http://pastebin.ru/YE0nSJpt спам фильтр не пропускает
> $regexpSegment = array (
> '/A/u' => '[А]',
> '/a/u' => '[а]',
> '/B/u' => '[В]',
> '/C/u' => '[С]',
многовато копипасты. Попробуй-ка сделать эту замену одним выражением.
> $regexpSegmentClean = array (
> '/\\[А\\]/u' => 'А',
> '/\\[а\\]/u' => 'а',
> '/\\[В\\]/u' => 'В',
Это что-то неправильное. Зачем удалять ранее поставленные скобки? И как ты отличишь скобки в тексте от поставленных тобой?
Также, задача решена пока неверно. Твоя задача реагирует на любые английские буквы, а надо только на английские буквы внутри русских слов, то есть на ситуации когда в одном слове есть буквы из 2 алфавитов.
>>623617
> строка if($foundAnimals["Dog"]) { превратилась в if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"])
if (!empty(...))
> abstract protected function setSymbol($symbol);
По моему это неправильно. Вот как надо понимать это надпись? Я читаю ее так: "если ты наследуешь мой класс ты обязан сделать метод который принимает на вход иконку животного, то есть позволяет ее поменять". А должно быть так: "если ты наследуешь мой класс то обязан ответить какая иконка у твоего животного". То есть должен быть метод getSymbol() возвращающий иконку животного в данный момент. А поле protected $symbol; можно выпилить вообще.
>>623632
Вордпресс это движок для создания блогов и блоогоподобных сайтов, для магазина он не подходит.
>>623635
А погуглить?
>>623778
Очевидно надо прописать натсройки соединения с твоей БД чтобы он из нее брал данные либо отключить эту штуку.
>>623782
mysql это система управления базой данных. phpstorm это редактор кода. Нет, в нем нет баз данных.
>>623808
Юзерфрендли это понятие относительное. НЕдавно ставил некий софт на чистую винду и очень жалел что это не линукс где можно кучу программ поставить одной командой в консоли, а тут надо как обезьяна лазать по всяким сайтам, скачивать инсталляторы и тд.
>>623826
Задачи на вектор и кошки-мышки решил? Из учебьника в Оп посте? Они помогут с основами, а дальше читай про SOLID, изучай фреймворки и смотри как в них все сделано. Была какая-то большая книга про ООП но я ее название забыл.
> $regexpSegment = array (
> '/A/u' => '[А]',
> '/a/u' => '[а]',
> '/B/u' => '[В]',
> '/C/u' => '[С]',
многовато копипасты. Попробуй-ка сделать эту замену одним выражением.
> $regexpSegmentClean = array (
> '/\\[А\\]/u' => 'А',
> '/\\[а\\]/u' => 'а',
> '/\\[В\\]/u' => 'В',
Это что-то неправильное. Зачем удалять ранее поставленные скобки? И как ты отличишь скобки в тексте от поставленных тобой?
Также, задача решена пока неверно. Твоя задача реагирует на любые английские буквы, а надо только на английские буквы внутри русских слов, то есть на ситуации когда в одном слове есть буквы из 2 алфавитов.
>>623617
> строка if($foundAnimals["Dog"]) { превратилась в if (isset($foundAnimals["Dog"]) && $foundAnimals["Dog"])
if (!empty(...))
> abstract protected function setSymbol($symbol);
По моему это неправильно. Вот как надо понимать это надпись? Я читаю ее так: "если ты наследуешь мой класс ты обязан сделать метод который принимает на вход иконку животного, то есть позволяет ее поменять". А должно быть так: "если ты наследуешь мой класс то обязан ответить какая иконка у твоего животного". То есть должен быть метод getSymbol() возвращающий иконку животного в данный момент. А поле protected $symbol; можно выпилить вообще.
>>623632
Вордпресс это движок для создания блогов и блоогоподобных сайтов, для магазина он не подходит.
>>623635
А погуглить?
>>623778
Очевидно надо прописать натсройки соединения с твоей БД чтобы он из нее брал данные либо отключить эту штуку.
>>623782
mysql это система управления базой данных. phpstorm это редактор кода. Нет, в нем нет баз данных.
>>623808
Юзерфрендли это понятие относительное. НЕдавно ставил некий софт на чистую винду и очень жалел что это не линукс где можно кучу программ поставить одной командой в консоли, а тут надо как обезьяна лазать по всяким сайтам, скачивать инсталляторы и тд.
>>623826
Задачи на вектор и кошки-мышки решил? Из учебьника в Оп посте? Они помогут с основами, а дальше читай про SOLID, изучай фреймворки и смотри как в них все сделано. Была какая-то большая книга про ООП но я ее название забыл.
Ну давай начнем со скриншотов: https://www.browserstack.com/screenshots/6142c07ae33e5f6bb20e6fc9c2966da93984392b
Я как минимум вижу проблемы со шрифтами так как ты выбрал один формат woff который поддкрживают не все браузеры. Надо больше форматов, включая форматы для ИЕ и Сафари. На fontsquirrel есть хороший конвертер.
>>623930
Если у тебя нет времени на изучение то мы тебе вряд ли поможем. Мы можем лишь направить в нужную сторону или ответить на вопрос.
> как мне этот ответ обработать, чтобы получить ссылку на скачивание документа
Надо присылать с сервера ссылку, а на клиенте выводить ее в нужном виде.
>>623933
> нужно ли городить такие выражения $d = isset($arr['d']) ? $arr['d'] : '' если можно обойтись $d = $arr['d']
Нельзя, будет ошибка обращения к несуществуюшему элементу. Тут лучше сделать функцию которая проверяет наличие элемента в массиве.
>>624192
Нужно
>>624248
Так трудно сказать. Может браузер пережевывает яваскрипт и рисует страницу, а может что-то еще виновато. Может например он какие-то данные на диск сохраняет, а тот медленный или занят. Хорошо бы в Хроме запустить внутренний инструмент для трассировки ( chrome://tracing/ ) и попробовать разобраться в результатах.
Вообще конечно дырка огромная, подозрительно. Можешь еще глянуть диспетчером задач, кто и сколько ест процессора в процессе загрузки. Если Хром ест 100% во время паузы - значит проблема именно в обработке скачанных данных.
Также можешь выложить это на какой-нибудь хостинг - я или аноны скажут тебе сколько у них времени грузится.
Ну давай начнем со скриншотов: https://www.browserstack.com/screenshots/6142c07ae33e5f6bb20e6fc9c2966da93984392b
Я как минимум вижу проблемы со шрифтами так как ты выбрал один формат woff который поддкрживают не все браузеры. Надо больше форматов, включая форматы для ИЕ и Сафари. На fontsquirrel есть хороший конвертер.
>>623930
Если у тебя нет времени на изучение то мы тебе вряд ли поможем. Мы можем лишь направить в нужную сторону или ответить на вопрос.
> как мне этот ответ обработать, чтобы получить ссылку на скачивание документа
Надо присылать с сервера ссылку, а на клиенте выводить ее в нужном виде.
>>623933
> нужно ли городить такие выражения $d = isset($arr['d']) ? $arr['d'] : '' если можно обойтись $d = $arr['d']
Нельзя, будет ошибка обращения к несуществуюшему элементу. Тут лучше сделать функцию которая проверяет наличие элемента в массиве.
>>624192
Нужно
>>624248
Так трудно сказать. Может браузер пережевывает яваскрипт и рисует страницу, а может что-то еще виновато. Может например он какие-то данные на диск сохраняет, а тот медленный или занят. Хорошо бы в Хроме запустить внутренний инструмент для трассировки ( chrome://tracing/ ) и попробовать разобраться в результатах.
Вообще конечно дырка огромная, подозрительно. Можешь еще глянуть диспетчером задач, кто и сколько ест процессора в процессе загрузки. Если Хром ест 100% во время паузы - значит проблема именно в обработке скачанных данных.
Также можешь выложить это на какой-нибудь хостинг - я или аноны скажут тебе сколько у них времени грузится.
json является подмножеством яваскрипта. То есть любой джейсон это корректное выражение на яваскрипте. Значит какие бы данные мы не передавали, они не сломают скрипт, не будут исполнены как код. Так можно передавать и массивы, и любые строки.
А что насчет raw? Это отмена автоматического экранирования (применения функции htmlspecialchars) к выводимым данным. По стандартам ХТМЛ в теге скрипт и стайл данные интерпретируются как записаны, то есть например амперсанд пишется как амперсанд, а не & amp ; Потому требуется отменить автоэкранирование. Правда, в этом случае в данных не должно быть последовательности </скрипт, но джейсон_энкоде экранирует все слеши в виде \/ и потому защищает нас и от этого, от закрытия блока скрипт.
Заметь что это относится только к тегу скрипт/стайл. Данные в атрибутах тегов, например в онклик, надо экранировать через htmlspecialchars.
> Я бы еще понял, если бы передавались какие-то сомнительные данные из базы, полученные от пользователя, например логин или текст сообщения, где может содержаться csrf код.
Проще везде исплоьзовать один способ чем думать, надежные у нас данные или нет.
> Ну ладно, видимо это чисто ради систематичности: мы же экранируем в твиге все что нужно и не нужно, значит и здесь так же.
И хорошо, подстрахуемся на случай изменений в коде. Сегодня у нас айди из базы, а завтра он может от пользователя будет приходить.
>>624325
В твоем случае код надо написать так, чтобы нотисов не было.
>>624331
> if (!Object.create) {
Лучше вместо этого сделать свою функцию, а в ней вызывать либо Object create, либо замену. А ты понимаешь как работает функция-замена?
> if (arguments instanceof NetworkElement) {
> this._elements.push(arguments);
А если нет то что? Проигнорируем ошибку и притворимся что все верно? Почитай про принцип fail fast.
> if (this._elements instanceof Generator) {
Нехорошо это, закладывать в программу ограничение что только наследники Generator генерируют ток. Лучше просто сделать метод в элементе сети который возвращает 0 для не генерирующих сущностей. Или сделать метод отвечающий на вопрос, генерирует ли этот элеимент энергию. То же и с потребителями.
И как в твоей программе например сделать элемент который днем генерирует, а ночью потребляет ток?
> if (powerExcess === 0) {
> break;
> powerExcess -= lines.getPowerAccumulated();
А мы в минус тут не уйдем?
> PowerLine.prototype.countDailyProfit = function(powerExcess) {
> this._powerAccumulated = this._powerCapacity;
Вот это хорошая мина замедленного действия. Из названия метода можно подумать, что он просто что-то считает, а он еще и меняет внутреннее состояние объекта. И вообще это поле _powerAccumulated оно плохое, так как оно никак не привязано ко времени, например оно само не сбросится на следующий день. Да и линия передачи не копит энергию, она ее передает - тут явно несоотвествие модели и реального объекта. Это поле надо выпилить.
json является подмножеством яваскрипта. То есть любой джейсон это корректное выражение на яваскрипте. Значит какие бы данные мы не передавали, они не сломают скрипт, не будут исполнены как код. Так можно передавать и массивы, и любые строки.
А что насчет raw? Это отмена автоматического экранирования (применения функции htmlspecialchars) к выводимым данным. По стандартам ХТМЛ в теге скрипт и стайл данные интерпретируются как записаны, то есть например амперсанд пишется как амперсанд, а не & amp ; Потому требуется отменить автоэкранирование. Правда, в этом случае в данных не должно быть последовательности </скрипт, но джейсон_энкоде экранирует все слеши в виде \/ и потому защищает нас и от этого, от закрытия блока скрипт.
Заметь что это относится только к тегу скрипт/стайл. Данные в атрибутах тегов, например в онклик, надо экранировать через htmlspecialchars.
> Я бы еще понял, если бы передавались какие-то сомнительные данные из базы, полученные от пользователя, например логин или текст сообщения, где может содержаться csrf код.
Проще везде исплоьзовать один способ чем думать, надежные у нас данные или нет.
> Ну ладно, видимо это чисто ради систематичности: мы же экранируем в твиге все что нужно и не нужно, значит и здесь так же.
И хорошо, подстрахуемся на случай изменений в коде. Сегодня у нас айди из базы, а завтра он может от пользователя будет приходить.
>>624325
В твоем случае код надо написать так, чтобы нотисов не было.
>>624331
> if (!Object.create) {
Лучше вместо этого сделать свою функцию, а в ней вызывать либо Object create, либо замену. А ты понимаешь как работает функция-замена?
> if (arguments instanceof NetworkElement) {
> this._elements.push(arguments);
А если нет то что? Проигнорируем ошибку и притворимся что все верно? Почитай про принцип fail fast.
> if (this._elements instanceof Generator) {
Нехорошо это, закладывать в программу ограничение что только наследники Generator генерируют ток. Лучше просто сделать метод в элементе сети который возвращает 0 для не генерирующих сущностей. Или сделать метод отвечающий на вопрос, генерирует ли этот элеимент энергию. То же и с потребителями.
И как в твоей программе например сделать элемент который днем генерирует, а ночью потребляет ток?
> if (powerExcess === 0) {
> break;
> powerExcess -= lines.getPowerAccumulated();
А мы в минус тут не уйдем?
> PowerLine.prototype.countDailyProfit = function(powerExcess) {
> this._powerAccumulated = this._powerCapacity;
Вот это хорошая мина замедленного действия. Из названия метода можно подумать, что он просто что-то считает, а он еще и меняет внутреннее состояние объекта. И вообще это поле _powerAccumulated оно плохое, так как оно никак не привязано ко времени, например оно само не сбросится на следующий день. Да и линия передачи не копит энергию, она ее передает - тут явно несоотвествие модели и реального объекта. Это поле надо выпилить.
> function makeFirstLetterUppercase($text) {
Название функции не соответствует тому что она делает
> $text = preg_replace('/\.[\s](\w)/u', '. $1', $text);
> $text = preg_replace('/(\w)\.(\w)/u', '$1. $2', $text);
> $text = preg_replace('/(\w)\,(\w)/u', '$1, $2', $text);
> $text = preg_replace('/(\w)[\s?]\,[\s?]*(\w)/u', '$1, $2', $text);
Нельзя ли это в одну замену сделать? Можно.
> foreach ($text as $key => $value) {
Нужно другое название для value, key надо удалить если ты ее не используешь.
> $text = explode('.', $text);
$sentences = explode(....);
>>624901
Ищи бесплатный хостинг с подждержкой нужных языков.
>>624935
Живой просто был занят
>>625054
Можно но лучше бы создание каких-то сервисов вообще вынести из контроллеров. Если это большой проект то стоит использовать DI Container, например от Симфони. Если маленький - можно сделать самописный ServiceLocator.
>>625126
Почитай алгоритм обработки форм https://github.com/codedokode/pasta/blob/master/forms.md
>>625339
> не возникнет ли у меня проблем, если, например, в этом же коде, я захочу написать его как класс?
Не возникнет
> просто не понимаю почему сейчас лучше процедурно
Потому что проект очень маленький и так проще и быстрее и написать и прочитать.
> Я бы классом сделал и внедрял её статически __construct(PDO Init::$pdo).
Не понял о чем ты. В аргументе нелзя писать PDO Init::$pdo.
>>625424
Есть книги "Совершенный код", есть книга Фаулера "Шаблоны проектирования корпоративных приложений", также можно посмотреть фреймворки вроде Симфони. В вебе придумыать архитектуру незачем, в большинстве случаев есть готовое решение или принцип решения.
>>625791
> function checkText($text, $patternRus, $patternEng){
$patternRus, $patternEng никогда не меняются, лучше внести их внутрь функции и убрать из скобок. То же самое с $replacementRus, $replacementEng
Лушче бы если checkText ничего не выводил а только возвращал результат.
> $array = explode (" ", $text);
array -> words
> if (preg_match('/^([а-яё.,;?!]+)([a-z]+)/ui'
По моему непрвильная проверка на язык слова, надо провеять только язык первой найденной буквы. То есть что-то вроде ^(русская буква).
>>625846
1) начни с презентации http://lib.custis.ru/WebAppCaching (при желании можно нагуглить и запись выступления). Вообще кеширование это попытка снизить нагрузку на систему ценой расхода памяти.
Вот еще статьи: https://www.google.ru/search?q=ruhighload+%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&ie=UTF-8&gws_rd=cr&ei=KvGeVtWYEuv4ywORpKPQAQ
2) Вот так было бы неплохо для начала (информация о запросе, время, стектрейс):
[12-01-2015 12:00:00] GET /some/page
IP: 10.10.10.x.
User-Agent: googlebot/1.2
Exception: the hell broke out
Stack:
#1 SomeClass::someMethod(123, "test") at file.php:12
#2 someFunction() at index.php:13
> function makeFirstLetterUppercase($text) {
Название функции не соответствует тому что она делает
> $text = preg_replace('/\.[\s](\w)/u', '. $1', $text);
> $text = preg_replace('/(\w)\.(\w)/u', '$1. $2', $text);
> $text = preg_replace('/(\w)\,(\w)/u', '$1, $2', $text);
> $text = preg_replace('/(\w)[\s?]\,[\s?]*(\w)/u', '$1, $2', $text);
Нельзя ли это в одну замену сделать? Можно.
> foreach ($text as $key => $value) {
Нужно другое название для value, key надо удалить если ты ее не используешь.
> $text = explode('.', $text);
$sentences = explode(....);
>>624901
Ищи бесплатный хостинг с подждержкой нужных языков.
>>624935
Живой просто был занят
>>625054
Можно но лучше бы создание каких-то сервисов вообще вынести из контроллеров. Если это большой проект то стоит использовать DI Container, например от Симфони. Если маленький - можно сделать самописный ServiceLocator.
>>625126
Почитай алгоритм обработки форм https://github.com/codedokode/pasta/blob/master/forms.md
>>625339
> не возникнет ли у меня проблем, если, например, в этом же коде, я захочу написать его как класс?
Не возникнет
> просто не понимаю почему сейчас лучше процедурно
Потому что проект очень маленький и так проще и быстрее и написать и прочитать.
> Я бы классом сделал и внедрял её статически __construct(PDO Init::$pdo).
Не понял о чем ты. В аргументе нелзя писать PDO Init::$pdo.
>>625424
Есть книги "Совершенный код", есть книга Фаулера "Шаблоны проектирования корпоративных приложений", также можно посмотреть фреймворки вроде Симфони. В вебе придумыать архитектуру незачем, в большинстве случаев есть готовое решение или принцип решения.
>>625791
> function checkText($text, $patternRus, $patternEng){
$patternRus, $patternEng никогда не меняются, лучше внести их внутрь функции и убрать из скобок. То же самое с $replacementRus, $replacementEng
Лушче бы если checkText ничего не выводил а только возвращал результат.
> $array = explode (" ", $text);
array -> words
> if (preg_match('/^([а-яё.,;?!]+)([a-z]+)/ui'
По моему непрвильная проверка на язык слова, надо провеять только язык первой найденной буквы. То есть что-то вроде ^(русская буква).
>>625846
1) начни с презентации http://lib.custis.ru/WebAppCaching (при желании можно нагуглить и запись выступления). Вообще кеширование это попытка снизить нагрузку на систему ценой расхода памяти.
Вот еще статьи: https://www.google.ru/search?q=ruhighload+%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&ie=UTF-8&gws_rd=cr&ei=KvGeVtWYEuv4ywORpKPQAQ
2) Вот так было бы неплохо для начала (информация о запросе, время, стектрейс):
[12-01-2015 12:00:00] GET /some/page
IP: 10.10.10.x.
User-Agent: googlebot/1.2
Exception: the hell broke out
Stack:
#1 SomeClass::someMethod(123, "test") at file.php:12
#2 someFunction() at index.php:13
> Я хочу потом ещё кучу всяких задачек пройти и весь учебник ОПа полностью без подсказок
Зачем учебник? Ты всегда можешь попросить дополнительную задачу на какую-нибудь тему, ОП придумает.
>>626026
Код мутный, чего только это стоит
> catch (com_exception $e) {}
>>626051
Урок по теме https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>626182
> Циклы №1
Код слишком сложно записан, надо сократить и упростить.
> ( $creditBalance x $percent ) + $servicePayment
Это повторяется много рз, попробуй избавиться от повторов
Если поставть долг = 1000 http://ideone.com/q0Zljl то считает неверно (ответ 2030р).
> Циклы №2
>$newAmount = ( $amountM = $percent );
Это 2 отдельных команды, надо писать в 2 строки.
Считает верно.
> или вот так
> $newAmount = ( $amountM $percent );
> $amountM = $newAmount;
Почему бы сразу в amountM и не класть результат? И кстати что значит M? Неудачное название.
>>626189
Я не слышал про такой паттерн. Алсо где гарантия что в массиве реквест есть нужный ключ?
>>626194
Погугли, есть сайты
>>626220
> function makeFirstLetterUppercase($text, $regexpCut, $bigRegexp, $bigReplacement)
Тут $regexpCut, $bigRegexp, $bigReplacement явно не аргументы, а постоянные значения, значит они не дложны быть в скобках, а просто внутри функции определены.
> [\\.!?\\.\\.\\.]
Что это значит? От того что ты точку вписал 4 раза ничего не меняется. Кваждратные скобки значт "любой из символов"
Название переменной это существительное, а не глагол $cutTheText -> $sentences
findTheFirstLetters -> firstLetter
upTheFirstLetters -> firstLetter или head (голова)
countAllTheLetters -> letterCount
cutTheLittleFirstLetters -> tail (хвост)
theRightSentence -> correctSentence
implodeOnlyRightSentences -> text, result
Голова и хвост - традиционные названия для таких вещей.
> as $keys => $sentence
Если не исплоьзуешь keys то не надо ее писать
> $findTheFirstLetters = mb_substr($sentence, 0, 1);
замену первой буквы на большую в строке стоит вынести в отдельную функцию, а то у тебя большая простыня кода получается
> mb_substr($sentence, 1, $countAllTheLetters);
Можно просто mb_substr($sentence, 1), глянь мануал по этой функции
> mb_strlen($text, "UTF-8");
кодировку не надо указывать если ты задал mb_internal_encoding
> (\\.|!|\\?|\\.\\.\\.)
Тут проще написать "один или более идущих подряд любых знаков препинания". Также непонятно зачем для запятой сделана отдельная регулярка.
Это решение пока что не годится и требует доработки.
> Я хочу потом ещё кучу всяких задачек пройти и весь учебник ОПа полностью без подсказок
Зачем учебник? Ты всегда можешь попросить дополнительную задачу на какую-нибудь тему, ОП придумает.
>>626026
Код мутный, чего только это стоит
> catch (com_exception $e) {}
>>626051
Урок по теме https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>626182
> Циклы №1
Код слишком сложно записан, надо сократить и упростить.
> ( $creditBalance x $percent ) + $servicePayment
Это повторяется много рз, попробуй избавиться от повторов
Если поставть долг = 1000 http://ideone.com/q0Zljl то считает неверно (ответ 2030р).
> Циклы №2
>$newAmount = ( $amountM = $percent );
Это 2 отдельных команды, надо писать в 2 строки.
Считает верно.
> или вот так
> $newAmount = ( $amountM $percent );
> $amountM = $newAmount;
Почему бы сразу в amountM и не класть результат? И кстати что значит M? Неудачное название.
>>626189
Я не слышал про такой паттерн. Алсо где гарантия что в массиве реквест есть нужный ключ?
>>626194
Погугли, есть сайты
>>626220
> function makeFirstLetterUppercase($text, $regexpCut, $bigRegexp, $bigReplacement)
Тут $regexpCut, $bigRegexp, $bigReplacement явно не аргументы, а постоянные значения, значит они не дложны быть в скобках, а просто внутри функции определены.
> [\\.!?\\.\\.\\.]
Что это значит? От того что ты точку вписал 4 раза ничего не меняется. Кваждратные скобки значт "любой из символов"
Название переменной это существительное, а не глагол $cutTheText -> $sentences
findTheFirstLetters -> firstLetter
upTheFirstLetters -> firstLetter или head (голова)
countAllTheLetters -> letterCount
cutTheLittleFirstLetters -> tail (хвост)
theRightSentence -> correctSentence
implodeOnlyRightSentences -> text, result
Голова и хвост - традиционные названия для таких вещей.
> as $keys => $sentence
Если не исплоьзуешь keys то не надо ее писать
> $findTheFirstLetters = mb_substr($sentence, 0, 1);
замену первой буквы на большую в строке стоит вынести в отдельную функцию, а то у тебя большая простыня кода получается
> mb_substr($sentence, 1, $countAllTheLetters);
Можно просто mb_substr($sentence, 1), глянь мануал по этой функции
> mb_strlen($text, "UTF-8");
кодировку не надо указывать если ты задал mb_internal_encoding
> (\\.|!|\\?|\\.\\.\\.)
Тут проще написать "один или более идущих подряд любых знаков препинания". Также непонятно зачем для запятой сделана отдельная регулярка.
Это решение пока что не годится и требует доработки.
Так он получил за сайт 3 млн?
>>626254
Да, про 16 лет это верно
>>626334
> про клавишу "Shift";
> '/([а-яёa-z]+)\\s([.,;:!?])\\s([а-яёa-z]+)/ui'
Сложновато, я думаю лучше записать просто "знак препинания, за которым идет буква"
> [.]\\s|\\A
А где гарантия что там ровно 1 пробел?
В остальном верно.
> 2) про Йоду.
> $yodaText = [];
лишняя строка
В общем, верно.
> Тут я не сохранял знаки препинания внутри предложений, решил, что так подразумевалось (глянул в примере, что их нет).
Да, можно не сохранять
>>626339
Пусть пишет, он еще учится.
>>626347
Длинные комментарии лучше сверху
>>626380
Надо вынести авторизацию на отдельный УРЛ, например /login
>>626394
> редирект обратно на ту страницу, с которой был запрос.
При этом не забывайте проверять что эта страница на вашем сайте, а не на чужом
>>626472
Либо \n либо переходи на шаблоны
>>626515
Потому что она для этого и предназначена
>>626617
Отвечаю: код мутный
Так он получил за сайт 3 млн?
>>626254
Да, про 16 лет это верно
>>626334
> про клавишу "Shift";
> '/([а-яёa-z]+)\\s([.,;:!?])\\s([а-яёa-z]+)/ui'
Сложновато, я думаю лучше записать просто "знак препинания, за которым идет буква"
> [.]\\s|\\A
А где гарантия что там ровно 1 пробел?
В остальном верно.
> 2) про Йоду.
> $yodaText = [];
лишняя строка
В общем, верно.
> Тут я не сохранял знаки препинания внутри предложений, решил, что так подразумевалось (глянул в примере, что их нет).
Да, можно не сохранять
>>626339
Пусть пишет, он еще учится.
>>626347
Длинные комментарии лучше сверху
>>626380
Надо вынести авторизацию на отдельный УРЛ, например /login
>>626394
> редирект обратно на ту страницу, с которой был запрос.
При этом не забывайте проверять что эта страница на вашем сайте, а не на чужом
>>626472
Либо \n либо переходи на шаблоны
>>626515
Потому что она для этого и предназначена
>>626617
Отвечаю: код мутный
Лучше не делать эхо прямо в функции, а возвращать из нее результат. Надо писать общую сумму выплат по кредиту. В минус уходить не надо. Вместо фор лучше использовать форыч.
>>626683
Сделано верно, если хочешь можешь еще сделать через свитч или массив.
>>627207
Для аяксовых форм - блокировать кнопку отправки свойством disabled на время обработки. В твоем случае надо просто при втором клике отменять текущую анимацию, у джейквери есть метод для этого, забыл название.
>>627411
Так как старого кода я не вижу то сказать в чем дело не могу. Может ты просто опечатался и знак какой-то пропустил?
>>627490
Перевод строки это и есть либо символ \n либо 2 символа \r\n в зависимости от настроек редактора и операционной системы.
То есть
$a = "1
2";
$b = "1\n2";
это одинаковые строки если в редакторе конец строки кодируется с помощью \n
>>627500
Это работает только с консольными командами, выводящими данные в виде текста. ДА, можно брать результат и делать с ним что хочешь. В этом и сила командной строки.
>>627655
Ты молодец что помогаешь другим анонам.
>>627732
А ты гит изучил? Если нет, почитай git book для начала.
Лучше не делать эхо прямо в функции, а возвращать из нее результат. Надо писать общую сумму выплат по кредиту. В минус уходить не надо. Вместо фор лучше использовать форыч.
>>626683
Сделано верно, если хочешь можешь еще сделать через свитч или массив.
>>627207
Для аяксовых форм - блокировать кнопку отправки свойством disabled на время обработки. В твоем случае надо просто при втором клике отменять текущую анимацию, у джейквери есть метод для этого, забыл название.
>>627411
Так как старого кода я не вижу то сказать в чем дело не могу. Может ты просто опечатался и знак какой-то пропустил?
>>627490
Перевод строки это и есть либо символ \n либо 2 символа \r\n в зависимости от настроек редактора и операционной системы.
То есть
$a = "1
2";
$b = "1\n2";
это одинаковые строки если в редакторе конец строки кодируется с помощью \n
>>627500
Это работает только с консольными командами, выводящими данные в виде текста. ДА, можно брать результат и делать с ним что хочешь. В этом и сила командной строки.
>>627655
Ты молодец что помогаешь другим анонам.
>>627732
А ты гит изучил? Если нет, почитай git book для начала.
Для айпишников наверно незачем таблицу делать.
>>628119
Это делается через создание анонимного пользователя при первом лайке. При регистрации анонимный пользователь просто получает логин и пароль.
>>628125
На идеоне неудобно писать больше 20 строк. В ОП посте есть уроки по установке апача и пхп, и поставь себе редактор или ИДЕ. Саблайм текст и нотепад++ оба очень легкие и работают даже на слабом железе.
>>628281
> var fn = [].shift.apply(arguments);
arguments это не настоящий массив и не переменная, а псевдопеременная. Не стоит ее менять, только читай из нее. fn лучше указать в скобках.
Ошибки у тебя есть. Например если в arguments много аргуменитов, а в args мало (названия кстати не очень удачные, лучше inner/outer наверно) то лиишние аргументы из arguments должны идти в конец списка, а у тебя не идут:
partialAny(fn, 1)(2, 3, 4, 5) -> fn(1, 2, 3, 4, 5)
Не пишите здесь больше.
Ответы на посты с 18 по 20 января будут здесь сегодня или завтра. ответы на посты по 17 января идут выше. Если вас пропустили - напомните о себе в новом треде.
Этот тред закрыт.
Если пропустил - напомните в новом треде.
К делу:
Есть один сайт, как пример прbведу этот https://csgofast.com/. Я хочу его рипнуть и поставить к себе на хост с одной целью, но мне нужно что бы с этого сайта https://csgofast.com/ парсилась инфа "топ игроков, история" и т.п, ко мне на сайт, точнее на мой рип/шаблон.
Молю о помощи
Это копия, сохраненная 2 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.