Это копия, сохраненная 24 января 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>411701
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Есть еще у нас задачки на HTML, JS, MySQL.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее. ОП обычно занят, но где-то раз в сутки в треде появляется.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Мануал по PHP — http://www.php.net/manual/ru/langref.php
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
HTML/CSS: Путь верстальщика: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Не поздно ли в мои 40 становиться программистом? Ох, это будет сложно, но если ты покажешь лучшие знания, чем моложежь, то шансы есть.
Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 2 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.
В общем, давайте начинать уже!
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли дуракодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.
Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):
- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...
Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.
Как видишь, c IDE жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Подробнее: https://gist.github.com/codedokode/8759492
Умоляю простите за нубский вопрос.
Но что состбвенно скачать, и как установить, И САМОЕ ГЛАВНОЕ ЗАПУСТИТЬ этот php. КАК?????
вот код:
<form action="" method="post" enctype="multipart/form-data">
<p>Изображения:
<input type="file" name="pictures[]" />
<input type="submit" value="Отправить" />
</p>
</form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "D:\\photo\\$name");
}
}
?>
как сделать чтобы записывалось в несколько папок сразу, а не только в D:\\photo\\$name? я пробовал присвоить массив файлс в другой и провести этот же код с копией, но почему-то не работает.
Ты читал мануал по move_uploaded_file и по загрузке файлов? Я подозреваю, что нет, так как иначе ты бы не пытался скопировать код. Потому иди и прочитай мануал сначала:
http://php.net/manual/ru/function.move-uploaded-file.php
http://php.net/manual/ru/features.file-upload.post-method.php
Копировать FILES нет никакого смысла, так как там не хранится файл, а только его имя и расположение.
После того, как прочтешь, если у тебя есть какие-то вопросы (или если у тебя появится идея как сделать то, что ты хочешь), можешь их задавать.
>>417030
У тебя MySQL пишет
> 5 warnings
Логично прочитать их с помощью SHOW WARNINGS;
> Алсо, как символы табуляции ставить не пойму?
По идее клаившей Tab но в редакторе может быть стоит опция заменять таб на несколько пробелов. Я думаю. в твоем случае дело не в этом.
Проверить, таб или пробел там можно выделив текст, они обозначаются по-разному, таб стрелочкой.
Я бы советовал другой разделитель так как таб на вид очень трудно отличить от пробела и ты получишь кучу возни с ним.
В твоем случае виноват может быть невидимый символ \r который перемещает курсор в начало строки (и затирает то, что было до этого напечатано). Чтобы от него избавиться выбери Line Endings -> Unix вместо Windows. В Windows конец строки помечается 2 символами\r\n.
Ты читал мануал по move_uploaded_file и по загрузке файлов? Я подозреваю, что нет, так как иначе ты бы не пытался скопировать код. Потому иди и прочитай мануал сначала:
http://php.net/manual/ru/function.move-uploaded-file.php
http://php.net/manual/ru/features.file-upload.post-method.php
Копировать FILES нет никакого смысла, так как там не хранится файл, а только его имя и расположение.
После того, как прочтешь, если у тебя есть какие-то вопросы (или если у тебя появится идея как сделать то, что ты хочешь), можешь их задавать.
>>417030
У тебя MySQL пишет
> 5 warnings
Логично прочитать их с помощью SHOW WARNINGS;
> Алсо, как символы табуляции ставить не пойму?
По идее клаившей Tab но в редакторе может быть стоит опция заменять таб на несколько пробелов. Я думаю. в твоем случае дело не в этом.
Проверить, таб или пробел там можно выделив текст, они обозначаются по-разному, таб стрелочкой.
Я бы советовал другой разделитель так как таб на вид очень трудно отличить от пробела и ты получишь кучу возни с ним.
В твоем случае виноват может быть невидимый символ \r который перемещает курсор в начало строки (и затирает то, что было до этого напечатано). Чтобы от него избавиться выбери Line Endings -> Unix вместо Windows. В Windows конец строки помечается 2 символами\r\n.
Оп, в первой задаче на регулярки, что про телефонный номер, надо решить только регуляркой? Или можно и функции php использовать?
У тебя там внизу
> PHP Notice: Undefined variable: palindrom in /home/cT2Ryf/prog.php on line 20
Ты обращаешься к не созданной переменной. Надо это исправить. Программа с ошибками никак не может быть праивльной.
>>417024
Все правильно
>>417023
Если тебе захочется установить еще Апач, вот помощь: https://gist.github.com/codedokode/10774100
Если ты не знаешь что такое командная строка: https://gist.github.com/codedokode/10539568
ну вообще это задача на регулярки, но если у тебя есть другие варианты, показывай, давай посмотрим.
>Ты обращаешься к не созданной переменной. Надо это исправить. Программа с ошибками никак не может быть праивльной.
Готово:http://ideone.com/TjdOOy
ага, спасибо большое. значит скопирую его куда-то с помощью move_uploaded_file, а уже оттуда размножу его по разным директориям с помощью copy.
Да, как вариант.
>>417050
Эту задачу надо бы проверить на примерах телефонов.
Вот список номеров:
Правильные: 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' // нет +
);
Можешь их подставить на сайт (если он это позволяет) или сделать программу, которая их переберет и проверит что они правильно распознаются.
Пиши что знаешь. Работодатель все равно будет проверять твои знания скорее всего. И ссылки можешь добавить на гитхаб.
Так я и не знаю толком ничего. Я же и иду за еду работать. Или знания уровня чем отличается абстрактный класс от интерфейса? Ссылку на гитхаб разумеется приклею.
Я, в смысле, о том, что я не могу написать, что знаю php, и что не знаю. У меня слов совсем не хватает что-то.
Блджад, ты идешь работать пхп-макакой, логично, что ты должен написать в знаниях о пхп (даже если это не совсем так) иначе нахуя ты им нужен?
Ну вот свой код я понимаю, а вот попросят меня чужой код объяснить и хз даже. Хотя вроде когда сталкивался более-менее понимал. Вот js другое дело, там я даже свой код сразу понять не могу, вырвиглазный такой. Вообще я просто не могу найти нужные слова.
Тут чувак за еду устроился после задачки о банкомате(!!!), а ты очкуешь со своими знаниями.
Прям так и говорят? Тупо.
> держи нашу любимую задачу про 2 шарика (не один взвод суровых хаскеллистов сложил на ней свои кости):
> Есть 2 абсолютно одинаковых стеклянных шарика и многоэтажный дом. Ты можешь ходить по дому и сбрасывать шарики с любого этажа. Вопрос, как определить высоту, с которой начинают разбиваться шарики, за минимальное число попыток я кстати не смог найти самое оптимальное решение
> Учти, что тебе могут попасться 2 одинаковых хрупких шарика, которые разобьются на первом же этаже, так и 2 шарика из кобальтового стекла, которые пробивают асфальт на полметра, а сами не бьются. Задача — найти оптимальный порядок бросания шаров.
Ебусь в глаза, не могу найти где прикрутить сайт в резюме, чет я совсем аутист.
Опять эта хуита. Пыхопарашники, вам самим не надоело есть это говно? Есть же хороший, годный язык haskell\erlang\сишка. Нахуя вы учите эту парашу? Непонимат.
Нужно сделать что-то типа страницы модерации. Суть: на странице 1.php пользователь добавляет записи. на странице 2.php админ смотрит все добавленные записи и нажимая кнопку, изменяет значение поля Р c 0 до 1.
На странице 3.php выводятся записи со значение 1 в поле Р.
Так вот, как реализовать это изменение значение поля по нажатию кнопки?
Если через php, то, наверное, проще через GET. Ставишь на кнопку ссылку с гет переменной, а в скрипте проверяешь, если есть - то выводишь в поле 1 (для input аттрибут value)
ввод:
<?php
$name=mb_strtolower(($_POST['name']), 'utf-8');
$value= mb_strtolower(($_POST['value']), 'utf-8');
mysql_query("INSERT INTO films (name, value) VALUES ('$name', '$value')");
?>
вывод:
$result = mysql_query("SELECT FROM films ORDER BY num ;");
while($film_result = mysql_fetch_array($result))
{
echo ("$film_result[name] ") ;
echo "  -   " ;
echo "$film_result[value] <br>" ;
}
Добавь скрытый инпут с айдишниками, по нажатию кнопки делай запрос на апдейт по этим самым айдишникам.
Спасибо. Вопрос решен.
Вот, держите: https://gist.github.com/codedokode/8733007
Может кто-то хочет сделать? Если вы делали файлообменник, то это может быть ваша вторая задача.
Еще, напомню, тут был один анон, который хотел дальше что-то изучать: >>415362
> Привет, ОП, привет падаваны. Я давно здесь не появлялся в общем-то с полгода как устроился на работу. До этого прошел учебник опа, запилил файлообменник , арканоид и бложик. Пока хикковал было время учиться и процесс обучения шел довольно быстро, но работая с 10 до 19 (хуёвый график) ничего не успеваю теперь и чувствую что не развиваюсь, ну а если и развиваюсь то очень медленно. Но со следующей недели иду в двухнедельный отпуск и хочу посвятить всё это время какому-нибудь проекту и выучить при этом что-нибудь годное и востребованное на рынке труда (yii? ) Потому как мне остопиздел этот битрикс и клепание второсортных сайтиков и дебагинг этой параши. Тащемта зачем пишу, я уже пробовал пилить штуки в одинокого но никогда не работал над чем-то в команде. Мне было бы интересно с другим аноном попробовать запилить что-нибудь. Я вот думаю, мы могли бы с кем-нибудь объединиться, Оп, бы нам придумал задачку (или мы бы сами придумали). Заодно потренировались бы использовать коллаборативный аспект гита и гитхаба (все эти бранчи мёрджи и пул реквесты) а не просто гит адд гит коммит гит пуш, как мы умеем уже. Что думаете, есть тут такие кому интересно?
Вот, что я могу предложить от себя:
- сделать клон Youtube: можно загружать, смотреть видео, писать комменты. Придется повозиться с конвертацией видео в нужный формат, подбором настроек кодировкания, ffmpeg/mencoder, gearman. Делать разумеется на фреймворке Yii1, 2 или Symfony 2
- изучить тестирование и что-нибудь потестировать:
https://gist.github.com/codedokode/a455bde7d0748c0a351a
http://habrahabr.ru/company/yandex/blog/245869/ (пост от яндекса про тестирование и еще что-то)
- написать плагин чтобы тестовый фреймворк codeception поддерживал Slim (требуется изучить codeception)
- может изучить что-нибудь из серии backbone/knockout/angular и поучиться писать SPA (Single page Application) на яваскрипт. Но для этого надо хорошо знать сам яваскрипт.
- может ты не очень хорошо знаешь HTML/CSS и хочешь на них задания порешать?
- изучить яваскриптовый Audio API и написать генератор всяких звуков (если ты в этой теме хоть немного разбираешься)
- сделать борду (верстка: https://github.com/codedokode/board-markup ) на фреймворке, там еще с оптмизацией наверно придется повозиться
- огромное задание на TestHub (выше) которое ты вряд ли успеешь сделать
- сложное задание: есть такая популярная ORM Doctrine 2, она довольно сложно устроена. Если ты в ней создаешь десятки тысяч сущностей и пытаешься их сохранить в БД, она может тупить минутами (по моим расчетам, это слишком много) и ест память. Кто бы поковырялся в ней профайлером и оптимизировал этот процесс? И заодно снизить потребление памяти. Но учти, что доктрину разрабатывает крупная компания, и если бы все было так просто они бы сами давно все оптимизировали.
- есть такой пакетный менеджер как композер. Он в ходе обновления/установки пакетов ест память как не в себя и долго думает. кто бы это оптимизировал? Учти, что сам разработчик знает об этой проблеме и пишет что он пока не придумал что делать, так как алгоритм сложный.
Насчет участия в open source, что я тебе советовал. Наверно имеет смысл улучшать те продукты, которые ты сам используешь. Если тебе в них ничего не хочется улучшить или исправить, то ничего пока делать и не надо.
Ну и еще, ты бы мог сделать (и может выложить в open source) что-то для своей работы. Может, тебе приходится какие-то рутинные правки делать в CSS и это можно автоматизировать. Может можно автоматизировать работу с картинками. Может, можно написать бота который будет обходить страницы сайта и искать ошибки. В общем, это тоже вариант, уменьшить объем рутины.
Вот, держите: https://gist.github.com/codedokode/8733007
Может кто-то хочет сделать? Если вы делали файлообменник, то это может быть ваша вторая задача.
Еще, напомню, тут был один анон, который хотел дальше что-то изучать: >>415362
> Привет, ОП, привет падаваны. Я давно здесь не появлялся в общем-то с полгода как устроился на работу. До этого прошел учебник опа, запилил файлообменник , арканоид и бложик. Пока хикковал было время учиться и процесс обучения шел довольно быстро, но работая с 10 до 19 (хуёвый график) ничего не успеваю теперь и чувствую что не развиваюсь, ну а если и развиваюсь то очень медленно. Но со следующей недели иду в двухнедельный отпуск и хочу посвятить всё это время какому-нибудь проекту и выучить при этом что-нибудь годное и востребованное на рынке труда (yii? ) Потому как мне остопиздел этот битрикс и клепание второсортных сайтиков и дебагинг этой параши. Тащемта зачем пишу, я уже пробовал пилить штуки в одинокого но никогда не работал над чем-то в команде. Мне было бы интересно с другим аноном попробовать запилить что-нибудь. Я вот думаю, мы могли бы с кем-нибудь объединиться, Оп, бы нам придумал задачку (или мы бы сами придумали). Заодно потренировались бы использовать коллаборативный аспект гита и гитхаба (все эти бранчи мёрджи и пул реквесты) а не просто гит адд гит коммит гит пуш, как мы умеем уже. Что думаете, есть тут такие кому интересно?
Вот, что я могу предложить от себя:
- сделать клон Youtube: можно загружать, смотреть видео, писать комменты. Придется повозиться с конвертацией видео в нужный формат, подбором настроек кодировкания, ffmpeg/mencoder, gearman. Делать разумеется на фреймворке Yii1, 2 или Symfony 2
- изучить тестирование и что-нибудь потестировать:
https://gist.github.com/codedokode/a455bde7d0748c0a351a
http://habrahabr.ru/company/yandex/blog/245869/ (пост от яндекса про тестирование и еще что-то)
- написать плагин чтобы тестовый фреймворк codeception поддерживал Slim (требуется изучить codeception)
- может изучить что-нибудь из серии backbone/knockout/angular и поучиться писать SPA (Single page Application) на яваскрипт. Но для этого надо хорошо знать сам яваскрипт.
- может ты не очень хорошо знаешь HTML/CSS и хочешь на них задания порешать?
- изучить яваскриптовый Audio API и написать генератор всяких звуков (если ты в этой теме хоть немного разбираешься)
- сделать борду (верстка: https://github.com/codedokode/board-markup ) на фреймворке, там еще с оптмизацией наверно придется повозиться
- огромное задание на TestHub (выше) которое ты вряд ли успеешь сделать
- сложное задание: есть такая популярная ORM Doctrine 2, она довольно сложно устроена. Если ты в ней создаешь десятки тысяч сущностей и пытаешься их сохранить в БД, она может тупить минутами (по моим расчетам, это слишком много) и ест память. Кто бы поковырялся в ней профайлером и оптимизировал этот процесс? И заодно снизить потребление памяти. Но учти, что доктрину разрабатывает крупная компания, и если бы все было так просто они бы сами давно все оптимизировали.
- есть такой пакетный менеджер как композер. Он в ходе обновления/установки пакетов ест память как не в себя и долго думает. кто бы это оптимизировал? Учти, что сам разработчик знает об этой проблеме и пишет что он пока не придумал что делать, так как алгоритм сложный.
Насчет участия в open source, что я тебе советовал. Наверно имеет смысл улучшать те продукты, которые ты сам используешь. Если тебе в них ничего не хочется улучшить или исправить, то ничего пока делать и не надо.
Ну и еще, ты бы мог сделать (и может выложить в open source) что-то для своей работы. Может, тебе приходится какие-то рутинные правки делать в CSS и это можно автоматизировать. Может можно автоматизировать работу с картинками. Может, можно написать бота который будет обходить страницы сайта и искать ошибки. В общем, это тоже вариант, уменьшить объем рутины.
Вот еще, что я вспомнил:
- кто-то предлагал сделать онлайн-редактор для одновременного редактирования файлов с кодом в несколько рук
- битва роботов: участники пишут алгоритмы для управления роботами и они сражаются.
- огромные крестики-нолики где надо поставить 5 знаков в ряд, с возможностью играть онлайн
Переменные названы ужасно. Вот как я угадаю, что ты обозначаешь буква i, x, y? Надо называть переменные понятно, вроде level, total, и тд.
> if ($n <= $y) {
> $i -= 2;
> }
не очень понятно, зачем это. Нельзя ли как-то поменять начальные значения переменных, чтобы того же добиться?
Так, считает вроде верно.
>>417079
Ой, как все запутанно. Не, это нехорошее решение по моему. И плохо соответствует принципам ООП.
> try/catch
Ты по моему не пониамешь как используются исключения. try и throw не должны быть на одном уровне. Вот у меня есть урок про исключения в php, почитай: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> e.msg = "неверный размер";
Это неправльно вообще. И делать console.log из конструктора незачем — непойманные исключения и так пишутся в консоль
> if (size == "big") {
Надо использовать константы, а не строки
> this.calorificValue = 40;
> this.cost = 100;
Незачем делать «цену» и «число калорий» свойством гамбургера так как их всегда можно рассчитать зная тип и начинку с помощью метода. Раз так. то хранить их незачем. Ведь в твоем варианте если поменять тип гамбургера, цена не пересчитается, а с методом - пересчитается.
> this.filling.push(....
> this.countPrice( );
А зачем вызывать countPrice? Пусть ее пользователь вызывает когда хочет узнать цену.
Нет никакой защиты от добавления одной добавки несколько раз.
Переменные названы ужасно. Вот как я угадаю, что ты обозначаешь буква i, x, y? Надо называть переменные понятно, вроде level, total, и тд.
> if ($n <= $y) {
> $i -= 2;
> }
не очень понятно, зачем это. Нельзя ли как-то поменять начальные значения переменных, чтобы того же добиться?
Так, считает вроде верно.
>>417079
Ой, как все запутанно. Не, это нехорошее решение по моему. И плохо соответствует принципам ООП.
> try/catch
Ты по моему не пониамешь как используются исключения. try и throw не должны быть на одном уровне. Вот у меня есть урок про исключения в php, почитай: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> e.msg = "неверный размер";
Это неправльно вообще. И делать console.log из конструктора незачем — непойманные исключения и так пишутся в консоль
> if (size == "big") {
Надо использовать константы, а не строки
> this.calorificValue = 40;
> this.cost = 100;
Незачем делать «цену» и «число калорий» свойством гамбургера так как их всегда можно рассчитать зная тип и начинку с помощью метода. Раз так. то хранить их незачем. Ведь в твоем варианте если поменять тип гамбургера, цена не пересчитается, а с методом - пересчитается.
> this.filling.push(....
> this.countPrice( );
А зачем вызывать countPrice? Пусть ее пользователь вызывает когда хочет узнать цену.
Нет никакой защиты от добавления одной добавки несколько раз.
Там наверно есть поле для ввода произвольных данных или можно загрузить свое резюме. Я сам на hh никогда ничего не пуьликовал так что не знаю.
>>417150
Нет, не делайте так. GET/HEAD запрос должен только получать информацию и ничего не менять. Такие запросы могут слать:
- поисковики
- твой браузер чтобы предзарузить страницу
- антивирус чтобы проверить нет ли вируса по ссылке
Изменения должны делаться POST запрсоом, либо отправкой формы, либо аяксом.
>>417152
Я всегда комментирую код, и тут не могу пройти мимо. Тут много ошибок и уязвимостей.
> mysql_query
Имей в виду, что этот код устарел. Лет так на 10. Сейчас для работы с БД используют расширение PDO
> VALUES ('$name', '$value')");
Никогда не вставляй данные прямо в запрос, это SQL инъекция. Используй плейсхолдеры и PDO: http://habrahabr.ru/post/137664/
> "$film_result[value] <br>" ;
Не смешивай HTML и PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Ну и плюс тут XSS затесалась, вот урок по ней: https://gist.github.com/anonymous/52adda0113428b274c64
В общем, не пиши как ты пишешь.
Там наверно есть поле для ввода произвольных данных или можно загрузить свое резюме. Я сам на hh никогда ничего не пуьликовал так что не знаю.
>>417150
Нет, не делайте так. GET/HEAD запрос должен только получать информацию и ничего не менять. Такие запросы могут слать:
- поисковики
- твой браузер чтобы предзарузить страницу
- антивирус чтобы проверить нет ли вируса по ссылке
Изменения должны делаться POST запрсоом, либо отправкой формы, либо аяксом.
>>417152
Я всегда комментирую код, и тут не могу пройти мимо. Тут много ошибок и уязвимостей.
> mysql_query
Имей в виду, что этот код устарел. Лет так на 10. Сейчас для работы с БД используют расширение PDO
> VALUES ('$name', '$value')");
Никогда не вставляй данные прямо в запрос, это SQL инъекция. Используй плейсхолдеры и PDO: http://habrahabr.ru/post/137664/
> "$film_result[value] <br>" ;
Не смешивай HTML и PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Ну и плюс тут XSS затесалась, вот урок по ней: https://gist.github.com/anonymous/52adda0113428b274c64
В общем, не пиши как ты пишешь.
Заполнятор
Как известно, многие сайты хотят от нас регистрацию, чтобы что-то сделать (скачать файл например или увидеть ссылку) или получить какой-то плюс. Но заполнять руками формы долго и неинтересно, плюс потом в почту тебе сыплется спам. Наш сервис решает эту проблему так:
В браузер устанавливается расширение. Когда требуется зарегистрироваться на сайте, ты жмешь кнопку на панели браузера, и Заполнятор находит ссылку на регистрацию, открывает ее в новой вкладке, заполняет все поля (включая email зарегистрированный на сервисе временной почты и пароль), и если в форме нет капчи, даже пытается ее отправить. После чего заходит в почту и если там есть ссылка, переходит по ней чтобы подтвердить аккаунт.
Заполнятор запоминает пароль (и сохраняет его на свой сайт) и в следующий раз ты можешь нажать его и залогиниться на сайт автоматически.
Для решения требуется уметь писать расширения для браузера, то есть знать HTML/CSS/JS.
Да, я и сам ее критиковал, а когда еще пара анонов нелестно отозвались, решил что лучше убрать. Там код кривой, уязвимости, функции mysql и прочий ужас.
>Это объект библиотеки Underscore, которая содержит функции для работы с коллекциями
>объект-солянка из методов?
Я угадал!
>Жду версию с начинкой и приправой
http://jsbin.com/huxapohabe/1/edit?js,console
>И плохо соответствует принципам ООП
Почему?
>Надо использовать константы, а не строки
Почему?
>А зачем вызывать countPrice?
Ну я вызвал просто чтобы показать что оно работает.
>Нет никакой защиты от добавления одной добавки несколько раз.
В условии задачи об этом речи и не идет.
Остальное понял, перепилю.
Сори за названия переменных.
Вот ещё попробовал сделать задачку на круговой текст: http://ideone.com/y2kp7b
Не знаю только почему не заполняется полностью круг, а лишь 80-85% дуги. В браузере получше выглядит чем в идеван.
Недавно была похожая задача.
Помог этот гайд: http://css-tricks.com/centering-css-complete-guide/
Я бы сделал абсолютное позиционирование по центру + transition(-50%, 50%). При этом элемент может иметь произвольный размер, ставишь в процентах, что нужно.
спасибо, друг.
margin: 0, auto
чтобы узнать размеры экрана - screen.width screen.height, ну а там посчитать можно.
Это давно было, сейчас процесс установки немного другой, но возможность установить с чего угодно, хоть с утюга, хоть с Аллаха, никуда не пропала. Читай Gentoo Handbook, там всё расписано до мельчайших деталей.
Хотя бы называй переменный английскими словами
>>И плохо соответствует принципам ООП
> Почему?
Потому, что цена/калории в данном случае не являютя свойством объекта, а вычисляются из имеющихся. И потому что исключения неправльно используются. Если исправить, то может быть начнет соответствовать.
>>Надо использовать константы, а не строки
> Почему?
Потому, что константы делают код понятнее, а магические строки/числа — запутаннее.
Hamburger.SIZE_BIG — понятно что речь идет о размере гамбургера. Понятно, какие размеры в принципе бывают (можно посмотреть на список констант).
'big' — менее понятно, что это. Может размер, а может название какое-нибудь. Само по себе оно ничего не говорит. Более того, в одном месте оно может означать размер гамбургера, а в другом например что-то еще. В случае констант — это будет 2 разных константы.
Вот еще объяснение на английском: http://stackoverflow.com/a/4351110
Ну и вообще, в таких случаях, когда ты обозначаешь тип чего-то, принятно использовать константы.
> Ну я вызвал просто чтобы показать что оно работает.
Это хорошо, но ты его скопипастил раз 8. Чтобы показать что оно работает, можно написать его где-то отдельно, а не в самом классе.
> В условии задачи об этом речи и не идет.
Ну как же?
> Код должен быть защищен от ошибок. Представь, что твоим классом будет пользоваться другой программист. Если он передает неправильный тип гамбургера, например, или неправильный вид добавки, должно выбрасываться исключение (ошибка не должна молча игнорироваться).
Естественно, попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса. Да и сам подумай, какой код лучше — который говорит об ошибке или который молча делает неправильно действие?
>>И плохо соответствует принципам ООП
> Почему?
Потому, что цена/калории в данном случае не являютя свойством объекта, а вычисляются из имеющихся. И потому что исключения неправльно используются. Если исправить, то может быть начнет соответствовать.
>>Надо использовать константы, а не строки
> Почему?
Потому, что константы делают код понятнее, а магические строки/числа — запутаннее.
Hamburger.SIZE_BIG — понятно что речь идет о размере гамбургера. Понятно, какие размеры в принципе бывают (можно посмотреть на список констант).
'big' — менее понятно, что это. Может размер, а может название какое-нибудь. Само по себе оно ничего не говорит. Более того, в одном месте оно может означать размер гамбургера, а в другом например что-то еще. В случае констант — это будет 2 разных константы.
Вот еще объяснение на английском: http://stackoverflow.com/a/4351110
Ну и вообще, в таких случаях, когда ты обозначаешь тип чего-то, принятно использовать константы.
> Ну я вызвал просто чтобы показать что оно работает.
Это хорошо, но ты его скопипастил раз 8. Чтобы показать что оно работает, можно написать его где-то отдельно, а не в самом классе.
> В условии задачи об этом речи и не идет.
Ну как же?
> Код должен быть защищен от ошибок. Представь, что твоим классом будет пользоваться другой программист. Если он передает неправильный тип гамбургера, например, или неправильный вид добавки, должно выбрасываться исключение (ошибка не должна молча игнорироваться).
Естественно, попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса. Да и сам подумай, какой код лучше — который говорит об ошибке или который молча делает неправильно действие?
Черных рамок на картинке нет
У тебя ширина текста жестко зафиксирована и равна 230px а он должен тянуться и занимать свободное место.
Вот примеры резиновых лейаутов:
http://blog.html.it/layoutgala/
http://alistapart.com/article/holygrail
http://chikuyonok.ru/2009/06/float-columns/
http://chikuyonok.ru/2010/01/liquid-site-markup/
> ul {
> list-style-type: none;
Этим ты удаляешь точки у всех списков на странице, включая например списки в тексте. А надо удалять только у меню.
> font-family: "Trebuchet MS";
Надо писать в конце списка шрифтов стандартный шрифт: http://htmlbook.ru/css/font-family
> font-size: 20px;
Когда задаешь font-size надо переопределять line-height
Меню выглядит не как на картинке: не тот цвет, нет подчеркивания, пункты прижаты слишком тесно.
Заголовок должен быть нежирным шрифтом
Черных рамок на картинке нет
У тебя ширина текста жестко зафиксирована и равна 230px а он должен тянуться и занимать свободное место.
Вот примеры резиновых лейаутов:
http://blog.html.it/layoutgala/
http://alistapart.com/article/holygrail
http://chikuyonok.ru/2009/06/float-columns/
http://chikuyonok.ru/2010/01/liquid-site-markup/
> ul {
> list-style-type: none;
Этим ты удаляешь точки у всех списков на странице, включая например списки в тексте. А надо удалять только у меню.
> font-family: "Trebuchet MS";
Надо писать в конце списка шрифтов стандартный шрифт: http://htmlbook.ru/css/font-family
> font-size: 20px;
Когда задаешь font-size надо переопределять line-height
Меню выглядит не как на картинке: не тот цвет, нет подчеркивания, пункты прижаты слишком тесно.
Заголовок должен быть нежирным шрифтом
> function indexOf(
> return undefined;
Обычно такая функция возвращает -1 так как undefined легко спутать с 0 при сравнени через ==
> function Hamburger(type, stuff) {
Не проверяется правильность stuff
> if (this.ADDS_PROPS[additiveName] === undefined) {
Исплоьзуй оператор in
> if (indexOf(additiveName, this.adds) === undefined) {
Если такая добавка уже есть то лучше выкинуть исключение
> } catch (e) {
try|catch по моему лишний так как ошибки и так по умолчанию идут в консоль
Так, в остальном верно.
>>417321
Это не тупой вопрос. Такие вещи в CSS сделать не так просто, и надо исхоитряться (плюс многое зависит от того каие браузеры тебе надо поддерживать).
Достаточно просто центрирвать жлемент с помощью fixed позиционирования, но оно может работать странно на мобильных устройствах, а если контент слишком большой то прокруткой ты до него не доберешься.
Также, можно использовать таблицу (не в html, а в css display: table) растянутую на 100%.
Также, можно попробовать абсолютное позиционирование.
2 последних способа поддерживают прокрутку если контент больше высоты экрана.
> и ещё чтобы размер его уменьшался в зависимости от размера экрана. т.е на большом экране он больше, на маленьком -- меньше.
В 99% это смотрится глупо, имей в виду. Большой экран покупают чтобы на него помещалось больше информации.
>>417324
> $corner = number_format(360 / $len, 2);
number_format предназаначен для преобразования числа в строку. Для округления есть round, floor, ceil
В строках 15-25 какие-то лишние циклы по моему. Что мешает сразу строку разбить на буквы?
> почему не заполняется полностью круг
Потому что ты зачем-то все пробелы вырезал, а длину строки брал с пробелами
> foreach ($v as $val) {
Это можно заменить на implode
Насчет переменных, если плохо знаешь английский просто испоьзуй slovari.yandex.ru или google translate.
Круг не круглый, так как надо домножать не на 2, а на чуть больший коэффициент.
> function indexOf(
> return undefined;
Обычно такая функция возвращает -1 так как undefined легко спутать с 0 при сравнени через ==
> function Hamburger(type, stuff) {
Не проверяется правильность stuff
> if (this.ADDS_PROPS[additiveName] === undefined) {
Исплоьзуй оператор in
> if (indexOf(additiveName, this.adds) === undefined) {
Если такая добавка уже есть то лучше выкинуть исключение
> } catch (e) {
try|catch по моему лишний так как ошибки и так по умолчанию идут в консоль
Так, в остальном верно.
>>417321
Это не тупой вопрос. Такие вещи в CSS сделать не так просто, и надо исхоитряться (плюс многое зависит от того каие браузеры тебе надо поддерживать).
Достаточно просто центрирвать жлемент с помощью fixed позиционирования, но оно может работать странно на мобильных устройствах, а если контент слишком большой то прокруткой ты до него не доберешься.
Также, можно использовать таблицу (не в html, а в css display: table) растянутую на 100%.
Также, можно попробовать абсолютное позиционирование.
2 последних способа поддерживают прокрутку если контент больше высоты экрана.
> и ещё чтобы размер его уменьшался в зависимости от размера экрана. т.е на большом экране он больше, на маленьком -- меньше.
В 99% это смотрится глупо, имей в виду. Большой экран покупают чтобы на него помещалось больше информации.
>>417324
> $corner = number_format(360 / $len, 2);
number_format предназаначен для преобразования числа в строку. Для округления есть round, floor, ceil
В строках 15-25 какие-то лишние циклы по моему. Что мешает сразу строку разбить на буквы?
> почему не заполняется полностью круг
Потому что ты зачем-то все пробелы вырезал, а длину строки брал с пробелами
> foreach ($v as $val) {
Это можно заменить на implode
Насчет переменных, если плохо знаешь английский просто испоьзуй slovari.yandex.ru или google translate.
Круг не круглый, так как надо домножать не на 2, а на чуть больший коэффициент.
Если у тебя элемент шире чем полэкрана появится линейка прокрутки. Надо позиционировать не левым краем по центру, а правым, чтобы он уезжал за левый край и не появлялась прокрутка.
>>417333
4 уровня отступов в учебной задаче???? надо упростить.
------------
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
-----------
> if (variable === undefined) {
Чтобы проверить наличие элемента в объекте есть оператор in. Что за костыли? И почему у нас в массиве не может храниться undefined? Конечно, может, от этого он псевдомассивом быть не перестанет.
> arrayLike = false;
Тут незачем продолжать цикл
> if (toString.call
А где определение toString?
В остальном, верно.
>>417335
Зачем яваскрипт тащить? На CSS делается
Неприавльно проверять размеры экрана так как размер окна браузера с ними не совпадает.
>>417367
Потому что я пока не структурировал, некогда.
Если у тебя элемент шире чем полэкрана появится линейка прокрутки. Надо позиционировать не левым краем по центру, а правым, чтобы он уезжал за левый край и не появлялась прокрутка.
>>417333
4 уровня отступов в учебной задаче???? надо упростить.
------------
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
-----------
> if (variable === undefined) {
Чтобы проверить наличие элемента в объекте есть оператор in. Что за костыли? И почему у нас в массиве не может храниться undefined? Конечно, может, от этого он псевдомассивом быть не перестанет.
> arrayLike = false;
Тут незачем продолжать цикл
> if (toString.call
А где определение toString?
В остальном, верно.
>>417335
Зачем яваскрипт тащить? На CSS делается
Неприавльно проверять размеры экрана так как размер окна браузера с ними не совпадает.
>>417367
Потому что я пока не структурировал, некогда.
http://jsbin.com/zexicomehu/1/edit
>А где определение toString?
Эм, а оно нужно? Работает ведь. Я так понимаю, оно есть где-то в базовом объекте.
15
> if (!typeof(object) === "object") {
!==
> for (var field in object) {
Надежнее проверять еще свойства через hasOwnproperty, а то скоипируешь заодно все методы с прототипа
В остальном, верно
16
Не работает для массива: http://jsbin.com/sobejitivu/1/edit?console,output
>>417397
ну про задачу о рюкзаке отдельная страница: http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5
А так, надо читать книжки по алгоритмам и по решению олимпиадных заадч.
Вот тут что-то есть http://algolist.manual.ru/olimp/
http://www.intuit.ru/studies/courses/2293/593/info
Книги вроде такой
> Решение сложных и олимпиадных задач по программированию. Долинский М.С.
У меня тоже где-то валялась книжечка с примерами разных задач и опсанием алгоритмов.
В общем гугли по словам «алгоритмы», «олимпиадные задачи по программированию», «разбор задач по программированию».
Если есть какие-то вопросы, задавай.
Порешать задачки можно на codeforces.
15
> if (!typeof(object) === "object") {
!==
> for (var field in object) {
Надежнее проверять еще свойства через hasOwnproperty, а то скоипируешь заодно все методы с прототипа
В остальном, верно
16
Не работает для массива: http://jsbin.com/sobejitivu/1/edit?console,output
>>417397
ну про задачу о рюкзаке отдельная страница: http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5
А так, надо читать книжки по алгоритмам и по решению олимпиадных заадч.
Вот тут что-то есть http://algolist.manual.ru/olimp/
http://www.intuit.ru/studies/courses/2293/593/info
Книги вроде такой
> Решение сложных и олимпиадных задач по программированию. Долинский М.С.
У меня тоже где-то валялась книжечка с примерами разных задач и опсанием алгоритмов.
В общем гугли по словам «алгоритмы», «олимпиадные задачи по программированию», «разбор задач по программированию».
Если есть какие-то вопросы, задавай.
Порешать задачки можно на codeforces.
>>417432
Оно где-то в коде jsbin и делать программу зависимой от jsbin непраивльно.
> if (!(type === "object")) {
!==
> if (variable.length >= 0) {
Этот if можно перевернуть и еще уменьшить отступ. Плюс, условие «length >= 0» лучше бы дополнить проверкой что свойство существует.
Так я в опере проверяю своей.
И да
http://jsbin.com/litifokawa/1/edit?js,console
Теперь и с массивами объектов!
>Плюс, условие «length >= 0» лучше бы дополнить проверкой что свойство существует.
Если его нет, то вернет undefined, что при сравнении с нулем должно дать false, Не?
http://jsfiddle.net/02Lfe87c/
Чет не помогли мне твои ссылки, я их полистал, сделал как в четвертой, но почему-то так вышло. Реквестирую помощь.
Куки?
Перезапроси страницу гетом, после обработки формы.
есть, например, 10 пользователей, которым выдали пароль. Есть таблица с именами этих пользователей и их паролями. Есть еще одна таблица, в которой хранятся данные, и user_id. Пользователи вводят данные в один инпут, и пароль в другой. после этого должно отображаться $user ввел $text. Я могу вывести все данные, которые вводились, могу вывести так $user_id ввел $text. А нужно чтобы $user ввел $text. Короче, как соотнести user_id из одной таблицы с user из другой?
Да.
Я бы на твоем месте пошел читать про join. А затем решать здешние задачки по sql.
Да, про join обязательно почитаю, спасибо. Но свою проблему я решил без этого.
В двух словах - встроенный класс для работы с базами данных.
http://php.net/manual/ru/book.pdo.php
Заодно https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a почитай.
Спасибо, завтра почитаю.
http://jsbin.com/wecedejota/1/edit?html,js,output
Код немного в хаосе.
Уже есть
Нет, я еще в универ хожу. Как сейчас. Да и за js задачами я мало сижу, он мне не нравится.
Видимо не напряжный у тебя универ, лол
Надо ставить SET NAMES cp866 в MySQL так как в консоли рабоатет именно 866 кодировка.
Для таблиц надо ставить utf8 (именно так. без дефиса). 1251 советую вообще закопать подальше.
Всё это читал, везде всё стоит utf8 в my.cnf, не помогло нисколько.
SET NAMES cp866 ввел? Если нет то плохо читал.
Виндовая консоль не умеет utf8, только в архаичные кодировки вроде cp866
Да ты здесь больше всех быдлокодеров пишешь.
Ох, что же у меня столько опечаток-то в двух предложениях.
<span class="tag-date"><span class="tag">Теги:<span class="tag-list"><a href="#">тег-1</a>, <a href="#">тег-2</a>, <a href="#">тег-3</a></span></span><span class="date">Дата Поста</span></span>
Вот такой спан стоит под записью в бложике. Находится он в диве с это записью. Для записи заданы размеры. Мне нужно подвинуть Дату Поста вправо что-бы находилась она в правой стороне записи. Как это сделать?
Вот само задание : https://gist.github.com/anonymous/1ebcc8f7a3c8047b7d1a
Кто сможет сделать с комментариями за разумную цену?
обещал сделать другой человек, он не смог
есть еще неделя в запасе, завтра предпоследняя пара, такие дела.
Спасибо!
Задачка-то хуйня. Знал бы php, сделал бы за тортик.
Сам попробуй. Недели более чем достаточно.
приклеилась
> Так я в опере проверяю своей.
Хорошо, тогда объясни откуда эта функция взялась в глобальной области видимости. В стандарте яваскрипта такой глобальной функции нет и в описании свойств window тоже нет: https://developer.mozilla.org/en-US/docs/Web/API/Window
>>417437
Это верно, но эту особенность надо знать. Я например не знал. А значит и другие программисты могут не знать. Лучше писать код, не полагающийся на такие тонкости и явно проверять наличие свойства.
>>417447
По моему ты нагородил свойства без всякой логики. Зачем там относительное позиционирование?
Насчет подсказки, вот: http://softwaremaniacs.org/blog/2005/12/01/css-layout-float/
Там есть примеры.
Вот еще дополнительно пояснение про отрицательные маргины на флоатах: https://gist.github.com/codedokode/3f6063edf0a2227eb313
>>417448
Редиректи после обработки формы
>>417472
Я не могу пройти мимо. Код ужасен. Так писать нельзя.
Нельзя вставлять переменнеы прямо в SQL код надо использовать плейсхолдеры иначе получается либо sql инъекция либо просто быдлокод. Вот полезная статья: http://habrahabr.ru/post/137664/
Также, mysql функции устарели, переходи на PDO.
Ну и не надо в одном файле смешивать HTML и PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html
> Так я в опере проверяю своей.
Хорошо, тогда объясни откуда эта функция взялась в глобальной области видимости. В стандарте яваскрипта такой глобальной функции нет и в описании свойств window тоже нет: https://developer.mozilla.org/en-US/docs/Web/API/Window
>>417437
Это верно, но эту особенность надо знать. Я например не знал. А значит и другие программисты могут не знать. Лучше писать код, не полагающийся на такие тонкости и явно проверять наличие свойства.
>>417447
По моему ты нагородил свойства без всякой логики. Зачем там относительное позиционирование?
Насчет подсказки, вот: http://softwaremaniacs.org/blog/2005/12/01/css-layout-float/
Там есть примеры.
Вот еще дополнительно пояснение про отрицательные маргины на флоатах: https://gist.github.com/codedokode/3f6063edf0a2227eb313
>>417448
Редиректи после обработки формы
>>417472
Я не могу пройти мимо. Код ужасен. Так писать нельзя.
Нельзя вставлять переменнеы прямо в SQL код надо использовать плейсхолдеры иначе получается либо sql инъекция либо просто быдлокод. Вот полезная статья: http://habrahabr.ru/post/137664/
Также, mysql функции устарели, переходи на PDO.
Ну и не надо в одном файле смешивать HTML и PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Тебе праивльно советуют, пользователя надо искать не по паролю, а по паре логин/пароль.
Также, ты делаешь запросы в цикле. Это неэффективно и вообще плохо. Надо использовать джойн тут.
У меня есть хорошие задчки и ссылки для изучения: https://gist.github.com/codedokode/10539213
>>417495
> if (event.button === 1) {
Я не вижу где определеяется переменная event
У тебя из-за этого ошибка
> "ReferenceError: event is not defined (line 119)"
Ты это читал? Почитай.
http://learn.javascript.ru/events
И разумеется не надо вкладывать функции в функции, это только создает бардак. И конечно с ООП все может получиться аккуратнее.
Ну и если сложно сразу сделать, сделай сначала задачу на поле с клеточками. Почему ты берешься за сапера когда предыдущую не решил? (ну или я ее не видел, но я думаю что ты ее проскочил, а зря).
>>417672
У меня если что есть очень полезные задачки по HTML/CSS и ссылочки: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
>>417730
У меня есть урок по ООП http://archive-ipq-co.narod.ru/l1/pasta.html
Тебе праивльно советуют, пользователя надо искать не по паролю, а по паре логин/пароль.
Также, ты делаешь запросы в цикле. Это неэффективно и вообще плохо. Надо использовать джойн тут.
У меня есть хорошие задчки и ссылки для изучения: https://gist.github.com/codedokode/10539213
>>417495
> if (event.button === 1) {
Я не вижу где определеяется переменная event
У тебя из-за этого ошибка
> "ReferenceError: event is not defined (line 119)"
Ты это читал? Почитай.
http://learn.javascript.ru/events
И разумеется не надо вкладывать функции в функции, это только создает бардак. И конечно с ООП все может получиться аккуратнее.
Ну и если сложно сразу сделать, сделай сначала задачу на поле с клеточками. Почему ты берешься за сапера когда предыдущую не решил? (ну или я ее не видел, но я думаю что ты ее проскочил, а зря).
>>417672
У меня если что есть очень полезные задачки по HTML/CSS и ссылочки: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
>>417730
У меня есть урок по ООП http://archive-ipq-co.narod.ru/l1/pasta.html
Наиболее последняя версия доккументации http://stuff.cebe.cc/yii2docs/guide-README.html .
Есть перевод на русский https://github.com/yiisoft/yii2/tree/master/docs/guide-ru , но если можешь, то читай английскую версию.
Вообще, читай что там написано сверху вниз.
>Потому, что цена/калории в данном случае не являютя свойством объекта, а вычисляются из имеющихся. И потому что исключения неправльно используются. Если исправить, то может быть начнет соответствовать.
Хорошо, в этом есть логика.
>Естественно, попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.
Почему?
sql-ex.ru
Да, нормально. Вероятно ты не это ожидал увидеть, а то что выводит SELECT FROM students;
Бля, там звездочка между SELECT и FROM
Я проверил, у меня то же самое - ширина колонок считается неправильно под Windows с cp866 (под linux c utf8 проблем нет).
По видимому клиент (это та программа которую ты запускаешь в командной строке), когда считает ширину, думает что русские буквы нулевой ширины. Я гуглил на обоих языках, но ничего найти не смог. А в исходники клиента я лезть поленился.
Один из варианто решения использовать в конце запроса не ; а \G который выводит результат вертикально (это удобно при работе с большими таблицами):
mysql> SELECT 'тест' AS field1, 'Проверка' as f2\G
field1: тест
f2: Проверка
Писать SET NAMES необяхательно, можно в my.ini в разделе client прописать нужную кодировку: http://gahcep.github.io/blog/2013/01/05/mysql-utf8/
>>417805
Посмотри ссылки отсюда, например: https://gist.github.com/codedokode/10539213
Там есть хороший гайд по MySQL для начинабщих + учебник Пирамидина по языку SQL. Оптимизации там нет, так как это отдельная тема, и про нее можно погуглить по словам «индексы», «EXPLAIN», «тюнинг».
Оптимизация заключается в нескольких вещах:
- запросы: использование индексов, уменьшение объема выбираемых данных и числа строк которые надо обойти
- алгоритмы: изменение структуры БД, денормализация ради облегчения получения нужных данных
- тюинг: настройка выделяемой памяти на разные структуы и буфера, настройка кеширования, настройка уровня изоляции транзакций и переиодичности сброса данных на диск
Вот например:
- http://habrahabr.ru/post/211022/
- http://habrahabr.ru/post/31129/
- http://www.mysql.ru/docs/man/MySQL_indexes.html
- http://habrahabr.ru/post/154167/
Я проверил, у меня то же самое - ширина колонок считается неправильно под Windows с cp866 (под linux c utf8 проблем нет).
По видимому клиент (это та программа которую ты запускаешь в командной строке), когда считает ширину, думает что русские буквы нулевой ширины. Я гуглил на обоих языках, но ничего найти не смог. А в исходники клиента я лезть поленился.
Один из варианто решения использовать в конце запроса не ; а \G который выводит результат вертикально (это удобно при работе с большими таблицами):
mysql> SELECT 'тест' AS field1, 'Проверка' as f2\G
field1: тест
f2: Проверка
Писать SET NAMES необяхательно, можно в my.ini в разделе client прописать нужную кодировку: http://gahcep.github.io/blog/2013/01/05/mysql-utf8/
>>417805
Посмотри ссылки отсюда, например: https://gist.github.com/codedokode/10539213
Там есть хороший гайд по MySQL для начинабщих + учебник Пирамидина по языку SQL. Оптимизации там нет, так как это отдельная тема, и про нее можно погуглить по словам «индексы», «EXPLAIN», «тюнинг».
Оптимизация заключается в нескольких вещах:
- запросы: использование индексов, уменьшение объема выбираемых данных и числа строк которые надо обойти
- алгоритмы: изменение структуры БД, денормализация ради облегчения получения нужных данных
- тюинг: настройка выделяемой памяти на разные структуы и буфера, настройка кеширования, настройка уровня изоляции транзакций и переиодичности сброса данных на диск
Вот например:
- http://habrahabr.ru/post/211022/
- http://habrahabr.ru/post/31129/
- http://www.mysql.ru/docs/man/MySQL_indexes.html
- http://habrahabr.ru/post/154167/
>>417580
> for ($k = 0; $k <= $len 4; $k++) {
> $screen[$i][$k] = ' ';
Этот цикл можно заменить на array_fill. Второй цикл, кстати, тоже.
> ?>
> <?php
Не очень понятно зачем они тут
В остальном, хорошо.
>>417752
А в задаче все понятно? Вайрфреймы страниц посмотрел?
Я думаю, для начала можно сделать создание теста и прохождение теста, без пользователей. После этого написать браузерные тесты для этих страниц.
Начать наверно стоит с модели. Спроектируй таблицы для хранения теста и вопросов, добавь SQL код как миграцию, сделай на их основе модели в Yii (там есть генератор, если что, но может тебе лучше их руками писать). После этого попробуй сделать страницу создания теста, пока без регистрации, пользователей и всего прочего. Для создания страницы нужен контроллер и HTML-шаблон.
В качестве шаблонизатора крайне рекомендую twig.
Устанавливать все стоит через композер — ты с ним работал?
Ну и как можно скорее все на гитхаб заливай, чтобы можно было проверить.
Там нужен скорее всего яваскрипт, чтобы переключать типы вопросов, добавлять их — ты его знаешь? jQuery умеешь пользоваться?
Если что задавай вопросы.
Гайд, который дал анон ниже, вполне хорош, но на английском, ты как с ним?
>>417762
А почему доки не на официальном сайте? А так, спасибо за ссылки, особенно на перевод.
>>417796
В шаблонах обычно находится только HTML код с редкими вставками переменных или вызовов функций:
<h1><?= html($title) ?></h1>
<p>Имя: <?= html($name) ?></p>
Потому проблемы о которой ты говоришь, нет. PHP код с логикой не должен быть в шаблоне, а должен быть в php-файле, примерно так:
index.php
--------
(логика на php)
require 'templates/index.phtml';
templates/index.phtml
-------------
(html-шаблон для отображанения данных)
То есть в одном файле логика в другом шаблон для отображения. По моему, удобно. Если тебе кажется что нет, покажи код, посмотрим.
>>417580
> for ($k = 0; $k <= $len 4; $k++) {
> $screen[$i][$k] = ' ';
Этот цикл можно заменить на array_fill. Второй цикл, кстати, тоже.
> ?>
> <?php
Не очень понятно зачем они тут
В остальном, хорошо.
>>417752
А в задаче все понятно? Вайрфреймы страниц посмотрел?
Я думаю, для начала можно сделать создание теста и прохождение теста, без пользователей. После этого написать браузерные тесты для этих страниц.
Начать наверно стоит с модели. Спроектируй таблицы для хранения теста и вопросов, добавь SQL код как миграцию, сделай на их основе модели в Yii (там есть генератор, если что, но может тебе лучше их руками писать). После этого попробуй сделать страницу создания теста, пока без регистрации, пользователей и всего прочего. Для создания страницы нужен контроллер и HTML-шаблон.
В качестве шаблонизатора крайне рекомендую twig.
Устанавливать все стоит через композер — ты с ним работал?
Ну и как можно скорее все на гитхаб заливай, чтобы можно было проверить.
Там нужен скорее всего яваскрипт, чтобы переключать типы вопросов, добавлять их — ты его знаешь? jQuery умеешь пользоваться?
Если что задавай вопросы.
Гайд, который дал анон ниже, вполне хорош, но на английском, ты как с ним?
>>417762
А почему доки не на официальном сайте? А так, спасибо за ссылки, особенно на перевод.
>>417796
В шаблонах обычно находится только HTML код с редкими вставками переменных или вызовов функций:
<h1><?= html($title) ?></h1>
<p>Имя: <?= html($name) ?></p>
Потому проблемы о которой ты говоришь, нет. PHP код с логикой не должен быть в шаблоне, а должен быть в php-файле, примерно так:
index.php
--------
(логика на php)
require 'templates/index.phtml';
templates/index.phtml
-------------
(html-шаблон для отображанения данных)
То есть в одном файле логика в другом шаблон для отображения. По моему, удобно. Если тебе кажется что нет, покажи код, посмотрим.
>Начать наверно стоит с модели.
Вот это я и хотел узнать.
>там есть генератор, если что, но может тебе лучше их руками писать
Определенно руками.
>В качестве шаблонизатора крайне рекомендую twig.
Можно в двух словах в чем его функция?
>Устанавливать все стоит через композер — ты с ним работал?
Да, я там uppu.ru пытался делать.
>Гайд, который дал анон ниже, вполне хорош, но на английском, ты как с ним?
Думаю, что достаточно для чтения документации.
Я тебе еще советую решить 3 задачи по моей ссылке. Для начинающего они полезны. А потом, если тебе этого будет мало, позанимаемся оптимизиацией запросов на таблицах из миллионов строк (на маленьких неинтересно).
>>417809
Кстати чтобы посмотреть структуру таблицы иногда удобнее писать SHOW CREATE TABLE students\G
>>417800
Ты правильно делаешь, что задаешь вопросы. Я ведь мог и напутать что-то.
>> попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.
> Почему?
Потому что по условиям задачи
> Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).
Но 2 раза полить майонезом или приправой нельзя. Каждую добавку можно добавить только один раз. И при попытке добавить ее во второй раз логично указать программисту что он делает ошибку, а не игнорировать ее. Ведь может быть программист опечатался или что-то перепутал и он рад будет сразу получить информацию что что-то не так, чем обнаружить ошибку позже.
Вообще, лучше на любое подозрительное действие выдавать ошибку, а не игнорировать. Это называется принцип fail fast: http://habrahabr.ru/post/218325/
Это делает твой код более надежным.
Я замечу, что многие старые функции в php (а также всякие сишные API, например Windows API) работают по принципу Forgive, то есть прощают ошибки, выдавая предупреждение и продолжая работать. На мой взгляд, это плохо и способствует написанию менее качественного кода.
>>417797
Ох, надо подумать. Backbone — фреймворк, предоставляющий роутер и модели для написания SPA, правда он не предаставляет шаблонизатор, и надо подключать сторонний, вроде mustache или knockout.
У меня была мысль сделать задачку на SPA, но она не до конца оформилась. Идея сделать какое-то приложение с таблицами и формами, которыми можно добавлять данные, и чтобы все это могло синхронизироваться с сервером (тут сразу же возникают задачи загрузки/выгрузки данных, инкрементальных изменений, блокировок, конфликтов), а также работать в офлайне. Может блокнот для заметок? Приложение для рисования вайрфреймов? Или приложение для оформления страховки на машину? Приложение для офлайн-тестирования для сайта TestHub? Я к чему-то такому склоняюсь, тут много интересных вещей которые можно изучить. Может, на этой неделе соберусь с силами и напишу.
Такие задачки, кстати, придумывать не так просто, надо рыться в документации, искать разные плагины и библиотеки, прикидывать, сложно ли это будет сделать, и т.д. Но она конечно нужна тем, кто хочет хорошо разбираться в фронтенде.
Я тебе еще советую решить 3 задачи по моей ссылке. Для начинающего они полезны. А потом, если тебе этого будет мало, позанимаемся оптимизиацией запросов на таблицах из миллионов строк (на маленьких неинтересно).
>>417809
Кстати чтобы посмотреть структуру таблицы иногда удобнее писать SHOW CREATE TABLE students\G
>>417800
Ты правильно делаешь, что задаешь вопросы. Я ведь мог и напутать что-то.
>> попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.
> Почему?
Потому что по условиям задачи
> Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).
Но 2 раза полить майонезом или приправой нельзя. Каждую добавку можно добавить только один раз. И при попытке добавить ее во второй раз логично указать программисту что он делает ошибку, а не игнорировать ее. Ведь может быть программист опечатался или что-то перепутал и он рад будет сразу получить информацию что что-то не так, чем обнаружить ошибку позже.
Вообще, лучше на любое подозрительное действие выдавать ошибку, а не игнорировать. Это называется принцип fail fast: http://habrahabr.ru/post/218325/
Это делает твой код более надежным.
Я замечу, что многие старые функции в php (а также всякие сишные API, например Windows API) работают по принципу Forgive, то есть прощают ошибки, выдавая предупреждение и продолжая работать. На мой взгляд, это плохо и способствует написанию менее качественного кода.
>>417797
Ох, надо подумать. Backbone — фреймворк, предоставляющий роутер и модели для написания SPA, правда он не предаставляет шаблонизатор, и надо подключать сторонний, вроде mustache или knockout.
У меня была мысль сделать задачку на SPA, но она не до конца оформилась. Идея сделать какое-то приложение с таблицами и формами, которыми можно добавлять данные, и чтобы все это могло синхронизироваться с сервером (тут сразу же возникают задачи загрузки/выгрузки данных, инкрементальных изменений, блокировок, конфликтов), а также работать в офлайне. Может блокнот для заметок? Приложение для рисования вайрфреймов? Или приложение для оформления страховки на машину? Приложение для офлайн-тестирования для сайта TestHub? Я к чему-то такому склоняюсь, тут много интересных вещей которые можно изучить. Может, на этой неделе соберусь с силами и напишу.
Такие задачки, кстати, придумывать не так просто, надо рыться в документации, искать разные плагины и библиотеки, прикидывать, сложно ли это будет сделать, и т.д. Но она конечно нужна тем, кто хочет хорошо разбираться в фронтенде.
Я тебе еще советую решить 3 задачи по моей ссылке. Для начинающего они полезны. А потом, если тебе этого будет мало, позанимаемся оптимизиацией запросов на таблицах из миллионов строк (на маленьких неинтересно).
>>417809
Кстати чтобы посмотреть структуру таблицы иногда удобнее писать SHOW CREATE TABLE students\G
>>417800
Ты правильно делаешь, что задаешь вопросы. Я ведь мог и напутать что-то.
>> попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.
> Почему?
Потому что по условиям задачи
> Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).
Но 2 раза полить майонезом или приправой нельзя. Каждую добавку можно добавить только один раз. И при попытке добавить ее во второй раз логично указать программисту что он делает ошибку, а не игнорировать ее. Ведь может быть программист опечатался или что-то перепутал и он рад будет сразу получить информацию что что-то не так, чем обнаружить ошибку позже.
Вообще, лучше на любое подозрительное действие выдавать ошибку, а не игнорировать. Это называется принцип fail fast: http://habrahabr.ru/post/218325/
Это делает твой код более надежным.
Я замечу, что многие старые функции в php (а также всякие сишные API, например Windows API) работают по принципу Forgive, то есть прощают ошибки, выдавая предупреждение и продолжая работать. На мой взгляд, это плохо и способствует написанию менее качественного кода.
>>417797
Ох, надо подумать. Backbone — фреймворк, предоставляющий роутер и модели для написания SPA, правда он не предаставляет шаблонизатор, и надо подключать сторонний, вроде mustache или knockout.
У меня была мысль сделать задачку на SPA, но она не до конца оформилась. Идея сделать какое-то приложение с таблицами и формами, которыми можно добавлять данные, и чтобы все это могло синхронизироваться с сервером (тут сразу же возникают задачи загрузки/выгрузки данных, инкрементальных изменений, блокировок, конфликтов), а также работать в офлайне. Может блокнот для заметок? Приложение для рисования вайрфреймов? Или приложение для оформления страховки на машину? Приложение для офлайн-тестирования для сайта TestHub? Я к чему-то такому склоняюсь, тут много интересных вещей которые можно изучить. Может, на этой неделе соберусь с силами и напишу.
Такие задачки, кстати, придумывать не так просто, надо рыться в документации, искать разные плагины и библиотеки, прикидывать, сложно ли это будет сделать, и т.д. Но она конечно нужна тем, кто хочет хорошо разбираться в фронтенде.
Я тебе еще советую решить 3 задачи по моей ссылке. Для начинающего они полезны. А потом, если тебе этого будет мало, позанимаемся оптимизиацией запросов на таблицах из миллионов строк (на маленьких неинтересно).
>>417809
Кстати чтобы посмотреть структуру таблицы иногда удобнее писать SHOW CREATE TABLE students\G
>>417800
Ты правильно делаешь, что задаешь вопросы. Я ведь мог и напутать что-то.
>> попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.
> Почему?
Потому что по условиям задачи
> Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).
Но 2 раза полить майонезом или приправой нельзя. Каждую добавку можно добавить только один раз. И при попытке добавить ее во второй раз логично указать программисту что он делает ошибку, а не игнорировать ее. Ведь может быть программист опечатался или что-то перепутал и он рад будет сразу получить информацию что что-то не так, чем обнаружить ошибку позже.
Вообще, лучше на любое подозрительное действие выдавать ошибку, а не игнорировать. Это называется принцип fail fast: http://habrahabr.ru/post/218325/
Это делает твой код более надежным.
Я замечу, что многие старые функции в php (а также всякие сишные API, например Windows API) работают по принципу Forgive, то есть прощают ошибки, выдавая предупреждение и продолжая работать. На мой взгляд, это плохо и способствует написанию менее качественного кода.
>>417797
Ох, надо подумать. Backbone — фреймворк, предоставляющий роутер и модели для написания SPA, правда он не предаставляет шаблонизатор, и надо подключать сторонний, вроде mustache или knockout.
У меня была мысль сделать задачку на SPA, но она не до конца оформилась. Идея сделать какое-то приложение с таблицами и формами, которыми можно добавлять данные, и чтобы все это могло синхронизироваться с сервером (тут сразу же возникают задачи загрузки/выгрузки данных, инкрементальных изменений, блокировок, конфликтов), а также работать в офлайне. Может блокнот для заметок? Приложение для рисования вайрфреймов? Или приложение для оформления страховки на машину? Приложение для офлайн-тестирования для сайта TestHub? Я к чему-то такому склоняюсь, тут много интересных вещей которые можно изучить. Может, на этой неделе соберусь с силами и напишу.
Такие задачки, кстати, придумывать не так просто, надо рыться в документации, искать разные плагины и библиотеки, прикидывать, сложно ли это будет сделать, и т.д. Но она конечно нужна тем, кто хочет хорошо разбираться в фронтенде.
Шаблонизатор позволяет подставлять переменные в шаблон. PHP уже сам по себе является шаблонизатором, если ты делал файлообменник то ты писал что-то такое:
<?php foreach ($files as $file): ?>
<tr>
<td>Файл: <?= html($file->name) ?></td>
....
Twig позволяет делать то же самое, только удобнее:
{% for file in files %}
<tr>
<td>Файл: {{file.name}}</td>
....
Twig — это порт питоновской Jinja. Разработан он той же компанией что делает Symfony. Он поддерживает разные фильтры для обработки переменных, макросы, наследование шаблонов и другие интересные фичи. Он также автоматически экранирует выводимые данные в формате HTML, и тебе не надо с ним писать htmlspecialchars вокруг каждой переменной как в php. Twig написан с применением ООП и хорошо расширяем.
Twig довольно популярен, распространен, не старый, содержит много возможностей. Документация на оф сайте вполне хороша и подробна, ознакомься: http://twig.sensiolabs.org/
Вот русский, урезанный перевод неизвестной степени актуальности: http://twig.kron0s.com/
>Потому что по условиям задачи
>Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).
Может я придираюсь, но тот факт что
>гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).
по-моему совсем не значит что нельзя добавить по две той или иной приправы, мне кажется стоило бы добавить такое условие в задачу явно. Но я понял тебя, приму к сведению.
Самое простое что можно придумать про backbone это каталог товароа
Да, верно, явно про добавку не написано, ну тут думаю стоит исходить из здравого смысла, а то найдется желающий 10 раз полить гамбургер майонезом. Что продавцу делать?
> Самое простое что можно придумать про backbone это каталог товароа
Нет, тут я не согласен, для каталога товаров backbone подходит по моему плохо, так как товаров много, на клиент их не загрузишь (а значит офлайн работы не будет), поиск на клиенте тоже замучаешься делать, в итоге все будет через сервер, в итоге проще старый добрый html использовать. Ну и SEO не обрадуется неиндексируемому сайту.
Да и поток данных тут идет в одну сторону: пользователи смотрят товары, но ничего не редактируют (разве что заказ оформляют, но это проще классическим способом сделать).
SPA — это для разработки приложений, а каталог товаров на мой взгляд обычный сайт с контентом и лучше делается на старых добрых html технологиях.
>то найдется желающий 10 раз полить гамбургер майонезом. Что продавцу делать?
Ну, добавлять. В том же макдаке можно попросить добавить побольше того или иного ингридиента или убрать какой-то.
Но от 10 добавок весь этот майонез разольется. Ограничение все же должно быть (ну и видимо кому-то надо более внятно формулировать условия задачи).
Ну так короче.
Ну судя по тексту, он не пробивался, а просто попробовал несколько(2) раз.
http://jsbin.com/gofotisace/46/edit?html,console
Не могу понять почему
>size != Hamburger.prototype.BIG_TYPE
при size = "small"
возвращает false, как и при использовании !==
И там и там пишу в английской раскладке.
Еще думаю надо методы countPrice() и countCalorificValue() объединить в один.
В остальном вроде разобрался.
Заканчиваю универ, скоро предстоит преддипломная практика, а в последствии и написание диплома. Всем известная штука.
Немного о себе. С самого рождения нет смысла рассказывать. Начну с того момента, когда первый раз сделал "привет мир". Первый раз "привет мир" было сделано на первом курсе, когда по программе изучали C++. По началу маленькие победы и большие проблемы, из-за свой туполобости, меня подстеригали. Но данные проблемы не останавливали, а наоборот мотивировали, что-то делать. Спустя какое-то время, примерно один семестр, заметил, что не все ребята тянут программу и решил помогать советами и делом. Под конец семестра на горизонте появились парни с заочного отделения, которым было трудно осваивать данное ремесло и решено было им помочь - начал делать их лабораторные работы за какое-то мелкого денежное довольстие. Спустя пару месяцев мне написал хороший знакомый, девушке которого необходимо было сделать лабораторные работы по программированию. Как в последствии оказалось лабораторные работы предстояло делать на PHP. Немного подумав, решил попробовать. Спустя пару дней лабораторные работы были выполнены. Так был получен первый опыт в PHP. Вспомнив детские забавы с некрасивой версткой в возрасте четырнадцати лет, захотел попробовать сделать хоть какой-нибудь сайтик. Далее методом проб и ошибок учился. Летом после третьего курса нашел заказчика и продал ему сайт визитку. Потом мелкий фриланс, работа в которе. Мэтт Зандстра.
На сегодняшний день реальный опыт работы в вэбе больше, чем полтора года. Последних месяца два использую Laravel. Классная документация, очень доставляет работа с ним). Хочу развиваться дальше. Дальше вижу перспективу в Symfony. И параллельно со всем этим углублять знания английского языка.
По специальности совсем не программист, а инженер по телекоммуникациям.
"Такой инженер помимо инженерии должен и программировать" (С) Хороший преподаватель с кафедры.
Как ты мог понять из моего маленького рассказа - еще на втором курсе мой выбор пал на программирование, а не на инженерию. Хотя в рамках свой специальности, умею что-то делать.
Суть моего вопроса сводится к следующему. Необходима годная тема диплома. Планирую написать веб-сервис. Например банкинг (работа с какой-нибудь отечественной платежной системой) или что-то в духе booking.com. Так же вариант написать большую систему для колл-центра, по сбору информации о входящих вызовах и распределении вызовов между операторами. Как-то так. С меня девочки)
Заканчиваю универ, скоро предстоит преддипломная практика, а в последствии и написание диплома. Всем известная штука.
Немного о себе. С самого рождения нет смысла рассказывать. Начну с того момента, когда первый раз сделал "привет мир". Первый раз "привет мир" было сделано на первом курсе, когда по программе изучали C++. По началу маленькие победы и большие проблемы, из-за свой туполобости, меня подстеригали. Но данные проблемы не останавливали, а наоборот мотивировали, что-то делать. Спустя какое-то время, примерно один семестр, заметил, что не все ребята тянут программу и решил помогать советами и делом. Под конец семестра на горизонте появились парни с заочного отделения, которым было трудно осваивать данное ремесло и решено было им помочь - начал делать их лабораторные работы за какое-то мелкого денежное довольстие. Спустя пару месяцев мне написал хороший знакомый, девушке которого необходимо было сделать лабораторные работы по программированию. Как в последствии оказалось лабораторные работы предстояло делать на PHP. Немного подумав, решил попробовать. Спустя пару дней лабораторные работы были выполнены. Так был получен первый опыт в PHP. Вспомнив детские забавы с некрасивой версткой в возрасте четырнадцати лет, захотел попробовать сделать хоть какой-нибудь сайтик. Далее методом проб и ошибок учился. Летом после третьего курса нашел заказчика и продал ему сайт визитку. Потом мелкий фриланс, работа в которе. Мэтт Зандстра.
На сегодняшний день реальный опыт работы в вэбе больше, чем полтора года. Последних месяца два использую Laravel. Классная документация, очень доставляет работа с ним). Хочу развиваться дальше. Дальше вижу перспективу в Symfony. И параллельно со всем этим углублять знания английского языка.
По специальности совсем не программист, а инженер по телекоммуникациям.
"Такой инженер помимо инженерии должен и программировать" (С) Хороший преподаватель с кафедры.
Как ты мог понять из моего маленького рассказа - еще на втором курсе мой выбор пал на программирование, а не на инженерию. Хотя в рамках свой специальности, умею что-то делать.
Суть моего вопроса сводится к следующему. Необходима годная тема диплома. Планирую написать веб-сервис. Например банкинг (работа с какой-нибудь отечественной платежной системой) или что-то в духе booking.com. Так же вариант написать большую систему для колл-центра, по сбору информации о входящих вызовах и распределении вызовов между операторами. Как-то так. С меня девочки)
Ну потому что Hamburger.prototype.BIG_TYPE = "big"
Впрочем уже неважно, сделал перерыв, написал вроде тоже самое, но теперь все работает:
http://jsbin.com/wocugidiqu/1/edit?html,console
Видимо глаз замылился.
А ты у преподов спросил, прокатит ли? Не совсем по специальности вроде же.
>>418038
Тебе нужен JS для сортировки. Удаление можно сделать на пыхе. Оберни таблицу в форму и добавь кнопки, чтобы кнопка соотносилась со строкой, а потом обрабатывай отправленные из формы данные и удаляй.а вообще, то что ты делаешь, больше похоже на adminer
Да, именно как в phpMyAdmin я и хочу сделать примерно, скачал этот adminer, и для меня там просто полная жесть внутри этих файликов, хаос какой-то просто. Понимаю что там функционала зашито вагон целый, а мне бы нужно всего 2 вещи для начала: удалить юзера, отосортировать таблицу. Без js никак это не сделать средствами php и html? Пусть страничка перезагружается каждый раз при любом действии - это не страшно? Есть идеи? Куда копать?
Думаю можно сделать и с помощью пхп, просто каждое поле должно быть с ссылкой на ту же страницу, но со своим параметром $_GET по которому таблица будет сортироваться.
Напиши пожалуйста список вещей которые мне нужно завтра прочитать, что бы понять как это реализовать? По твоим словам мне не понятно пока.
Ну можно, но это я это вижу только если делать отдельный запрос к базе для каждой сортировки.
http://php.net/manual/ru/reserved.variables.get.php
Все, что тебе нужно знать.
>>418060
Это единственный способ, который пришел мне в голову. Сам собираюсь так сделать, т.к жс не знаю пока.
BUMP(
с такими задачками хорошо какой-нибудь фреймверк ковырять, например, YII.
JOINы не?
Ну хуй знает, для удаление все равно придется на гет вешать параметр.
document.write устаревший и не рекомендуется, лучше innerHTML.
http://learn.javascript.ru/document-write
>Есть что подобное у php?
http://php.net/manual/ru/function.echo.php ?
По моему это совсем не похоже.
>>417898
Ширина текста не 80% а сколько останется от меню, то есть 100% - 230px
>>417902
> font-family: "Trebuchet MS", Times, sans-serif;
Times тут лишний. Во-первых, он с засечками, во-вторых в Windows идет "Times New Roman", а не Times.
Вот пикрелейтед с виндошрифтами.
> font-size: 20px;
Когда задаешь font-size надо рядом задавать line-height.
В остальном, сам лейаут сделан верно.
Миграции — это способ версионировать (то есть поместить в репозиторий вместе с кодом) изменения в БД. Представь, ты разрабатыаешь сайт и хочешь добавить колонку в таблицу. Как ты поместишь информацию об этом в репозиторий, передаешь ее своим воображаемым коллегам, чтобы они обновили свои базы, и как обновишь боевую БД? Очевидно, миграциями (плохие дети не знают про миграции и передают информацию на словах: «посоны, я там колонку создал, возьмите мою базу и у себя так же добавьте»).
Миграция — это скрипт, вносящий изменения в структуру базы данных.
В Yii есть поддержка миграций.
http://stuff.cebe.cc/yii2docs/guide-db-migrations.html (англ)
http://yiiframework.ru/doc/guide/ru/database.migration (русский, из Yii 1)
>>417921
> почему
>> size != Hamburger.prototype.BIG_TYPE
> при size = "small"
Так и должно быть
> Еще думаю надо методы countPrice() и countCalorificValue() объединить в один.
напиши как выглядит вывод цены в консоль с объединенными и раздельными методами и сравни.
Писать код лучше не в HTML создавая смесь языков, а в вкладке Javascript.
> if (size == Hamburger.prototype.BIG_TYPE) {
Что за пустые ифы?
if (size != ... && size != ...) { ...
> Hamburger.prototype = {
> BIG_TYPE: "big",
Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?
> new Hamburger("small","cheese");
Ты не используешь константы тут, а надо бы использовать.
> switch (fill) {
> case "cheese":
Не удобнее будет сделать словарь вида (тип -> стоимость и калории) ?
У тебя нет проверок на то, что добавляется. Любую добавку можно добавить только один раз.
> } catch (e) {
> console.log(e);
Можешь объяснить зачем try/catch? Что изменится если их убрать?
Миграции — это способ версионировать (то есть поместить в репозиторий вместе с кодом) изменения в БД. Представь, ты разрабатыаешь сайт и хочешь добавить колонку в таблицу. Как ты поместишь информацию об этом в репозиторий, передаешь ее своим воображаемым коллегам, чтобы они обновили свои базы, и как обновишь боевую БД? Очевидно, миграциями (плохие дети не знают про миграции и передают информацию на словах: «посоны, я там колонку создал, возьмите мою базу и у себя так же добавьте»).
Миграция — это скрипт, вносящий изменения в структуру базы данных.
В Yii есть поддержка миграций.
http://stuff.cebe.cc/yii2docs/guide-db-migrations.html (англ)
http://yiiframework.ru/doc/guide/ru/database.migration (русский, из Yii 1)
>>417921
> почему
>> size != Hamburger.prototype.BIG_TYPE
> при size = "small"
Так и должно быть
> Еще думаю надо методы countPrice() и countCalorificValue() объединить в один.
напиши как выглядит вывод цены в консоль с объединенными и раздельными методами и сравни.
Писать код лучше не в HTML создавая смесь языков, а в вкладке Javascript.
> if (size == Hamburger.prototype.BIG_TYPE) {
Что за пустые ифы?
if (size != ... && size != ...) { ...
> Hamburger.prototype = {
> BIG_TYPE: "big",
Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?
> new Hamburger("small","cheese");
Ты не используешь константы тут, а надо бы использовать.
> switch (fill) {
> case "cheese":
Не удобнее будет сделать словарь вида (тип -> стоимость и калории) ?
У тебя нет проверок на то, что добавляется. Любую добавку можно добавить только один раз.
> } catch (e) {
> console.log(e);
Можешь объяснить зачем try/catch? Что изменится если их убрать?
Расстояние между input и кнопкой не равно 10px. Там есть ссылка полезная: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html
ПРо box-sizing знаешь? Это не потому, что оно тут нужно, а просто спрашиваю.
>>418038
Удаление должно делаться методом POST то ест формой с кнопкой.
> Что бы строчки id, login например были ссылками/кнопками и при нажатии на них у меня таблица сортировалась по этим самым id или username?
Ну так поставь туда ссылку и сделай чтобы она передавала имя поля для сортировки в query string
> удаление пользователя по его юзернейму
Лучше по id
>>418040
> Дальше вижу перспективу в Symfony.
Правильно видишь
> Необходима годная тема диплома.
Самое выгодное для тебя будет писать сервис за который тебе заплатят и заодно диплом по нем у написать (хотя имхо это на диплом не тянет — слишком примитивно).
> Например банкинг (работа с какой-нибудь отечественной платежной системой)
А платежная система тебе даст достиуп к своим данным?
> в духе booking.com.
А как организации будешь заманивать?
> Так же вариант написать большую систему для колл-центра, по сбору информации о входящих вызовах
Это хороший вариант. Это может быть востребовано. Можно тут для большей научности привлечь теорию массового обслуживания, или как там это назвается.
>>418041
Прочитай пожалуйста замечания >>418195\t
>>418044
Норм для начала.
>>418047
А как ты с jS будешь сортировать при постраничной навигации? Аяксом? Лишнее усложнение имхо. Тут проще наверно на сервере сортировать, без яваскрипта.
>>418056
Сделай на заголовках колонок ссылки вида
index.php?sort=+name
index.php?sort=-date
и т.д.
И если честно у меняи ощущение что ты плохо знаешь php, может тебе стоит задачку какую-нибудь решить? У нас есть похожая: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
Расстояние между input и кнопкой не равно 10px. Там есть ссылка полезная: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html
ПРо box-sizing знаешь? Это не потому, что оно тут нужно, а просто спрашиваю.
>>418038
Удаление должно делаться методом POST то ест формой с кнопкой.
> Что бы строчки id, login например были ссылками/кнопками и при нажатии на них у меня таблица сортировалась по этим самым id или username?
Ну так поставь туда ссылку и сделай чтобы она передавала имя поля для сортировки в query string
> удаление пользователя по его юзернейму
Лучше по id
>>418040
> Дальше вижу перспективу в Symfony.
Правильно видишь
> Необходима годная тема диплома.
Самое выгодное для тебя будет писать сервис за который тебе заплатят и заодно диплом по нем у написать (хотя имхо это на диплом не тянет — слишком примитивно).
> Например банкинг (работа с какой-нибудь отечественной платежной системой)
А платежная система тебе даст достиуп к своим данным?
> в духе booking.com.
А как организации будешь заманивать?
> Так же вариант написать большую систему для колл-центра, по сбору информации о входящих вызовах
Это хороший вариант. Это может быть востребовано. Можно тут для большей научности привлечь теорию массового обслуживания, или как там это назвается.
>>418041
Прочитай пожалуйста замечания >>418195\t
>>418044
Норм для начала.
>>418047
А как ты с jS будешь сортировать при постраничной навигации? Аяксом? Лишнее усложнение имхо. Тут проще наверно на сервере сортировать, без яваскрипта.
>>418056
Сделай на заголовках колонок ссылки вида
index.php?sort=+name
index.php?sort=-date
и т.д.
И если честно у меняи ощущение что ты плохо знаешь php, может тебе стоит задачку какую-нибудь решить? У нас есть похожая: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
Где изврат? Этой технологии много лет, например Апач так список файлов в каталоге позволяет сортирвать. Ты странные вещи пишешь.
>>418066
Зачем яваскрипт если можно без него, быстрее и проще?
>>418180
Ты по моему не знаешь php. PHP работает на сервере и в нем есть команда для вывода текста. Начни с учебника: https://php.net/manual/ru/language.basic-syntax.php
При этом doc.write вообще использовать не стоит, так как он во многих случаях не работает и от него только проблемы.
>>418196
В моем учебнике все решил? Хорошо, давай помучаем регулярки.
Задача 1: дан кусок HTML состоящий из комментариев, тегов с атрибутами, текста. Выведи названия всех встречающихся в нем тегов (ох-ох, HTML нельзя парсить регулярками, говорили они). Вот пример:
<b><!-- <i> это комментарий --><div class="1"><x это битый тег и он не считается
выведет
b
div
Усложнение: все что находится внутри тегов script, style, textarea считается текстом и как теги не рассматривается.
Где изврат? Этой технологии много лет, например Апач так список файлов в каталоге позволяет сортирвать. Ты странные вещи пишешь.
>>418066
Зачем яваскрипт если можно без него, быстрее и проще?
>>418180
Ты по моему не знаешь php. PHP работает на сервере и в нем есть команда для вывода текста. Начни с учебника: https://php.net/manual/ru/language.basic-syntax.php
При этом doc.write вообще использовать не стоит, так как он во многих случаях не работает и от него только проблемы.
>>418196
В моем учебнике все решил? Хорошо, давай помучаем регулярки.
Задача 1: дан кусок HTML состоящий из комментариев, тегов с атрибутами, текста. Выведи названия всех встречающихся в нем тегов (ох-ох, HTML нельзя парсить регулярками, говорили они). Вот пример:
<b><!-- <i> это комментарий --><div class="1"><x это битый тег и он не считается
выведет
b
div
Усложнение: все что находится внутри тегов script, style, textarea считается текстом и как теги не рассматривается.
>Прочитай пожалуйста замечания >>418195\t
>>418195
>Так и должно быть
"small" != "big" возвращает false, почему так и должно быть?
>Что за пустые ифы?
Исправил вот тут >>418041
>Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?
Зачем обращаться к ней вне класса?
>Ты не используешь константы тут, а надо бы использовать.
Почему? Я видел у анона, решавшего эту задачу запись
>var test = new Hamburger(Hamburger.TYPE_BIG, Hamburger.STUFF_POTATO);
И по-моему это не очень, не лучше ли указать в документации, какие значения может принимать тот или иной параметр. Да, с другой стороны
>Не удобнее будет сделать словарь вида (тип -> стоимость и калории) ?
Можно.
>У тебя нет проверок на то, что добавляется. Любую добавку можно добавить только один раз.
Как уже обсуждалось, это спорный вопрос. Но добавлю, ок.
>Можешь объяснить зачем try/catch? Что изменится если их убрать?
Да ничего
>Да, с другой стороны должно быть понятно что делать с меньшим количеством документации, лучше когда код сам говорит что нужно, но тем не менее.
фикс
не дописал
Я другой анон, но "small" не равен "big" и это правда - значит true должно быть. В консоли true возвращает, кстати.
Не равно.
Спасибо друг, что поддержал идею колл-центра. За сегодня думал над вариантом примитивного облочного сервиса - аля dropbox. Но уперся в реализацию клиента для компьютера. Надо еще подумать.
Не могу представить человека, незнающего Клаву. Ещё лет десять назад она была мокрой фантазией любого, у кого писюн мог стоять хоть как-то.
Лет десять назад мой писюн не стоял ни на кого, я даже не знал что с ним делать.
21
>В моем учебнике все решил? Хорошо, давай помучаем регулярки.
Задача 1: дан кусок HTML состоящий из комментариев, тегов с атрибутами, текста. Выведи названия всех встречающихся в нем тегов (ох-ох, HTML нельзя парсить регулярками, говорили они). Вот пример:
<b><!-- <i> это комментарий --><div class="1"><x это битый тег и он не считается
http://ideone.com/F5XJr6
На семёрке застопорилось. Пишет, что анекспектед ЭЛСиф а я хз чего оно так.
http://ideone.com/bVyjB1
И сразу-же... ЧТо это?
Для сравнения нужно использовать "==" или "===" (строгое сравнение), а вот это "=" присваивает значение.
Выполнилось то, что в первом if, $lastDigit = 1 и дальше проверки не было, отсюда и результат единица.
Суть совершения ошибки я понял уже. Хотел узнать зачем именно остаток от деления ему нужен был, но и это понял.
Да ну что такое? Только что всё считало, а потом перестало, и эррор пишет.
Никак, я же безработный.
Сосоны, поясните, таки, где ошибка, хули считать перестало. Я хочу другие уроки пройти, но на этом застрял.
Айдеон опять мозги ебёт. Ставь свой сервер.
Если бы мне предъявляли с космическим сарказмом, я бы задумался о том стоит ли продолжать работать в такой компании.
Просто говорят где ошибка и если я не знаю что делать, говорю и мне помогают. Но я плохо переношу критику и даже в этой ситуации моя жопа в огне. Не представля какого тебе.
$credit = 40000;
$proc = 1.03;
$komis = 1000;
$platez = 5000;
$summa = 0;
for ($month = 1; $month <= 20; $month++) {
$credit = ($credit + $proc) + $komis - $platez;
$summa = $summa + $platez;
echo "На {$month} месяц долг: {$credit} руб, выплачено: {$summa} \n";
if ($credit < 0) {
echo "Всё\n";
break;
}
}
?>
Переписал ту задачу, вроде как осмыслил. Почему у меня результат другой, что я не так сделал-то?
И сразу-же понял ошибку.
http://ideone.com/J3g3Tg - вот додумал покамест. Как полную сумму задать?
У меня возникла странная проблема при работе с ООП.
Файл загружается через форму и вызывается upload.php. Далее имя файла преобразуется из кириллицы в латиницу. Проблема заключается в том, что когда я вызываю этот метод из другого метода, то метод преобразования в латиницу начинает работать не правильно, а если я вызову этот метод где-то по среди кода, то все работает нормально.
Вот собственно код:
upload.php: http://pastebin.com/yhfgrEAT
Upload.php: http://pastebin.com/mAPNzAxg
Database.php: http://pastebin.com/b8pCZi9k
Скоро доделаю REST-service, если не попаду в прострацию, бгг
Санная макака
>Ну и как можно скорее все на гитхаб заливай, чтобы можно было проверить.
https://github.com/sqghub/TestHub
Очень неспешно таки начал. Пока что вожусь с формой.
Чому ты обращаешься к методу через имя класса, будто бы он статический?
<li id="menu-item-224" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-194 current_page_item menu-item-has-children menu-item-224"><a href="http://localhost/site/?page_id=194">Страничка</a
[/code]
Как грамотно обратиться к "Старничке"? Пробовал разное, но безрузальтативно. Нужно поменять, например, её цвет.
Охуеть у вас здесь клуб похапэ. По вашим-же задачкам вопросы спрашиваю - игнор получаю.
Ну да ладно, сам додумал, понял, что в циклы можно новые значения переменных добавлять.
http://ideone.com/CZReIO - Вышло в конце. Больше, вроде, ничего и не надо.
[code]
"use strict";
function sequence(start, step) {
\tvar start = start || 0,
\t\tstep = step || 1;
\tvar cur = start;
\treturn function() {
\t\tvar old = cur;
\t\tcur += step;
\t\treturn old;
\t}
}
[/code]
Не могу настроить подключение к сети.
ping -c 3 www.gentoo.org выдает unknown host
Пробовал через net-setup и pppoe-setup, все равно не работает.
Бамп
> тесты к ней - 48 строк
Опубликуй код где-нибудь, я гляну (и может кто из анонов заинтересуется). Алсо, напиши как ты запускаешь тесты.
Вообще, так вышло, что в нашем треде мы не изучаем тестирование, и мне кажется, надо эту ситуацию выправлять. Конечно, на простых задачах знакомиться с тестовыми фреймворками рановато, но тот же файлообменник например можно и потестировать.
Код решения лучше постить на jsbin, jsfiddle, codepen или аналогичный сервис где он выполняется.
Так, твой код выглядит верным.
>>418206
> "small" != "big" возвращает false, почему так и должно быть?
А, значит я не так тебя понял. Вот я сейчас проверил: возвращает true http://jsbin.com/selureqota/2/edit?js,console
Если ты считаешь что что-то в яваскрипте работает не так, сделай пример и выложи, чтобы я мог его проверить.
>> Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?
> Зачем обращаться к ней вне класса?
Потому что константы пишутся в первую очередь для «пользователей» класса, то есть тех кто твой класс будет использовать. Ты им как бы говоришь: вот вам класс, вот сюда надо передать тип гамбургера, а вот тут определены возможные типы, которые поддерживаются. Для этого константы и нужны (когда есть один из N вариантов).
Это общепринятый подход.
Есть константа Math.PI которая хранит догадайся сам какое число. Есть константы для типов узлов в DOM (дереве объектов которые представляют старницу в браузере) вроде Node.ELEMENT_NODE, Node.TEXT_NODE и другие. Например document.nodeType == Node.DOCUMENT_NODE, а document.body.nodeType == Node.ELEMENT_NODE. Есть константы для обозначения разных типов CSS-правил: https://developer.mozilla.org/en-US/docs/Web/API/CSSRule#Type_constants
Вот еще константы для названий клавиш: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode#Constants_for_keyCode_value
В то же время такие константы как BIG_PRICE не обязательно должны быть доступны снаружи, так как их все равно никак нельзя там использовать.
> И по-моему это не очень,
Это общепринятый способ. Он больше информации несет, то есть по «Haburger.SIZE_SMALL» понятно что речь о маленьком размере гамбургера, а не чем-то еще.
> не лучше ли указать в документации, какие значения может принимать тот или иной параметр. Да, с другой стороны
Тут ты не прав. Это все должно быть в коде, а не в документации, потому что:
- никто не любит читать документацию
- никто не любит писать документацию
- документация может устаревать при изменениях в коде
- если для понимания кода надо постоянно открывть документацию, это долго
Гораздо эффективнее писать «самодокументирующий» код, то есть такой, при взгляде на который все становится очевидно без документации. То есть код написан по общепринятым принципам, без изобретения велосипедов, имена функций, переменных объясняют их назначение, используются константы, и т.д. Конечно, документация все равно остается нужна, но можно разобраться и без нее.
То же касается и проверки параметров. Лучше пусть функция при неправильном значении выкинет исключение чем это будет описано только в документации.
>> У тебя нет проверок на то, что добавляется. Любую добавку можно добавить только один раз.
> Как уже обсуждалось, это спорный вопрос. Но добавлю, ок.
Ты можешь сделать свои ограничения, например не больше 5 добавок всего — лишь бы они были.
>>Можешь объяснить зачем try/catch? Что изменится если их убрать?
>Да ничего
Ну так тогда наверно незачем их и писать?
По твоему коду тут http://jsbin.com/wocugidiqu/1/edit?html,console — надо добавить ограничение на добавки и начинки. У меня в задаче начинку можно выбрать только одну из трех. И с константами разобраться. В остальном, норм.
Вообще, я смотрю, что идея про константы не нравится почти всем, кто решает эту задачу, и все пытаются там использовать просто строки. Почему, интересно.
> тесты к ней - 48 строк
Опубликуй код где-нибудь, я гляну (и может кто из анонов заинтересуется). Алсо, напиши как ты запускаешь тесты.
Вообще, так вышло, что в нашем треде мы не изучаем тестирование, и мне кажется, надо эту ситуацию выправлять. Конечно, на простых задачах знакомиться с тестовыми фреймворками рановато, но тот же файлообменник например можно и потестировать.
Код решения лучше постить на jsbin, jsfiddle, codepen или аналогичный сервис где он выполняется.
Так, твой код выглядит верным.
>>418206
> "small" != "big" возвращает false, почему так и должно быть?
А, значит я не так тебя понял. Вот я сейчас проверил: возвращает true http://jsbin.com/selureqota/2/edit?js,console
Если ты считаешь что что-то в яваскрипте работает не так, сделай пример и выложи, чтобы я мог его проверить.
>> Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?
> Зачем обращаться к ней вне класса?
Потому что константы пишутся в первую очередь для «пользователей» класса, то есть тех кто твой класс будет использовать. Ты им как бы говоришь: вот вам класс, вот сюда надо передать тип гамбургера, а вот тут определены возможные типы, которые поддерживаются. Для этого константы и нужны (когда есть один из N вариантов).
Это общепринятый подход.
Есть константа Math.PI которая хранит догадайся сам какое число. Есть константы для типов узлов в DOM (дереве объектов которые представляют старницу в браузере) вроде Node.ELEMENT_NODE, Node.TEXT_NODE и другие. Например document.nodeType == Node.DOCUMENT_NODE, а document.body.nodeType == Node.ELEMENT_NODE. Есть константы для обозначения разных типов CSS-правил: https://developer.mozilla.org/en-US/docs/Web/API/CSSRule#Type_constants
Вот еще константы для названий клавиш: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode#Constants_for_keyCode_value
В то же время такие константы как BIG_PRICE не обязательно должны быть доступны снаружи, так как их все равно никак нельзя там использовать.
> И по-моему это не очень,
Это общепринятый способ. Он больше информации несет, то есть по «Haburger.SIZE_SMALL» понятно что речь о маленьком размере гамбургера, а не чем-то еще.
> не лучше ли указать в документации, какие значения может принимать тот или иной параметр. Да, с другой стороны
Тут ты не прав. Это все должно быть в коде, а не в документации, потому что:
- никто не любит читать документацию
- никто не любит писать документацию
- документация может устаревать при изменениях в коде
- если для понимания кода надо постоянно открывть документацию, это долго
Гораздо эффективнее писать «самодокументирующий» код, то есть такой, при взгляде на который все становится очевидно без документации. То есть код написан по общепринятым принципам, без изобретения велосипедов, имена функций, переменных объясняют их назначение, используются константы, и т.д. Конечно, документация все равно остается нужна, но можно разобраться и без нее.
То же касается и проверки параметров. Лучше пусть функция при неправильном значении выкинет исключение чем это будет описано только в документации.
>> У тебя нет проверок на то, что добавляется. Любую добавку можно добавить только один раз.
> Как уже обсуждалось, это спорный вопрос. Но добавлю, ок.
Ты можешь сделать свои ограничения, например не больше 5 добавок всего — лишь бы они были.
>>Можешь объяснить зачем try/catch? Что изменится если их убрать?
>Да ничего
Ну так тогда наверно незачем их и писать?
По твоему коду тут http://jsbin.com/wocugidiqu/1/edit?html,console — надо добавить ограничение на добавки и начинки. У меня в задаче начинку можно выбрать только одну из трех. И с константами разобраться. В остальном, норм.
Вообще, я смотрю, что идея про константы не нравится почти всем, кто решает эту задачу, и все пытаются там использовать просто строки. Почему, интересно.
Команду /sbin/ifconfig вызывал? Она вроде должна показывать состояние сетевых интерфейсов, хотя это было раньше, до очередных изменений, а работает ли она сейчас, не знаю.
В дебиане сеть описывается в /etc/network, может и в генте аналогично?
.onclick может повесить только один обработчик. А ты их все вешаешь на newDiv.childNodes[5], соответственно один, тот что повешен последним отрабатывает и все, свободен. Юзай addEventListener() или вместо newDiv.childNodes[5] втыкай document.getElementById(%тут id%).childNodes[5].
а лучше книжки почитай умные
Она выводит лишнее. В примере тут она должна вывести только b и div, а выводит еще и i, который является частью комментария: http://ideone.com/qDgiWw
Надо улучшить код.
И да, HTML действительно не стоит разбирать регулярками, надо использовать DOM парсер. Но ради изучения регулярок можно отойти от этого правила.
>>418243
Код выглядит верно. Насчет ideone, это у них баг. Установи PHP себе, как описано тут: https://gist.github.com/codedokode/7054af4a03865c4cc863 и запускай в консоли (гайд по консоли: https://gist.github.com/codedokode/10539568 )
Если ты используешь IDE (Eclipse, Netbeans, PhpStorm) то можно указать путь к PHP в настройках и запускать программы одной кнопкой из IDE.
>>418266
Если тебе предъявляют ошибку с сарказмом, то это человек невопитанный или невежливый. Ничего плохого в том, чтобы сделать ошибку нет — любой может ошибиться. Я тоже делаю ошибки в коде (но бугурта не испытываю). Важно оперативно ее исправить, а в идеале наладить тестирование − чтобы программисты тестировали свои изменения, а тестеры - сам продукт перед релизом, чтобы ошибки отлавливались как можно раньше. Увы, автоматизированным тестированием во многих компаниях не занимаются.
>>418276
Но это же человек виноват что он невоспитанный или асоциальный, а не компания.
>>418284
Мне об ошибках пишут в скайп (либо я сам их вижу в логах ошибок и исправляю).
>>418300
У тебя долг в минус уходит по моему.
Она выводит лишнее. В примере тут она должна вывести только b и div, а выводит еще и i, который является частью комментария: http://ideone.com/qDgiWw
Надо улучшить код.
И да, HTML действительно не стоит разбирать регулярками, надо использовать DOM парсер. Но ради изучения регулярок можно отойти от этого правила.
>>418243
Код выглядит верно. Насчет ideone, это у них баг. Установи PHP себе, как описано тут: https://gist.github.com/codedokode/7054af4a03865c4cc863 и запускай в консоли (гайд по консоли: https://gist.github.com/codedokode/10539568 )
Если ты используешь IDE (Eclipse, Netbeans, PhpStorm) то можно указать путь к PHP в настройках и запускать программы одной кнопкой из IDE.
>>418266
Если тебе предъявляют ошибку с сарказмом, то это человек невопитанный или невежливый. Ничего плохого в том, чтобы сделать ошибку нет — любой может ошибиться. Я тоже делаю ошибки в коде (но бугурта не испытываю). Важно оперативно ее исправить, а в идеале наладить тестирование − чтобы программисты тестировали свои изменения, а тестеры - сам продукт перед релизом, чтобы ошибки отлавливались как можно раньше. Увы, автоматизированным тестированием во многих компаниях не занимаются.
>>418276
Но это же человек виноват что он невоспитанный или асоциальный, а не компания.
>>418284
Мне об ошибках пишут в скайп (либо я сам их вижу в логах ошибок и исправляю).
>>418300
У тебя долг в минус уходит по моему.
Спасибо!
Что-то идеон сломался. Вот, я перепостил решение (fork + run): http://ideone.com/RMxEy6
Считает неверно. Там не 60262 получается, а около 61270. Потому что анон, который только что выплатил 5000 не может заплатить 262 и должен подождать месяц, за который набегут проценты.
Проверь также программу на других суммах: кредит = 1000, выплата = 2030, кредит = 4000, выплата должна быть около 6123.
Мне кажется, лучше алгоритм сделать так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
> Хочу полную сумму узнать, а что-то не придумаю, как её задать.
Сделай переменную и в нее добавляй каждую выплату. По моему, ты это уже сделал.
>>418305
> Проблема заключается в том, что когда я вызываю этот метод из другого метода, то метод преобразования в латиницу начинает работать не правильно, а если я вызову этот метод где-то по среди кода, то все работает нормально.
Такого конечно быть не должно. Функция не должна зависеть от внешних условий. Давай-ка код посмотрим.
> class Database {
> public function newName($originalname) {
> $replace = Database::newName($name);
Так (используя имя класса и двоеточие) можно вызывать только статические методы (статический = не привязанный к конкретному объекту). Обычные методы вызываются только на объекте, то есть
> $db = new Database( );
> $replace = $db->newName($name);
PHP должен был вывести сообщение об ошибке. Если он не выводит - у тебя отключен вывод ошибок и надо его включить (я могу написать как).
К сожалению, такой вызов с двоеточием работает из другого класса по историческим причинам (ты фактически вызываешь метод одного класса на объекте другого класса). Но писать так все равно нельзя, в будущем, я думаю, это уберут.
У тебя есть еще одна ошибка. Ты исплоьзуешь регулярки без флага u для работы с русскими буквами. Они работать не будут, по причинам описанным тут: https://gist.github.com/codedokode/ff99e357e9860ea169b8 Из-за этого замена идет некорректно.
Ну и пости скорее свой код (на гитхаб, если разобрался, или еще куда-нибудь), чем раньше мы увидим ошибки тем меньше придется исправлять.
> $ruExplode = explode(' ' , $ru);
Я подумал, это плохая идея так как при такой записи легко допустить ошибку. Посмотри на свой код, и ответь, какой букве соответствует русская «П»? Чтобы это определить, тебе надо вручную отсчитывать пробелы и это долго и легко что-то перепутать. Такого быть не должно, код должен быть понятен, я думаю лучше записать пары в виде массива array("Ш" => "Sch"). Сам массив можно нагуглить.
> $originalname = preg_replace($ruExplode, $engExplode, $originalname);
Ой-ой-ой, как все сложно. А чем тебя не устраивает strtr которую мы изучали в разделе учебника про программу для зашифровки текста? Алсо ты забыл флаг u.
> $originalname = explode('.', $originalname);
> $extension = array(end($originalname));
> $originalname = array_diff($originalname, $extension);
Можно сделать проще, используй array_pop который вынимает последний элемент (расширение) из массива. А лучше, используй стандартную функцию pathinfo (UPD: в комментах пишут она из-за бага вырезает нелатинские символы из имени файла. Но из расширения не вырезает, я проверил).
Ну и конечно «определить расширение файла» — это отдельная задача и она должна быть вынесена в отдельную функцию.
Что-то идеон сломался. Вот, я перепостил решение (fork + run): http://ideone.com/RMxEy6
Считает неверно. Там не 60262 получается, а около 61270. Потому что анон, который только что выплатил 5000 не может заплатить 262 и должен подождать месяц, за который набегут проценты.
Проверь также программу на других суммах: кредит = 1000, выплата = 2030, кредит = 4000, выплата должна быть около 6123.
Мне кажется, лучше алгоритм сделать так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
> Хочу полную сумму узнать, а что-то не придумаю, как её задать.
Сделай переменную и в нее добавляй каждую выплату. По моему, ты это уже сделал.
>>418305
> Проблема заключается в том, что когда я вызываю этот метод из другого метода, то метод преобразования в латиницу начинает работать не правильно, а если я вызову этот метод где-то по среди кода, то все работает нормально.
Такого конечно быть не должно. Функция не должна зависеть от внешних условий. Давай-ка код посмотрим.
> class Database {
> public function newName($originalname) {
> $replace = Database::newName($name);
Так (используя имя класса и двоеточие) можно вызывать только статические методы (статический = не привязанный к конкретному объекту). Обычные методы вызываются только на объекте, то есть
> $db = new Database( );
> $replace = $db->newName($name);
PHP должен был вывести сообщение об ошибке. Если он не выводит - у тебя отключен вывод ошибок и надо его включить (я могу написать как).
К сожалению, такой вызов с двоеточием работает из другого класса по историческим причинам (ты фактически вызываешь метод одного класса на объекте другого класса). Но писать так все равно нельзя, в будущем, я думаю, это уберут.
У тебя есть еще одна ошибка. Ты исплоьзуешь регулярки без флага u для работы с русскими буквами. Они работать не будут, по причинам описанным тут: https://gist.github.com/codedokode/ff99e357e9860ea169b8 Из-за этого замена идет некорректно.
Ну и пости скорее свой код (на гитхаб, если разобрался, или еще куда-нибудь), чем раньше мы увидим ошибки тем меньше придется исправлять.
> $ruExplode = explode(' ' , $ru);
Я подумал, это плохая идея так как при такой записи легко допустить ошибку. Посмотри на свой код, и ответь, какой букве соответствует русская «П»? Чтобы это определить, тебе надо вручную отсчитывать пробелы и это долго и легко что-то перепутать. Такого быть не должно, код должен быть понятен, я думаю лучше записать пары в виде массива array("Ш" => "Sch"). Сам массив можно нагуглить.
> $originalname = preg_replace($ruExplode, $engExplode, $originalname);
Ой-ой-ой, как все сложно. А чем тебя не устраивает strtr которую мы изучали в разделе учебника про программу для зашифровки текста? Алсо ты забыл флаг u.
> $originalname = explode('.', $originalname);
> $extension = array(end($originalname));
> $originalname = array_diff($originalname, $extension);
Можно сделать проще, используй array_pop который вынимает последний элемент (расширение) из массива. А лучше, используй стандартную функцию pathinfo (UPD: в комментах пишут она из-за бага вырезает нелатинские символы из имени файла. Но из расширения не вырезает, я проверил).
Ну и конечно «определить расширение файла» — это отдельная задача и она должна быть вынесена в отдельную функцию.
>>418322
> https://github.com/sqghub/TestHub/blob/master/config/web.php#L31
Я тут обращу внимание что это какой-то секретный токен для подписи кук, и разумеется, он не должен быть известен всем жалеющим. Например, если ты разворачиваешь сайт, то для него надо этот токен заменить на секретный, и для этого должен быть предусмотрен способ. Я вижу, ты предусмотрел файл db.local.php, а вот чтобы токен (или любой другой параметр) переопредедить, не предусмотрел.
Делать с этим пока ничего не надо, но все равно, ты должен такие вещи понимать. Кроме токена, может потребоваться переопределять какие-то настройки вроде API ключей, имен серверов, чтобы они были разные на боевом и тестовом сервере например.
Еще, включи строгий режим в MySQL чтобы она показывала больше ошибок. Для этого надо после соединения сделать SET sql_mode = 'STRICT_ALL_TABLES': http://dev.mysql.com/doc/refman/5.1/en/sql-mode.html#sql-mode-setting
Насчет миграций, я вижу ты down не делал, хорошо, это обычно не требуется. Но в других фреймвокрках, вроде Ruby On Rails, миграции сделаны интереснее. Там ты не пишешь SQL код, а команды вроде таких:
create_table :products do |t|
t.string :name
t.text :description
t.timestamps null: false
end
За счет использования такого описания RoR умеет автоматически делать обратную операцию, например удалить таблицу или колонку. Ну это так, для расширения кругозора.
> $command = $this->db->createCommand("DROP TABLE IF EXISTS `questions`");
Этого в миграции быть не должно. Система миграций никогда не выполнит ее повторно.
Ну и кстати можно было сразу писать execute, не создавая переменную.
> `name` TEXT NOT NULL,
Хватит и VARCHAR, он до 65000 символов вроде поддерживает (но размер одной строки таблицы не может быть больше 65000 байт так что юникодных символов туда влезет меньше, инфа: http://dev.mysql.com/doc/refman/5.6/en/column-count-limit.html ).
> `author` VARCHAR(255),
Автора пока не надо делать, если пользователей нет. А если есть то нужно использовать внешние ключи тут (не знаком с ними? попроси ссылку и задачку).
> `text` TEXT,
Название плохое. Что такое «текст»? Предисловие? Содержимое? Послесловие? Правила?
> `time`
> `date`
Название плохое. Время чего? Обычно называют created, added, edited, deleted и тд. Если это ограничение то timeLimit.
Также, ты можешь (то есть требуется так делать) добавлять комментарии когда смысл не очень ясен:
rabbitPerTree INT (10) COMMENT 'Максимальное число зайцев, сидящих под одним деревом'
Эти комментарии сохраняются в БД и отображаются в разных программах для работы с ней.
> `questions` INT(11) UNSIGNED NOT NULL,
> `points` INT(11) UNSIGNED NOT NULL,
Не очень понятен смысл этих полей если их значение легко считается. Оптимизация? Тогда почему нет комментария? Я думаю, все же это ошибка, а не оптимизация. Ведь у каждого вопроса есть свое число баллов.
> Question.php
> QuestionMapper.php
Ты знаешь что в Yii есть базовый класс для моделей с ActiveRecord? Или ты по каким-то причинам не хочешь его использовать? http://www.yiiframework.com/doc-2.0/guide-db-active-record.html
ActiveRecord — это когда модель сама себя сохраняет и достает из базы. Вот моя паста про мапперы: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
Если нет веских причин против AR, стоит использовать ее. Если есть, стоит исплоьзовать Doctrine 2 а не изобретать велосипед и свои мапперы, ибо когда ты дойдешь до реализации связей, ты замучаешься (в файлообменнике связей вроде не было особо и проблемы тоже).
Отдельная тема — что делать с разными классами вопросов? Как хранить в БД наследующиеся сущности? Для этого есть 3 паттерна и их надо знать (это могут спросить на собеседовании, к слову):
http://martinfowler.com/eaaCatalog/singleTableInheritance.html
http://martinfowler.com/eaaCatalog/classTableInheritance.html
http://martinfowler.com/eaaCatalog/concreteTableInheritance.html
http://martinfowler.com/eaaCatalog/inheritanceMappers.html
(русский перевод если что есть на http://design-pattern.ru/ )
В Yii реально реализовать STI с полем type, один из анонов это ранее делал, насчет других подходов не знаю, но предупрежу что искать вопросы в 3 таблицах сложнее чем в одной.
> public function getAllTests()
Если у тебя есть сущность Test то логично возвращать массив этих Test, а не «глупый» массив с сырыми данными. Но если ты решишь использовать ActiveRecord. Также, по идее в эти Test должны быть вбиты вопросы. Если ты захочешь это написать, ты скоро увидишь что приходится писать кучу кода для маппинга между сущностями и таблицами. Гораздо умнее в такой ситуации не изобретать велосипед, а использовать библиотеку-маппер вроде Doctrine 2 (или activeRecord).
Если не ты создавал эту папку, то удали содержимое. Я думаю, что тебе полезнее будет учиться писать тесты с нуля, а не с готового шаблона, ну и может мы захотим изучить еще и phpunit, а не только codeception.
> TestHub/views/test/createTest.php
Почему twig не используешь, а на PHP пишешь?
> {!{questionNumber}!}
Не очень удачный выбор, печатать тяжело. Я думаю, можно либо шаблон вынести в отдельных файл (чтобы не было конфликта с twig), либо использовать 2 знака процента например или [[ .
https://github.com/sqghub/TestHub/blob/master/views/test/createTest.php#L41 слишком длинная строка
Ну и я бы советовал использовать тут jQuery, если ты с ним знаком. Ну или сделать свои функции, например, var div = create('div', { id: 'xyz' }) вместо ручной возни с DOM методами.
Насчет формы, почитай что есть в Yii для этого: http://www.yiiframework.com/doc-2.0/guide-input-forms.html
>>418322
> https://github.com/sqghub/TestHub/blob/master/config/web.php#L31
Я тут обращу внимание что это какой-то секретный токен для подписи кук, и разумеется, он не должен быть известен всем жалеющим. Например, если ты разворачиваешь сайт, то для него надо этот токен заменить на секретный, и для этого должен быть предусмотрен способ. Я вижу, ты предусмотрел файл db.local.php, а вот чтобы токен (или любой другой параметр) переопредедить, не предусмотрел.
Делать с этим пока ничего не надо, но все равно, ты должен такие вещи понимать. Кроме токена, может потребоваться переопределять какие-то настройки вроде API ключей, имен серверов, чтобы они были разные на боевом и тестовом сервере например.
Еще, включи строгий режим в MySQL чтобы она показывала больше ошибок. Для этого надо после соединения сделать SET sql_mode = 'STRICT_ALL_TABLES': http://dev.mysql.com/doc/refman/5.1/en/sql-mode.html#sql-mode-setting
Насчет миграций, я вижу ты down не делал, хорошо, это обычно не требуется. Но в других фреймвокрках, вроде Ruby On Rails, миграции сделаны интереснее. Там ты не пишешь SQL код, а команды вроде таких:
create_table :products do |t|
t.string :name
t.text :description
t.timestamps null: false
end
За счет использования такого описания RoR умеет автоматически делать обратную операцию, например удалить таблицу или колонку. Ну это так, для расширения кругозора.
> $command = $this->db->createCommand("DROP TABLE IF EXISTS `questions`");
Этого в миграции быть не должно. Система миграций никогда не выполнит ее повторно.
Ну и кстати можно было сразу писать execute, не создавая переменную.
> `name` TEXT NOT NULL,
Хватит и VARCHAR, он до 65000 символов вроде поддерживает (но размер одной строки таблицы не может быть больше 65000 байт так что юникодных символов туда влезет меньше, инфа: http://dev.mysql.com/doc/refman/5.6/en/column-count-limit.html ).
> `author` VARCHAR(255),
Автора пока не надо делать, если пользователей нет. А если есть то нужно использовать внешние ключи тут (не знаком с ними? попроси ссылку и задачку).
> `text` TEXT,
Название плохое. Что такое «текст»? Предисловие? Содержимое? Послесловие? Правила?
> `time`
> `date`
Название плохое. Время чего? Обычно называют created, added, edited, deleted и тд. Если это ограничение то timeLimit.
Также, ты можешь (то есть требуется так делать) добавлять комментарии когда смысл не очень ясен:
rabbitPerTree INT (10) COMMENT 'Максимальное число зайцев, сидящих под одним деревом'
Эти комментарии сохраняются в БД и отображаются в разных программах для работы с ней.
> `questions` INT(11) UNSIGNED NOT NULL,
> `points` INT(11) UNSIGNED NOT NULL,
Не очень понятен смысл этих полей если их значение легко считается. Оптимизация? Тогда почему нет комментария? Я думаю, все же это ошибка, а не оптимизация. Ведь у каждого вопроса есть свое число баллов.
> Question.php
> QuestionMapper.php
Ты знаешь что в Yii есть базовый класс для моделей с ActiveRecord? Или ты по каким-то причинам не хочешь его использовать? http://www.yiiframework.com/doc-2.0/guide-db-active-record.html
ActiveRecord — это когда модель сама себя сохраняет и достает из базы. Вот моя паста про мапперы: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
Если нет веских причин против AR, стоит использовать ее. Если есть, стоит исплоьзовать Doctrine 2 а не изобретать велосипед и свои мапперы, ибо когда ты дойдешь до реализации связей, ты замучаешься (в файлообменнике связей вроде не было особо и проблемы тоже).
Отдельная тема — что делать с разными классами вопросов? Как хранить в БД наследующиеся сущности? Для этого есть 3 паттерна и их надо знать (это могут спросить на собеседовании, к слову):
http://martinfowler.com/eaaCatalog/singleTableInheritance.html
http://martinfowler.com/eaaCatalog/classTableInheritance.html
http://martinfowler.com/eaaCatalog/concreteTableInheritance.html
http://martinfowler.com/eaaCatalog/inheritanceMappers.html
(русский перевод если что есть на http://design-pattern.ru/ )
В Yii реально реализовать STI с полем type, один из анонов это ранее делал, насчет других подходов не знаю, но предупрежу что искать вопросы в 3 таблицах сложнее чем в одной.
> public function getAllTests()
Если у тебя есть сущность Test то логично возвращать массив этих Test, а не «глупый» массив с сырыми данными. Но если ты решишь использовать ActiveRecord. Также, по идее в эти Test должны быть вбиты вопросы. Если ты захочешь это написать, ты скоро увидишь что приходится писать кучу кода для маппинга между сущностями и таблицами. Гораздо умнее в такой ситуации не изобретать велосипед, а использовать библиотеку-маппер вроде Doctrine 2 (или activeRecord).
Если не ты создавал эту папку, то удали содержимое. Я думаю, что тебе полезнее будет учиться писать тесты с нуля, а не с готового шаблона, ну и может мы захотим изучить еще и phpunit, а не только codeception.
> TestHub/views/test/createTest.php
Почему twig не используешь, а на PHP пишешь?
> {!{questionNumber}!}
Не очень удачный выбор, печатать тяжело. Я думаю, можно либо шаблон вынести в отдельных файл (чтобы не было конфликта с twig), либо использовать 2 знака процента например или [[ .
https://github.com/sqghub/TestHub/blob/master/views/test/createTest.php#L41 слишком длинная строка
Ну и я бы советовал использовать тут jQuery, если ты с ним знаком. Ну или сделать свои функции, например, var div = create('div', { id: 'xyz' }) вместо ручной возни с DOM методами.
Насчет формы, почитай что есть в Yii для этого: http://www.yiiframework.com/doc-2.0/guide-input-forms.html
Изменения в БД наверно надо будет сделать новой миграцией, либо исправить старую.
> <label class=""
зачем пустой класс?
А, еще, насчет шаблона для вопроса. При использовании twig ты можешь использовать макрос чтобы вывести и вопрос из базы, и шаблон вопроса:
{% macro question(text) %}
<div>{{text}}</div>
{% endmacro %}
Использование макроса, для вывода существующего вопроса:
{{ question('Кто открыл закон Ньютона?') }}
Для генерации шаблона:
{{ question('%TEXT%') }}
Для вывода списк всех тестов в Yii есть грид:
http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#listview
http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#gridview
(и да, меня напрягает использование use в шаблонах которое они там предлагают. И да, я не знаю, как этот грид вызвать из твига так что будем считать это дополнительной задачей, разобраться с этим).
Я тебе в одеск-треде пояснил, лол.
Нахуй он нужен тогда? Получается, Опу или кому угодно придется создавать идентичную БД под мой проект, если он захочет проверить работоспособность?
> Нужно любой из них добавить в локальное хранилище, перезагрузить страницу, и отобразить в DOM (пикрилейтед).
Не очень понимаю, зачем перезагружать страницу
> Да, по поводу задач ОПа, я их смотрел, но не могу за них взяться, пока не закончил это задание, т.к. оно является основой портфолио одного из моих быдлосайтов.
Зря. У тебя пока что очень слабые знания JS, а задачи подняли бы его до хорошего. И ведь это видно по коду.
> for (i=0; i<articles.length; i++) {
> if (localStorage.getItem(articles[a]) == articles[a])
Нет никакого смысла делать эту проверку в цикле, ведь тебе надо проверить только один товар, а цикл предназначен для повторяющихся действий. Зачем тут цикл?
> <a href = "#"
Для этого надо использовать кнопку или спан. Ссылка должна куда-то вести, а # это не ссылка. Хотя много где так пишут, но это неправильно.
> //Удаляем пустые элементы из массива
Их проще было в него не добавлять
> deleteFromDOM(newDiv.id = "article_1")
Так писать неправильно. Зачем тут менять id у одного из элементов? Из-за замыканий он меняется не у того элемента о котором ты думаешь.
Плюс, ты зачем-то скопипастил большой кусок кода 4 раза. А если надо еще 4 товара добавить, ты еще 4 куска скопипастишь?
Слушай, там код такой неадекватный, что я даже проверять дальше не вижу смысла. Тебе надо изучать яваскрипт, так как ты его совсем не понимаешь. Если ты хочешь использовать это как портфолио, то этот код играет не в твою пользу.
Для портфолио лучше найди готовый код или плагин.
>>418370
По моему ты путаешь, у него там этот код внутри elseif и выполнится только одна ветка (вот видишь как он запутанно пишет, фиг поймешь что хотел написать).
>>418377
Они может и неплохие, но дают очень базовые знания, самые основы, с которыми ты ничего не сделаешь. Советую после них прорешать например мои задачки по этим темам или почитать другие книги.
>>418380
В дампе в формате SQL. Сделать дамп в консоли можно командой mysqldump, а в других программах обычно есть кнопка или опция.
> Нужно любой из них добавить в локальное хранилище, перезагрузить страницу, и отобразить в DOM (пикрилейтед).
Не очень понимаю, зачем перезагружать страницу
> Да, по поводу задач ОПа, я их смотрел, но не могу за них взяться, пока не закончил это задание, т.к. оно является основой портфолио одного из моих быдлосайтов.
Зря. У тебя пока что очень слабые знания JS, а задачи подняли бы его до хорошего. И ведь это видно по коду.
> for (i=0; i<articles.length; i++) {
> if (localStorage.getItem(articles[a]) == articles[a])
Нет никакого смысла делать эту проверку в цикле, ведь тебе надо проверить только один товар, а цикл предназначен для повторяющихся действий. Зачем тут цикл?
> <a href = "#"
Для этого надо использовать кнопку или спан. Ссылка должна куда-то вести, а # это не ссылка. Хотя много где так пишут, но это неправильно.
> //Удаляем пустые элементы из массива
Их проще было в него не добавлять
> deleteFromDOM(newDiv.id = "article_1")
Так писать неправильно. Зачем тут менять id у одного из элементов? Из-за замыканий он меняется не у того элемента о котором ты думаешь.
Плюс, ты зачем-то скопипастил большой кусок кода 4 раза. А если надо еще 4 товара добавить, ты еще 4 куска скопипастишь?
Слушай, там код такой неадекватный, что я даже проверять дальше не вижу смысла. Тебе надо изучать яваскрипт, так как ты его совсем не понимаешь. Если ты хочешь использовать это как портфолио, то этот код играет не в твою пользу.
Для портфолио лучше найди готовый код или плагин.
>>418370
По моему ты путаешь, у него там этот код внутри elseif и выполнится только одна ветка (вот видишь как он запутанно пишет, фиг поймешь что хотел написать).
>>418377
Они может и неплохие, но дают очень базовые знания, самые основы, с которыми ты ничего не сделаешь. Советую после них прорешать например мои задачки по этим темам или почитать другие книги.
>>418380
В дампе в формате SQL. Сделать дамп в консоли можно командой mysqldump, а в других программах обычно есть кнопка или опция.
Не выкладывай команды создания БД и юзеров типа
CREATE DATABASE
USE
GRANT
Должны быть только команды создания таблиц, и может быть INSERT для вставки данных.
И еще. Я вижу у тебя там файл bowerrc? Молодец, тогда js библиотеки добавляй через bower
bower — это аналог композера для JS библиотек (на мой взгляд, более слабый кстати). По идее его надо скачивать через npm (и установить Node.js для npm), но там в Yii есть какая-то хрень чтобы это работало за счет композера, без самого bower. Надо разобраться, в общем.
Еще, удали неисплоьзуемые папки и файлы, чтобы не мешались. Потом если что создашь ручками.
По твигу, я нашел ответ тут, как в нем вызывать стандартные классы и функции: http://www.yiiframework.com/doc-2.0/guide-tutorial-template-engines.html#twig
Вот тут про работу с bower-пакетами в Юи: http://www.yiiframework.com/doc-2.0/guide-structure-assets.html#bower-and-npm-assets
Вот тут про то как работает настоящий bower: http://bower.io/
>Насчет миграций, я вижу ты down не делал, хорошо, это обычно не требуется. Но в других фреймвокрках, вроде Ruby On Rails, миграции сделаны интереснее. Там ты не пишешь SQL код, а команды вроде таких:
В yii2 тоже есть что-то подобное, но я не захотел этим пользоваться.
>Этого в миграции быть не должно. Система миграций никогда не выполнит ее повторно.
Это я пока что для себя оставил. Я вангую, что буду переделывать много чего в ближайшее время и в наглую дропать таблицу с миграциями.
>Автора пока не надо делать, если пользователей нет.
Это я оставил как просто имя автора.
>Не очень понятен смысл этих полей если их значение легко считается.
Баллы там вообще не нужны, я их хотел в Question добавить, но, видимо, засыпая уже совсем куда попало писал. С числом вопросов - все же считать?
>Ты знаешь что в Yii есть базовый класс для моделей с ActiveRecord? Или ты по каким-то причинам не хочешь его использовать?
Мне как-то мапперы больше понравились, чем AR. Но в doctrine 2 я лезть пока что побаиваюсь. Попробую смочь в ar.
>Отдельная тема — что делать с разными классами вопросов?
Ну я изначально планировал общие поля, которые в базовом классе есть, хранить полями таблицы, а специфичное для класса, в том числе и сам класс, хранить в json строке. Другой вариант, о котором я думал, это создать таблицу для общих данных и по таблице на каждый специфичный класс. В первой же хранить и имя класса, чтобы знать в какие таблицы ломиться. Я как-то забыл, что все придумано до меня. Почитаю ссылки чуть позже.
>Если у тебя есть сущность Test то логично возвращать массив этих Test
Я пока там обозначил методы, чтобы хоть как-то представлять, что там будет, над тем, что оно там возвращает, я еще не думал даже.
>Насчет формы, почитай что есть в Yii для этого
Я еще не читал особо, но думал, что формы там для работы с полученными данными, а не для вывода. Почитаю еще.
>Изменения в БД наверно надо будет сделать новой миграцией, либо исправить старую.
Пока что буду править старую.
>>418378
> И да, я не знаю, как этот грид вызвать из твига так что будем считать это дополнительной задачей, разобраться с этим).
Я там просто пропускаю сначала через render от Yii, а затем результат отправляю в Twig. Не знаю, насколько это адекватное решение.
>Насчет миграций, я вижу ты down не делал, хорошо, это обычно не требуется. Но в других фреймвокрках, вроде Ruby On Rails, миграции сделаны интереснее. Там ты не пишешь SQL код, а команды вроде таких:
В yii2 тоже есть что-то подобное, но я не захотел этим пользоваться.
>Этого в миграции быть не должно. Система миграций никогда не выполнит ее повторно.
Это я пока что для себя оставил. Я вангую, что буду переделывать много чего в ближайшее время и в наглую дропать таблицу с миграциями.
>Автора пока не надо делать, если пользователей нет.
Это я оставил как просто имя автора.
>Не очень понятен смысл этих полей если их значение легко считается.
Баллы там вообще не нужны, я их хотел в Question добавить, но, видимо, засыпая уже совсем куда попало писал. С числом вопросов - все же считать?
>Ты знаешь что в Yii есть базовый класс для моделей с ActiveRecord? Или ты по каким-то причинам не хочешь его использовать?
Мне как-то мапперы больше понравились, чем AR. Но в doctrine 2 я лезть пока что побаиваюсь. Попробую смочь в ar.
>Отдельная тема — что делать с разными классами вопросов?
Ну я изначально планировал общие поля, которые в базовом классе есть, хранить полями таблицы, а специфичное для класса, в том числе и сам класс, хранить в json строке. Другой вариант, о котором я думал, это создать таблицу для общих данных и по таблице на каждый специфичный класс. В первой же хранить и имя класса, чтобы знать в какие таблицы ломиться. Я как-то забыл, что все придумано до меня. Почитаю ссылки чуть позже.
>Если у тебя есть сущность Test то логично возвращать массив этих Test
Я пока там обозначил методы, чтобы хоть как-то представлять, что там будет, над тем, что оно там возвращает, я еще не думал даже.
>Насчет формы, почитай что есть в Yii для этого
Я еще не читал особо, но думал, что формы там для работы с полученными данными, а не для вывода. Почитаю еще.
>Изменения в БД наверно надо будет сделать новой миграцией, либо исправить старую.
Пока что буду править старую.
>>418378
> И да, я не знаю, как этот грид вызвать из твига так что будем считать это дополнительной задачей, разобраться с этим).
Я там просто пропускаю сначала через render от Yii, а затем результат отправляю в Twig. Не знаю, насколько это адекватное решение.
>Считает неверно. Там не 60262 получается, а около 61270. Потому что анон, который только что выплатил 5000 не может заплатить 262 и должен подождать месяц, за который набегут проценты.
А как это провернуть?
Что ж, тогда, пожалуй, берусь за задачи...Спасибо за разъяснение.
> В yii2 тоже есть что-то подобное, но я не захотел этим пользоваться.
Я советую попробовать, чтобы научиться, ну и заодно проверить, заработает ли?
Также, там упоминается возможность завернуть миграцию в транзакцию. В MYSQL DML команды (создание/изменение/удаление таблиц и баз) вызвыают неявный коммит и в транзакцию их положить нельзя (увы).
Кстати, я поймал себя на мысли, что можно было заставить тебя использовать PostgreSQL вместо MySQL, если ты последнюю уже хорошо изучил.
> Я вангую, что буду переделывать много чего в ближайшее время и в наглую дропать таблицу с миграциями.
Тогда сделай метод down и откатывай миграции нормальными стандартными средствами.
А вообще, лучше писать миграции так чтобы в одной была только одна команда. Тогда, если она не срабоатет, то в БД ничего не изменится и ты можешь исправить ее (если бы в MySQL были транзакции для DML очевидн опроблем бы не было).
Ну и еще, я подумал, править миграции неправльно. Ведь миграция связана с изменениями в коде (в том же коммите в котором ты добавил обращение к новому полю, ты должен сделать миграцию добавляющую это поле). Если ты закоммитил миграцию, то отменить ее можно только новой миграцией.
> С числом вопросов - все же считать?
Для одного теста их можно посчитать через COUNT. Если надо вывести список тестов + число вопросов не в админке, а на сайте, стоит сделать поле ради скорости. Но тогда появляется боль по поддержке актуальных значений в этом поле (с нормализованными, то есть неизбыточными, данными работать проще).
> Я как-то забыл, что все придумано до меня.
Вот-вот. Потому я и прошу всегда выкладывать код сразу, чтобы такое увидеть.
> Попробую смочь в ar.
Мне доктрина нравится больше, но AR это чуть ли не основа Yii так что ее надо знать, в том числе как строить в ней отношения между сущностями.
> что формы там для работы с полученными данными, а не для вывода.
Формы там для вывода форм и обработки отправленных POST-данных. Если тебя устраивает стандартный шаблон, ты можешь вообще форму вывести одной командой, не мучаясь с html кодом. То есть знать их надо обязательно. Ну и валидация с ними проще. Плюс, они умеют в аякс-валидацию (но ее надо наверно будет подстроить под наши нужды).
> Я там просто пропускаю сначала через render от Yii, а затем результат отправляю в Twig. Не знаю, насколько это адекватное решение.
Там я где-то дал ссылку, описано как это делать.
А, на случай если ты не знаешь что такое «DML команды», «DDL», ссылка: http://webadequate.ru/rabota-s-bd-mysql/43-grading_sql_commands.html
Это общепринятые термины из SQL (то есть не только к MySQL относятся) и хорошо бы их знать.
>>418391
Вот так вывернулся http://ideone.com/CZReIO.
Как сделать, что-бы оно просто месяц еще один отсчитало, и потом всё считало, что осталось?
Разбить формулу на несколько частей, а не считать все сразу до проверки остатка?
>Если надо вывести список тестов + число вопросов не в админке, а на сайте, стоит сделать поле ради скорости.
Ну я именно для этого его и ввел. Я почему-то решил, что делать 50 запросов для вывода инфорации по 50 тестам - это как-то круто.
>>418395
>Также, там упоминается возможность завернуть миграцию в транзакцию.
Для этого надо использовать saveUp и saveDown вроде бы, а в них использовать команды, а не sql код.
В общем я дострадаю с формой добавления вопроса и полезу копаться в бд.
> делать 50 запросов для вывода инфорации по 50 тестам - это как-то круто.
Вообще-то можно сделать JOIN + GROUP BY + COUNT и получить число вопросов одним запросом. Это конечно тоже создает нагрузку, но быстрее чем 50 запросов. Может тебе задачки на SQL потом порешать еще стоит?
> Для этого надо использовать saveUp и saveDown вроде бы, а в них использовать команды, а не sql код.
да, но в MySQL это все равно не работает, так что можешь не мучаться.
>Опубликуй код где-нибудь, я гляну (и может кто из анонов заинтересуется). Алсо, напиши как ты запускаешь тесты.
Пожалуйста: http://ideone.com/rgNOkb, тут сама библиотека не подключается, поэтому ошибка.
Запускаются они в браузере, на пике видно, как это выглядит. Просто пустой html файлик, в нем подключаю библиотеку, свои файлы с кодом, который надо протестировать, и файлы с тестами.
О, да это же отличные тесты! Ты правильно делаешь, что их пишешь. И отчет симпатичный получается.
Насчет скорости, ты бы мог найти или сделать сниппеты для саблайма, чтобы при вводе например it(tab) он раскрывался в полноценную функцию. Если у тебя таких нет, то гугл выдает первой же ссылкой https://github.com/caiogondim/jasmine-sublime-snippets
Я думаю, на более сложных задачах соотношение будет лучше.
А ты не хочешь выкладывать код тестов куда-нибудь на гитхаб например? Я может мог его давать другим анонам, для самопроверки например (хотя конечно тут еще вопрос, сможет ли анон разобраться с установкой жасмина и с английским)
>>418406
Потому что DDL команды (вроде CREATE TABLE) делают неявный коммит и тем самым транзакция коммитится на первой же команде (а должна только если все команды выполнились): http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html
В MySQL транзакции работают только для DML команд, и то с исключениями. Транзакции работают только с InnoDB таблицами.
Не, давай лучше сделаем как я посоветовал тут:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
А то код слишком сложный будет.
Считает теперь правильно, но всёравно с костылём.
И хрен знает, как сделать, что-бы считало нормально.
Читаю не глазами, видимо.
>Note: Not all DBMS support transactions. And some DB queries cannot be put into a transaction. In this case, you will have to implement up() and down(), instead. In the case of MySQL, some SQL statements may cause implicit commit.
> if (($credit + $proc + $komis) < $platez) {
Нельзя складывать процент и число, надо умножать
Ну и посмотри, у тебя формула из $credit + $proc + $komis аж 3 раза скопирована. Нехорошо ведь копипастить. Надо вынести это куда-то в переменную, чтобы повторов не было.
Если дать маленькую сумму вроде 1000, то считает неверно и уходит в минус: http://ideone.com/sujrHy
Ну и еще, не называй в следующий раз переменные по русски. Не знаешь английский — не беда, используй гугл транслейт.
Также, отформатируй свой код на phpformatter.com
Ссылка: http://habrahabr.ru/post/246331/
>А ты не хочешь выкладывать код тестов куда-нибудь на гитхаб например?
без проблем, потом кину ссылку на репозиторий.
>Насчет скорости, ты бы мог найти или сделать сниппеты для саблайма, чтобы при вводе например it(tab) он раскрывался в полноценную функцию. Если у тебя таких нет, то гугл выдает первой же ссылкой https://github.com/caiogondim/jasmine-sublime-snippets
О, вот это полезно, возьму на вооружение.
Тесты в наборе, кстати, можно запускать, как все вместе, так и по одному. Если хоть один не проходит, весь набор не проходит.
И я еще добавлю, что тесты скорее всего можно запускать без браузера, из командной строки. Это понадобится если ты например хочешь сделать сервер (CI server), который при каждом коммите прогоняет тесты и в случае ошибок рассылает письма или пишет в джаббер разработчикам. Это помогает выявить ситуации, когда при правке кода ты ломаешь какую-то другую функцию, зависящую от него.
>>418417
Трип код не выводится при отправке из всплывающего окна почему-то, и стирается при очистке кук, я иногда ленюсь его вводить.
Ты команду if знаешь?
Надо проверить что остаток меньше 5000.
Если (долг мень чем максимальная выплата) {
то выплачиваем остаток и уходим;
}
Так я писал это - мне считало неправильно, ведь выплату нельзя делать по-своему. Нужно, чтобы еще один месяц посчитало, и потом выплату делать.
Ты просто в этой строчке
> $credit = ($credit $proc) + $komis - $platez;
Выплачиваешь сразу 5000. А если долг всего 1000, зачем платить 5000? Надо выплатиь сколько осталось. Это неправильно же. Надо эту строчку переделать.
Вот, в yii2 при создании из расширенного шаблона получаются 2 этих модуля. Если считать бекендом в данном случае админку, а фронтендом всё остальное, то не слишком ли жирно админку выделять в отдельную штуку? Ведь можно просто создать какой-нибудь AdminController. Или я что-то не так понял?
Фронтенд это все что выполняется на клиенте, то есть в браузере, бекенд это все что выполняется на сервере. yii написан на php, следовательно это бекенд.
Ох ты наивный юноша. В любом более-менее развитом сайте в админке со временем будет не 1, а десятки контроллеров скорее всего.
А так, не знаю, тебя же никто не заставляет на 2 проекта все разделять. Хочешь, делай все в одном, хочешь разделяй. Там это скорее всего чтобы продемонстрировать что такая возможность есть.
>>418436
> 1 месяц спустя: долг = -2970 руб, выплачено всего 5000 руб.
> выплачено 2940.9
Я бы не сказал, что правильно. Во-первых, получается 2030, а не 2490, во-вторых попробуй сам перечитать то что твоя программа пишет — тут вообще логики нет. Например зачем выплачивать 5000 когда долг составляет гораздо меньше?
Не, не обязательно, иногда бекендом называют админку. Ну и вообще, если система состоит например из нескольких слоев, то фронтендом и бекендом могут называть их.
>попробуй сам перечитать то что твоя программа пишет — тут вообще логики нет.
Я слаб в таких вещах, подстраивал под условия задачи.
>Например зачем выплачивать 5000 когда долг составляет гораздо меньше?
А как это сделать?
> А как это сделать?
Я же уже раза 3 написал, надо переделать алгоритм программы, чтобы внутри цикла было так:
- прибавляем проценты и комиссию к остатку долга. Не вычитаем 5000 как это сделано у тебя.
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
>- если остаток маленький, выплачиваем сколько осталось и уходим
Я уже три раза не понял этот пункт.
Если ты не понял, надо было в первый раз и задавать вопросы.
Ну «уходим» — это очевидно команда break которая завершает цикл и выходит из него.
«выплачиваем сколько осталось» — это значит смотрим чему сейчас равен остаток долга, и уменьшаем остаток долга на это значение. Если осталось 300 — платим 300, если осталось 400 — платим 400 и т.д. Ну и конечно учитываем эту сумму в общей выплате.
А, и не беспокойся, эта задача практически у всех сложность вызывает. Потому что там в примере специально дан неправильный код и почти никто не догадывается его изменить почему-то.
Попробуй сначала высчитывать сумму баланса, затем проверять не меньше ли он наших регулярных выплат, и лишь затем вычитать из него выплату.
Но сумма баланса высчитывается каждый месяц и автоматически проверятся же. Блин, я вообще не понимаю, что делать надо.
Да, но она не только высчитывается, с неё сразу же снимается сумма выплаты. А так делать нельзя, ведь мы можем переплатить и долг уйдет в минус. Сначала проверяй остаток, затем плати, вот такой должен быть алгоритм.
Точнее, в середину его выполнения.
Что значит в середину цикла? Я не понимаю вопроса. Ты можешь куда угодно эту проверку засунуть, тебе никто не запрещает.
Попытался засунуть в 13 строку, как условие, при котором будет то, что ниже считаться.
Скрипт вообще ничего не выдал мне.
Извини, но я не вижу на скриншоте ни 13 строку, ни проверку. Скидывай тогда уж весь код на айдеоне, чтобы я мог понять что не так.
У тебя проверка выглядит так:
Если баланс меньше или равно выплатам то мы считаем.
А так как у нас баланс изначально больше, мы вообще ничего не делаем.
Там внизу написано в чем ошибка. Ты с маленькой буквы написал переменную. $creditbalance не равно $creditBalance.
> if ($creditBalance < $paymentTotal)
Что это за условие? Зачем тебе сравнивать кредитный баланс с выплаченной суммой?
Два условия не нужно. У тебя за один месяц может быть две выплаты: сначала кредит проходит первую проверку и от него отнимается монсли пеймент, затем кредит становится меньше месячной выплаты и когда доходит до второй проверки от него отнимается еще раз уже оставшаяся сумма. Намного проще убрать второй if а в первом просто убрать рассчет баланса (поставить его после проверки). Все, что нам нужно это лишь поменять переменную MonthlyPayment, чтобы она платила не 5к, а столько, сколько нам нужно (то есть то, что ты сделал во втором блоке if).
Сумбурно объяснил, но надеюсь ты понял. Ну если нет, дождись опа, он то уж точно все по полочкам разложит.
Хотя не, break можно оставить.
http://ideone.com/c8xakQ
Не считает 12й месяц. Если поставить чтобы считало - не будет 13й считать. Если и его сделать - не будет работать на мелкие суммы.
Точнее не расчет баланса, а вычет из него месячной выплаты боже, что со мной, я уже не могу выражать свои мысли
В том то и дело, ты вычитаешь из баланса выплату, а потом проверяешь, сколько какой у тебя баланс. Хотя логика должна быть такая:
1.Проверяем сколько осталось.
2. Платим.
У тебя логика такая:
1.Платим
2. Проверяем сколько осталось.
Я, конечно, мог бы скинуть тебе решение. Но тебе от этого легче не станет, поверь. Лучше реши всё сам завтра.
> $creditBalance = $servicePayment - ($creditBalance $percent);
Что делает эта строка? Зачем ты из комиссии вычитаешь долг?
По моему, ты запутался. Надо наверно написать код заново.
Давай писать по частям:
- напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
- допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
- допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
- наконец, допиши код, который платит эту сумму, уменьшая долг и считает сколько всего выплачено
Мне даже стыдно заливать на гитхаб свой гавнокод. Тут много не моего кода, но то что скопировал - я понял как работает, осталось только это закрепить :3
В целом, осталось не выполнен только режим CROP, читаемое имя и загрузка по каталогам.
https://github.com/someApprentice/ThumbnailService
Должен сразу сказать, что я совершенно не освоил ООП. Т.е принцип его работы я понял, а чем отличается от процедурного способа не очень. Я бы мог сделать тоже самое процедурно. Может быть, если тебе будет не трудно, ты мог бы придумать мне потом задачку, чтобы я смог понять различия?
Было бы тебе проще если бы, я комментировал код? Раньше не разу не делал, но думаю делать это полезно.
> $db = new Database( );
> $replace = $db->newName($name);
Так же не красиво писать... Ладно, понимаю что не в красоте дело, но может быть есть какие-нибудь другие лаконичные способы вызвать отдельно метод? Совсем ни черта не понимаю это ООП.
>Ну и конечно «определить расширение файла» — это отдельная задача и она должна быть вынесена в отдельную функцию.
А у меня есть и такая функция :3 У меня просто здесь возникала надобность отделить расширение от имени чтобы точка не заменялась знаком подчеркивания.
Остальные твои замечания исправлю завтра, сейчас уже поздно. И хочу извинится за то что у меня возникают такие ошибки, самому хочется писать красивый няшный код, но не получается. Чувствую себя поганым троичнеком
http://ideone.com/x2tnBc
Давай разберем что написано в твоем регулярке, какие номера она ищет?
> "/^8[()-\\s]9115065656$/";
- в начале должна идти цифра 8
- после нее может идти любое количество скобок, минусов, пробелов
- после них должны идти цифры 9115065656, без посторонних символов между ними
- цифра 6 примыкает к концу строки, и после нее ничего идти не должно
По моему, ты что-то напутал. Ты наверно хотел сделать по-другому?
Ну и еще. Эту задачу на номера надо будет проверить на большом числе телефонов, чтобы убедиться что она верно их определяет. Вот список:
Правильные: 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' // нет +
);
Руками их проверять по одному не надо. Сделай потом цикл, чтобы он перебирал все эти номера и проверял каждый регуляркой.
Давай разберем что написано в твоем регулярке, какие номера она ищет?
> "/^8[()-\\s]9115065656$/";
- в начале должна идти цифра 8
- после нее может идти любое количество скобок, минусов, пробелов
- после них должны идти цифры 9115065656, без посторонних символов между ними
- цифра 6 примыкает к концу строки, и после нее ничего идти не должно
По моему, ты что-то напутал. Ты наверно хотел сделать по-другому?
Ну и еще. Эту задачу на номера надо будет проверить на большом числе телефонов, чтобы убедиться что она верно их определяет. Вот список:
Правильные: 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' // нет +
);
Руками их проверять по одному не надо. Сделай потом цикл, чтобы он перебирал все эти номера и проверял каждый регуляркой.
С помощью [()-\\s] я пытался принимать правильные номера c любым количеством пробелов и т.д., а это не сработало.
Как мне обратиться к name нему через $_COOKIE? Я уже по разному перепробовал, ничего не работает.
>напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
Написал.
>допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
Если большой долг - нужно условие дописать, под первый пункт, ведь так?
А если маленький долг? Написать, "меньше или равно"?
>допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
А тут я вообще не понимаю. В случае, если сумма кредита выше суммы выплаты - то сумма выплаты будет 5000, что есть ежемесячная выплата.
Если сумма ниже - заплатить остаток? Тоесть сумма выплаты будет такая-же как оставшийся баланс кредита?
> Если большой долг - нужно условие дописать, под первый пункт, ведь так?
А если маленький долг? Написать, "меньше или равно"?
Ну суть в том что школьник может заплатить за раз не больше 5000. Потому если долг <= 5000 то он маленький, а если больше то большой. Программа должна каждый месяц писать примерно такое:
Прошел месяц 1, долг = 42000
Долг большой
Прошел месяц 2, долг = 44000
Долг большой
....
> Если сумма ниже - заплатить остаток? Тоесть сумма выплаты будет такая-же как оставшийся баланс кредита?
Да. к примеру это может выглядеть так:
Прошел месяц 1, долг = 42000
Долг большой
Могу заплатить 5000
Прошел месяц 2, долг = 44000
Долг большой
Могу заплатить 5000
....
А если долг маленький то так:
Прошел месяц 1, долг = 2030
Долг маленький
Могу заплатить 2030
Прошел месяц 1, долг = 4030
Долг маленький
Могу заплатить 4030
....
(пока платить не надо, просто написать сколько бы заплатил)
> Если большой долг - нужно условие дописать, под первый пункт, ведь так?
А если маленький долг? Написать, "меньше или равно"?
Ну суть в том что школьник может заплатить за раз не больше 5000. Потому если долг <= 5000 то он маленький, а если больше то большой. Программа должна каждый месяц писать примерно такое:
Прошел месяц 1, долг = 42000
Долг большой
Прошел месяц 2, долг = 44000
Долг большой
....
> Если сумма ниже - заплатить остаток? Тоесть сумма выплаты будет такая-же как оставшийся баланс кредита?
Да. к примеру это может выглядеть так:
Прошел месяц 1, долг = 42000
Долг большой
Могу заплатить 5000
Прошел месяц 2, долг = 44000
Долг большой
Могу заплатить 5000
....
А если долг маленький то так:
Прошел месяц 1, долг = 2030
Долг маленький
Могу заплатить 2030
Прошел месяц 1, долг = 4030
Долг маленький
Могу заплатить 4030
....
(пока платить не надо, просто написать сколько бы заплатил)
header("Location ....");
Погугли про HTTP редирект. Если кратко, то сервер может отдать вместо страницы заголовок с указанием URL и браузер перейдет по нему.
Вот что стоит почитать:
http://portscan.ru/article-protocol-http.html
http://habrahabr.ru/post/215117/
https://ru.wikipedia.org/wiki/HTTP
заметь, что это все статьи про протокол HTTP. Разумеется, ты должен иметь о нем представление, так как браузер общается с сервером именно по этому протоколу.
Для редиректа используется код ответа 3xx и заголовок Location c адресом. PHP сам выставит нужный код при передаче этого хзаголовка, потому тебе хватит команды header. Ознакомься с мануалом по ней:
http://php.net/manual/ru/function.header.php
>>418533
Анон, я проверю твой код и все подробно напишу, но попозже, вечером наверно, сейчас некогда.
Это не сработало потому что твой шаблон выглядит так:
8 (доп. символы) 9115065656
То есть у тебя символы могут находиться только между 8 и 9 а не между любыми цифрами.
Если хочешь, можно пока решить задачку на регулярки попроще:
Дан текст. Определи, есть ли в нем автомобильный номер, и если да, то выведи его. Автомобильный номер имеет вид:
(русская буква) (3 цифры) (2 русских буквы)
Пример текста:
$text = "это не номер ааааа123ррррр а это номер у123уу"
Программа должна вывести:
Номер есть в тексте: у123уу
Теперь после того как ты написал, сколько ты можешь заплатить, надо заплатить эту сумму. «заплатить» значит уменьшить остаток долга и увеличить общую сумму выплаченного.
Например, «заплатить тысячу» значит уменьшить остаток долга на тысячу и увеличить общую сумму выплаченного на тысячу.
Также, надо добавить условие: если после выплаты долг стал меньше или равен нулю — выходим из цикла и пишем общую сумму выплаченных денег.
> \tif ($creditBalance >= $monthlyPayment) {
> if ($creditBalance <= $monthlyPayment) {
Эти условия не взаимоисключающие. Если долг равен ровно 5000 то сработают оба ифа. Чтобы такого не было, используй else (иначе):
Если (долг >= максимума) {
делаем что-то одно;
} иначе {
делаем что-то другое;
}
В остальном, хорошо пока что.
Я вижу, ты в случае большого долга сделал выплату — сделай ее и в случае маленького, чтобы выплатить sumToPay.
И добавь проверку отдельно после всего этого, что если долг дошел то нуля после выплаты то выходим из цикла.
А правда, что переменная, записанная в одном условии не переносится в другое?
А то у меня нестыковочки.
Решение автомобильного номера я помню, его уже проходили в примерах. Проблема ведь остается, решение мне не помогло.
>\tif ($creditBalance >= $monthlyPayment) {
>$creditBalance = ( $creditBalance $percent ) + $servicePayment;
Тут ошибка. Ты должен сначала добавить процены, а потом смотреть, большой долг или нет.
Ты сделал наоборот, в итоге процент начисляется только если долг большой, а должен начисляться всегда.
Также, ты почему-то сначала пишешь сколько всего уплачено, а только потом увеличиваешь это число. А должно быть наоборот:
> \techo "На $month месяц. Кредит: $creditBalance. Долг маленький. Могу заплатить $sumToPay Уплачено: $paymentTotal \n";
....
> $paymentTotal = $paymentTotal + $sumToPay;
Почему ты в таком пояркде делаешь? Разве не логично общую суммы уплаченного писать после того как ты ее увеличил, а не до?
переменная существует с того момента как ты ее создал командой
$x = ....
и до конца выполнения программы
if (($creditBalance $percent) + $servicePayment) >= $monthlyPayment) {
Вот так нужно?
> \techo "На $month месяц. Кредит: $creditBalance. Долг маленький. Могу заплатить $sumToPay Уплачено: $paymentTotal \n";
....
> $paymentTotal = $paymentTotal + $sumToPay;
Это я >>418509 по этому образцу делал, что-бы видеть, сколько было до уплаты и после уплаты стало.
вот только ошибка какая-то там.
> Вот так нужно?
Нет, неверно.
Надо сделать 2 отдельных действия:
- прибавить проценты
- проверить блоьшой ли долг если да то одно, если нет то другое
Ну подуамй сам: сначала проходит месяц, начисляются проценты и только после этого анон приходит платить по кредиту, а не наоборот.
Именно в таком порядке. Не стоит прибавление процентов внутрь if засовывать.
И я опять застрял. Код выдает а123рр, когда должен выдавать у123уу. Не понял каким образом нужно обходить повторяющиеся буквы вроде аааааа.
http://ideone.com/c7pdEe
Мы сделали решение задачи? А что иименно тебе непонятно, какая-то строчка или все в общем?
Но оно пока не окончательно. Есть одна вещь, которая мне не нравится, а именно почти похожие строчки тут:
$creditBalance = $creditBalance - $monthlyPayment;
$paymentTotal = $paymentTotal + $monthlyPayment;
и тут
$creditBalance = $creditBalance - $sumToPay;
$paymentTotal = $paymentTotal + $sumToPay;
Ну и echo повторяется. Попробуй избавитьяс от повторов.
Также, вместо
a = a + b
можно писать
a += b
Аналогично с вычитанием.
> Не понял каким образом нужно обходить повторяющиеся буквы вроде аааааа.
У тебя нет никаких условий, что должно идти перед или после номера. Надо очевидно их добавить.
В регулярках для этого есть простые условия, а также assertions ( http://php.net/manual/ru/regexp.reference.assertions.php ).
Вот простые условия:
^ значит что текст примыкает к началу строки например ^abc значит что слово abc должно находиться в самом начале строки
$ значит что примыкает к концу строки то есть xyz$ значит что xyz должно находиться в самом конце строки
\b значит что в этом месте должна быть граница слова, то есть с одной стороны от \b располагается буква или подчеркивание, а с другой — небуква.
Например abc\b найдет "abc" в фразе "abc def" но не найдет в "abcdef" так как тут условие «справа от с должна быть не буква» не выполняется
\B — простивоположное условие, оно значит что справа и слева от него должны быть либо обе буквы, либо обе не-буквы.
Например abc\B найдет "abc" в строке "abcdef" и не найдет в "abc def" так как тут условие не выполняется.
Также, ест более сложные условия вида «справа/слева должно быть/не должно быть этих символов». Например
abc(?!def)
ищет слово abc справа от которого нет букв def. То есть оно найдет abc в строках "abcxzy", "abcdfe", "abc def" и не найдет в "abcdef"
Подробнее:
http://php.net/manual/ru/regexp.reference.escape.php
http://php.net/manual/ru/regexp.reference.assertions.php
Думаю, одно из этих условий поможет тебе решить задачу.
> Не понял каким образом нужно обходить повторяющиеся буквы вроде аааааа.
У тебя нет никаких условий, что должно идти перед или после номера. Надо очевидно их добавить.
В регулярках для этого есть простые условия, а также assertions ( http://php.net/manual/ru/regexp.reference.assertions.php ).
Вот простые условия:
^ значит что текст примыкает к началу строки например ^abc значит что слово abc должно находиться в самом начале строки
$ значит что примыкает к концу строки то есть xyz$ значит что xyz должно находиться в самом конце строки
\b значит что в этом месте должна быть граница слова, то есть с одной стороны от \b располагается буква или подчеркивание, а с другой — небуква.
Например abc\b найдет "abc" в фразе "abc def" но не найдет в "abcdef" так как тут условие «справа от с должна быть не буква» не выполняется
\B — простивоположное условие, оно значит что справа и слева от него должны быть либо обе буквы, либо обе не-буквы.
Например abc\B найдет "abc" в строке "abcdef" и не найдет в "abc def" так как тут условие не выполняется.
Также, ест более сложные условия вида «справа/слева должно быть/не должно быть этих символов». Например
abc(?!def)
ищет слово abc справа от которого нет букв def. То есть оно найдет abc в строках "abcxzy", "abcdfe", "abc def" и не найдет в "abcdef"
Подробнее:
http://php.net/manual/ru/regexp.reference.escape.php
http://php.net/manual/ru/regexp.reference.assertions.php
Думаю, одно из этих условий поможет тебе решить задачу.
Суть её очень проста: покупаешь героев, фармишь мобов, убиваешь боссов. И можно сказать, что у меня возникло сильное желание запилить нечто подобное, и я уже даже знаю что там будет. Но так как я простая воннаби-макака из пхп треда, то понимаю, что с инструментами которыми я сейчас владею, я ничего такого сделать не смогу. Собственно у меня вопрос. Можно ли нечто подобное реализовать на JS? Причем меня абсолютно не интересует крутизна векторного графона и прочих ништяков. Могу хоть палочками и кружочками визуальную часть для начала сделать. А интересует именно сможет ли всё это дело вертеться на скриптовом языке? Как я понимаю JS как и пхп выполняется по мере чтения интерпритатором? Или все начнет дико тупить когда дело дойдет до просчета больших чисел? Не хочется бросаться в изучения флеша например, если можно сделать на том, что в перпективе всё равно собирался изучать. А еще такой вопрос: JS всегда с открытым кодом, и никак нельзя будет защитить свою поделку от чужих глаз? Любой сможет посмотреть мой говномакакинг и поливать меня говном?
Ну и вдруг кого-то заинтересовала подобная фигня, и он хочет совместно запилить клико-дрочильню в браузере?
http://ideone.com/OxC7Uy вот так вот можно попробовать. До этого пытался поставить вначале и в конце регулярки [^а-яА-Я]? но он все равно находил а123рр хотя по логике не должен, ведь перед ним стоят буквы, которые мы исключаем [^]. Что-то я позабыл регулярки.
Обосрался с игры, реально для аутистов. Могу посоветовать пройти задачки ОПа а потом сходить на гитхаб и посмотреть там игровые движки на JS.
> До этого пытался поставить вначале и в конце регулярки [^а-яА-Я]? но он все равно находил а123рр хотя по логике не должен, ведь перед ним стоят буквы, которые мы исключаем [^]. Что-то я позабыл регулярки.
Ну так у тебя там знак вопроса, то есть поле номера не-буква может быть, а может и не быть. Эта проверка ничего не проверяет.
Я тебе дал список условий — они могут решить эту задачу.
также, у тебя идет повторение:
[0-9] повторено 3 раза. Избавься от повторов. Для этого пригодится одна из этих коснтрукций: http://php.net/manual/ru/regexp.reference.repetition.php
Ну так у тебя там знак вопроса, то есть после номера не-буква может быть, а может и не быть. Эта проверка ничего не проверяет.
Ну я хотел что-то с большим количеством механик реализовать, что бы суть осталась та же примерно, типа грейдишь героев и они сами дерутся, а ты изредко прожимаешь абилки, но что бы монстры тоже дрались в ответ и был шанс соснуть у них, и пати была не просто набор одинаковых дамагеров, а танк, хиллер и тп.
>>418736
Не дошел еще. Как я понимаю ты клонишь к тому, что мне нужно постичь основы ООП, для реализации подобных вещей? Что бы прописать грамотно всевозможные классы как герои, монстры, боссы и их взаимодействие?
>ты клонишь к тому, что мне нужно постичь основы ООП, для реализации подобных вещей
Не совсем, хотя и это тоже. Просто у тебя будет представление о том, как писать что-то подобное играм и надо ли оно тебе вообще. Без готового движка писать придется очень дохуя, проще файлообменник запилить.
Код покажи?
> Возвращаясь к первой задаче, мне так и не открылась истина, каким образом пробелы отделяются от текста.
Для этого мы решим еще одну вспомогательную задачу. Дана строка, найди в ней число. В числе цифры могут быть разделены пробелами или точками (а могут не быть), число может содержать любое число цифр:
1 000 000
123456
1.000.000
2.000 345
Надо вывести есть ли в строке число и если есть то вывести его без лишних символов, только цифры.
там смысл игры очень прост же? Если бы ты поиграл малость, то ты понял, что все монстры имеют только 2 параметра: хп и бабло, которые не нужно прописывать под каждый левел, а расчитывается по фромуле. Всё так же и с героями. Я бы думаю что смог даже что-то подобное запилить на паскале, на школьных знаниях, вопрос только в том, что там я не смогу реализовать несколько независимых процессов как например "бой" и прокачка героев, да и вообще там нет мышки и всё кастыльно. Плюс начать можно же с очень простой игры, а потому уже допиливая функционал обвешивать её вкусностями и механиками.
>проще файлообменник запилить.
На это у меня не стоит, отношусь к файлообменнику как к тестовому заданию какому-то. А от идей для игры в моей голове у меня аж зуд и дикое желание их воплотить, понимаешь?
Тебе нужен яваскрипт + php или node.js если хочешь сохранять данные на сервере и обеспечить мультиплеер.
У меня есть задачи на яваскрипт, хорошие.
https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Чтобы рисовать игру, можно испльзовать DOM когда объектов немного, а еще лучше освоить канвас.
Насчет производительности — если не будет сотни тысяч объектов и не будешь пытаться сделать сложный графон то проблем не будет, яваскрипт не такой и медленный.
>Тебе нужен яваскрипт + php или node.js если хочешь сохранять данные на сервере и обеспечить мультиплеер.
Для начала без серверной части, а просто аутичная кликалка в браузере, и без мультиплеера тоже.
>У меня есть задачи на яваскрипт, хорошие.
По этой ссылке есть вся нужная ньюфагу инфа для решения, или нужно допольнительно читать учебники?
>Чтобы рисовать игру, можно испльзовать DOM когда объектов немного, а еще лучше освоить канвас.
Не понял ничего отсюда.
>Насчет производительности — если не будет сотни тысяч объектов и не будешь пытаться сделать сложный графон то проблем не будет, яваскрипт не такой и медленный.
Графон как я сказал меня устроит из точек и палчек для начала, про производительность скорее интересует не куча объектов на экране / в памяти, а не станет ли все тупить когда хп у мобов дойдут до 999999999999999999999999999999999999, а дамаг у героя станет 45766794534678674345356732423243 и все это будет по многу раз в секунду суммироваться и параллельно будут происходить другие штуки.
> росто аутичная кликалка в браузере
Тогда хватит яваскрипта (ну и основы HTML/CSS надо знать, у меня по ним тоже заадчки есть, это просто).
Яваскрипт имхо лучше флеша так как флеш умирает — на эппловских устройствах его нет и не будет.
> по многу раз в секунду суммироваться
Ты вряд ли способен с такой скоростью кликать чтобы там «много» получилось.
> хп у мобов дойдут до 999999999999999999999999999999999999
Если в числе больше 12 цифр то оно будет храниться в приблизительном формате, и часть цифр потеряется. Но ты вряд ли столько накликаешь, а если такая необходимость есть, придется искть математическую библиотеку (в флеше было бы то де самое).
> По этой ссылке есть вся нужная ньюфагу инфа для решения
Там есть ссылки на учебники
http://ideone.com/p3QTCm
Слегка исправил.
Насчёт объяснений: интересует, почему мой способ не работал, а этот - работает, хотя, на мой взгляд, они одинаковы? В чём их различие?
НеТ, хотя это пофигу. Больше всего интересует - чего оно именно здесь посчитало 13й месяц, и всё это без костылей сработало?
Я для себя немного понял.
Суть же в том, что считает оно как и считает, ему пофигу.
Но, если сумма кредита больше суммы платежа, именно тогда оно платит ему сумму платежа. А если меньше - то платит ровно остаток.
Только непонятки, таки, с 13м месяцем. Блин, я поспешил, когда старые ЭХО удалял.
Ты что, сфоткал экран на телефон?
разобрался, спасибо
хорошие статьи и мысли по аутентификации.
Если ты захочешь вставить переменную $cat в строку "My $catalog.", то пхп будет искать вместо переменной $cat переменную $catalog, т.к. он не сможет понять где кончается название твоей переменной и продалжается строка.
Чтобы было правильно, придётся написать так "My {$cat}alog.".
http://php.net/manual/ru/language.types.string.php
Официальная доккументация написана очень просто и понятно, попробуй почитать её. http://php.net/manual/ru/
При этом сам JavaScript понадобится совершенно точно в любом случае. При использовании же его и на сервере, и на клиенте появляется возможность не реализовывать одни и те же вещи типа логики и валидации дважды.
Какие преимущества может дать мне PHP?
Потому что на JS писать невозможно. Там даже классов нет. Ты наверно ничего сложнее todo не писал.
На PHP тоже можно поднять простой сервер без Апача или нгинкс, тоже есть менеджер зависимостей.
И тут все бросились переписываты тонны php легаси на js, ага
> Там даже классов нет.
Прототипы ничем не хуже классов. И в JS хоть и есть всем известные ошибки, но нет многих нелепостей, которые есть в php (пример: http://ideone.com/55xaIa — слишком сложно для меня). Если так повёрнут на классах, есть ES6 (на сервере можно), ну или CoffeeScript, TypeScript и пр. Преимущества будут те же, что и от JS.
> Ты наверно ничего сложнее todo не писал.
Не много и не очень большие, но писал. Именно на прототипах и модулях. Остался уверен, что ничего не мешает написать в том же стиле что-то больше и серьёзнее, все необходимые средства абстракции в JavaScript для этого есть.
>>418867
Это хорошо, что уже можно, но я интересовался, что может мне дать PHP, чего нет в экосистеме JavaScript. Или всё сводится к языковым предпочтениям?
setcookie("studentscookie","", time()-3600); поставил, но на странице все равно залогинен.
Добрачую тебе антуанчик
Добавь ключ для studentscookie, это массив у тебя вроде. Хотя лучше бы ты его сериализовал и ебнул куки один раз одной строкой.
>функция не должна изменять переданный ей массив
и тут как быть? Если это массив простых значений, то всё просто. А что, если нет? В этом случае надо клонировать каждый элемент, и над ним уже производить операции? Если да, то как глубоко надо клонировать? В смысле, каждый из этих объектов может хранить ссылки на другие объекты и таких уровней может быть очень глубоко. Что понимать, под "функция не должна изменять переданный ей массив"?
Функция должна создать и вернуть новый массив.
> Что понимать, под "функция не должна изменять переданный ей массив"?
Значит он должен остаться неизменным, также как и объекты на которые ссылается. Их клонировать не надо, просто надо создать новый массив, ссылающийся на те же самые объекты.
>Функция должна создать и вернуть новый массив
в этом нет сомненья, а вот это
>Значит он должен остаться неизменным, также как и объекты на которые ссылается. Их клонировать не надо, просто надо создать новый массив, ссылающийся на те же самые объекты.
Аа, то есть если после вызова map(fn, arr) изменятся объекты внутри arr, то сам массив как бы неизменился?
Массив это лишь набор ссылок на объекты. Если сами объекты поменялись кем-то другим то это не наша проблема.
Добавить условие «если сейчас вклбчена сортировка по жтому полю то выводим ссылку на обратную сортировку»
И не пиши html внутри echo. Читай про шаблоны http://www.phpinfo.su/articles/practice/shablony_v_php.html
Бамп.
окей, не будем дальше тянуть кота за яйца.
function map(fn, arr) {
\tvar res = [];
\tfor (var i=0; i<arr.length; i++) {
\t\tres = fn(arr);
\t}
\treturn res;
}
Правильно?
Почему такой вариант исключения [^.] не работает? Число нужно вывести без пробелов?
http://ideone.com/xaRkTs
Увы, нет. Я не знаю такой книги. Но знаю цикл уроков где например учат как сделать сайт на Симфони 2: http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html
Но чтобы понять этот цикл уроков, надо иметь хороший начальный уровень: нужно знать PHP, ООП, MVC, HTML/CSS, базы данных.
Вообще, из книг по PHP очень много устаревших и непрофессиональных. Две неплохих книги указаны в ОП-посте, но они не учат тебя делать интернет-магазины. Остальное можно найти только в сети.
Если тебе нужен интернет-магазин, незачем тратить на все вышеперечисленное время. Просто возьми готовый движок.
>>418533
Так, не спеши себя заранее критиковать. Сейчас я гляну твой код и раскритикую по-настоящему.
Ну, ты конечно сделал больше чем требовалось. Там требовалось просто сделать штуку, генерирующую уменьшенные копии картинок которые есть на диске, а ты еще и загрузчкик этих картинок сделал. Ну пусть будет, почему бы и нет.
Первое, что мне бросается в глаза — ужасная копипаста. Почти в каждый файл в начало вставлено
> spl_autoload_register(function ($className) {
> if(file_exists('Classes/' . $className . '.php')) {
Не надо так делать. Копипаста — зло, она раздувает код, затрудняет его понимание и поддержку. Надо соблюдать принцип «DRY» = Don't Repeat Yourself = Не повторяйся.
Потому почитай статью где упоминается этот принцип http://habrahabr.ru/post/144611/ и попробуй придумать, как сделать чтобы повторяющегося кода у тебя не было. Если не сможешь догадаться, попроси подсказку. Ну и больше не копипасти.
> Т.е принцип его работы я понял, а чем отличается от процедурного способа не очень. Я бы мог сделать тоже самое процедурно.
Ну, гм, то что у тебя и так очень напоминает процедурный стиль (а не настоящий ООП). Потому тебе наверно кажется что разницы нет.
Насчет ООП, он появился как решение проблемы «как не запутаться в огромной программе». Чтобы не запутаться, программа раскладывается на отдельные компоненты — классы, каждый из которых выполняет свою роль. Конечно, так это трудно понять и я попробую на примере твой программы объяснить как тут можно сделать эти компоненты.
> Было бы тебе проще если бы, я комментировал код? Раньше не разу не делал, но думаю делать это полезно.
Комментарии должны быть только в неочевидных местах, или там, где ты хочешь пояснить свою мысль, что-то такое, чего не видно из кода. А так, лучше стараться писать максимально очевидный код, делать хорошие названия у классов и функций. Ну и в начало файла можно добавлять комментарий, кратко поясняющий что в этом файле (очевидные вещи писать не надо. Если у тебя есть класс FileUploader не надо писать что это класс для загрузки файлов — это ясно из названия).
> Может быть, если тебе будет не трудно, ты мог бы придумать мне потом задачку, чтобы я смог понять различия?
Конечно, задачки я всегда готов придумывать. А ты решил задачку про кошек-мышек и задачку про ООО Вектор из учебника? Мне решения показывал? Если нет, то хорошо бы с них начать (и если ты хочешь, ты можешь решить их сначала процедурно, чтобы потом сравнить оба подхода). Если решил и я их проверил то можем придумать что-то еще.
-----
Теперь давай по коду пройдемся.
> if (Upload::extension($_FILES, $extension, $extensions)) {
> public function extension($files, $extension, $extensions) {
Это ошибка. Через двоеточие можно обращаться только к статическим функциям и свойствам. У тебя нет слова static в определении и такую функцию можно вызывать только на объекте:
$upload = new Upload( );
$upload->extension(...);
Я думаю, ты просто забыл слово static вписать. Кстати, PHP в таких случаях выводит предупреждение — ты его видел или у тебя отключен вывод предупреждений?
> if (
> ($files["file"]["type"] == "image/jpeg")
> || ($files["file"]["type"] == "image/jpg")
> || ($files["file"]["type"] == "image/pjpeg")
Это некрасивая копипаста. Тут можно написать короче за счет функции in_array.
Ну и я добавлю, MIME тип переданный браузером можно вообще не проверять, так как нет никаких гарантий что он соответствует содержимому файла. Раз так, незачем его проверять.
Название функции extension надо поменять. Название должно выглядеть как сделайЧтоТо() то есть начинаться с глагола. Придумай нормальное название.
Вот тут https://github.com/someApprentice/ThumbnailService/blob/master/upload.php#L12 у тебя пример плохого if-монстра. Неправильно, когда почти весь файл занимает один огромный if. Надо перевернуть этот if так, чтобы код был не в нем, а после или перед ним.
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
Придумай способ или попроси подсказку, как избавиться от гигантских ифов.
Увы, нет. Я не знаю такой книги. Но знаю цикл уроков где например учат как сделать сайт на Симфони 2: http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html
Но чтобы понять этот цикл уроков, надо иметь хороший начальный уровень: нужно знать PHP, ООП, MVC, HTML/CSS, базы данных.
Вообще, из книг по PHP очень много устаревших и непрофессиональных. Две неплохих книги указаны в ОП-посте, но они не учат тебя делать интернет-магазины. Остальное можно найти только в сети.
Если тебе нужен интернет-магазин, незачем тратить на все вышеперечисленное время. Просто возьми готовый движок.
>>418533
Так, не спеши себя заранее критиковать. Сейчас я гляну твой код и раскритикую по-настоящему.
Ну, ты конечно сделал больше чем требовалось. Там требовалось просто сделать штуку, генерирующую уменьшенные копии картинок которые есть на диске, а ты еще и загрузчкик этих картинок сделал. Ну пусть будет, почему бы и нет.
Первое, что мне бросается в глаза — ужасная копипаста. Почти в каждый файл в начало вставлено
> spl_autoload_register(function ($className) {
> if(file_exists('Classes/' . $className . '.php')) {
Не надо так делать. Копипаста — зло, она раздувает код, затрудняет его понимание и поддержку. Надо соблюдать принцип «DRY» = Don't Repeat Yourself = Не повторяйся.
Потому почитай статью где упоминается этот принцип http://habrahabr.ru/post/144611/ и попробуй придумать, как сделать чтобы повторяющегося кода у тебя не было. Если не сможешь догадаться, попроси подсказку. Ну и больше не копипасти.
> Т.е принцип его работы я понял, а чем отличается от процедурного способа не очень. Я бы мог сделать тоже самое процедурно.
Ну, гм, то что у тебя и так очень напоминает процедурный стиль (а не настоящий ООП). Потому тебе наверно кажется что разницы нет.
Насчет ООП, он появился как решение проблемы «как не запутаться в огромной программе». Чтобы не запутаться, программа раскладывается на отдельные компоненты — классы, каждый из которых выполняет свою роль. Конечно, так это трудно понять и я попробую на примере твой программы объяснить как тут можно сделать эти компоненты.
> Было бы тебе проще если бы, я комментировал код? Раньше не разу не делал, но думаю делать это полезно.
Комментарии должны быть только в неочевидных местах, или там, где ты хочешь пояснить свою мысль, что-то такое, чего не видно из кода. А так, лучше стараться писать максимально очевидный код, делать хорошие названия у классов и функций. Ну и в начало файла можно добавлять комментарий, кратко поясняющий что в этом файле (очевидные вещи писать не надо. Если у тебя есть класс FileUploader не надо писать что это класс для загрузки файлов — это ясно из названия).
> Может быть, если тебе будет не трудно, ты мог бы придумать мне потом задачку, чтобы я смог понять различия?
Конечно, задачки я всегда готов придумывать. А ты решил задачку про кошек-мышек и задачку про ООО Вектор из учебника? Мне решения показывал? Если нет, то хорошо бы с них начать (и если ты хочешь, ты можешь решить их сначала процедурно, чтобы потом сравнить оба подхода). Если решил и я их проверил то можем придумать что-то еще.
-----
Теперь давай по коду пройдемся.
> if (Upload::extension($_FILES, $extension, $extensions)) {
> public function extension($files, $extension, $extensions) {
Это ошибка. Через двоеточие можно обращаться только к статическим функциям и свойствам. У тебя нет слова static в определении и такую функцию можно вызывать только на объекте:
$upload = new Upload( );
$upload->extension(...);
Я думаю, ты просто забыл слово static вписать. Кстати, PHP в таких случаях выводит предупреждение — ты его видел или у тебя отключен вывод предупреждений?
> if (
> ($files["file"]["type"] == "image/jpeg")
> || ($files["file"]["type"] == "image/jpg")
> || ($files["file"]["type"] == "image/pjpeg")
Это некрасивая копипаста. Тут можно написать короче за счет функции in_array.
Ну и я добавлю, MIME тип переданный браузером можно вообще не проверять, так как нет никаких гарантий что он соответствует содержимому файла. Раз так, незачем его проверять.
Название функции extension надо поменять. Название должно выглядеть как сделайЧтоТо() то есть начинаться с глагола. Придумай нормальное название.
Вот тут https://github.com/someApprentice/ThumbnailService/blob/master/upload.php#L12 у тебя пример плохого if-монстра. Неправильно, когда почти весь файл занимает один огромный if. Надо перевернуть этот if так, чтобы код был не в нем, а после или перед ним.
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
Придумай способ или попроси подсказку, как избавиться от гигантских ифов.
>> $db = new Database( );
>> $replace = $db->newName($name);
> Так же не красиво писать... Ладно, понимаю что не в красоте дело, но может быть есть какие-нибудь другие лаконичные способы вызвать отдельно метод? Совсем ни черта не понимаю это ООП.
А что нелогичного? Мы создали объект для работы с базой данных, а потом воспользовались им по назначению. Разве что в программах обычно не пишут new везде, а получают объект из какой-нибудь функции:
$db = $app->getDb( );
$db->doSomething( );
> Чувствую себя поганым троичнеком
Нормально, ты же начинающий. Пиши больше кода, слушай мои советы и уивдишь как он станет лучше и лучше.
Вернемся к коду.
> public function test($name) {
Функции для тестирования не надо засовывать в основной код. Сделай папочку test и туда клади код для проверки.
Кстати, я вижу, ты проверяешь правильно ли работает код вручную, запуская и глядя на результат. А вообще, существует еще автоматизированное тестирование, когда ты пишешь что код получает и что он должен выдать, а программа проверяет соответствует код требованиям или нет. Вот у меня огромный (правда сложный) урок на тему: https://gist.github.com/codedokode/a455bde7d0748c0a351a
Тут https://github.com/someApprentice/ThumbnailService/blob/master/delete.php#L14 аж 3 вложенных ифа. Избавься от вложенности. Чтобы была не лапша вида
Если (условие выполняется) {
Если (услвие выполняется) {
Если (выполняется) {
сделать что-то;
}
}
}
А было примерно так:
Если (не выполняется) {
то выходим;
}
Если (не выполняется) {
то выходим;
}
делаем что-то;
--------------------
> $temp = explode(".", $_FILES["file"]["name"]);
> $extension = end($temp);
Это надо вынести в отдельную функцию. Вот смотри, твой пример читается так:
> Разбить имя файла по точкам на массив из нескольких кусков;
> Взять последний кусок;
А c функцией читается так:
> Взять расширение файла;
Согласись, лучше и понятнее?
> echo "Invalid file";
Некрасиво показывать надпись на пустом экране. Я думаю, лучше показать форму загрузки, а рядом с ней красным цветом сообщение об ошибке.
Вообще, работа с формами обычно строится по такому алгоритму. Он позволяет при ошибке снова показать форму с введенными значениями:
------------
$values = значения по умолчанию (пустые);
$errors = пустой массив;
Если (форма отправлена через POST) {
Читаем значения полей в $values;
Если (все заполнено верно) {
Делаем требуемое действие (например вставляем запись в БД);
Редиректим куда-нибудь;
Выходим;
}
Кладем ошибки в $errors;
}
Выводим форму($values, $errors);
-------------
>> $db = new Database( );
>> $replace = $db->newName($name);
> Так же не красиво писать... Ладно, понимаю что не в красоте дело, но может быть есть какие-нибудь другие лаконичные способы вызвать отдельно метод? Совсем ни черта не понимаю это ООП.
А что нелогичного? Мы создали объект для работы с базой данных, а потом воспользовались им по назначению. Разве что в программах обычно не пишут new везде, а получают объект из какой-нибудь функции:
$db = $app->getDb( );
$db->doSomething( );
> Чувствую себя поганым троичнеком
Нормально, ты же начинающий. Пиши больше кода, слушай мои советы и уивдишь как он станет лучше и лучше.
Вернемся к коду.
> public function test($name) {
Функции для тестирования не надо засовывать в основной код. Сделай папочку test и туда клади код для проверки.
Кстати, я вижу, ты проверяешь правильно ли работает код вручную, запуская и глядя на результат. А вообще, существует еще автоматизированное тестирование, когда ты пишешь что код получает и что он должен выдать, а программа проверяет соответствует код требованиям или нет. Вот у меня огромный (правда сложный) урок на тему: https://gist.github.com/codedokode/a455bde7d0748c0a351a
Тут https://github.com/someApprentice/ThumbnailService/blob/master/delete.php#L14 аж 3 вложенных ифа. Избавься от вложенности. Чтобы была не лапша вида
Если (условие выполняется) {
Если (услвие выполняется) {
Если (выполняется) {
сделать что-то;
}
}
}
А было примерно так:
Если (не выполняется) {
то выходим;
}
Если (не выполняется) {
то выходим;
}
делаем что-то;
--------------------
> $temp = explode(".", $_FILES["file"]["name"]);
> $extension = end($temp);
Это надо вынести в отдельную функцию. Вот смотри, твой пример читается так:
> Разбить имя файла по точкам на массив из нескольких кусков;
> Взять последний кусок;
А c функцией читается так:
> Взять расширение файла;
Согласись, лучше и понятнее?
> echo "Invalid file";
Некрасиво показывать надпись на пустом экране. Я думаю, лучше показать форму загрузки, а рядом с ней красным цветом сообщение об ошибке.
Вообще, работа с формами обычно строится по такому алгоритму. Он позволяет при ошибке снова показать форму с введенными значениями:
------------
$values = значения по умолчанию (пустые);
$errors = пустой массив;
Если (форма отправлена через POST) {
Читаем значения полей в $values;
Если (все заполнено верно) {
Делаем требуемое действие (например вставляем запись в БД);
Редиректим куда-нибудь;
Выходим;
}
Кладем ошибки в $errors;
}
Выводим форму($values, $errors);
-------------
http://ideone.com/AsBa3T
Не пойму как битый тег искать, парсер находит открывающую скобку < дальше идут символы, дальше он находит ещё один тег <> и последний символ > считает как закрывающий тег в этом теге, и не расценивает его как часть следующего
>>418533
Насчет базы данных, почему не выоложишь дамп в формате SQL? Без него я проверить, правльно ли ты ее спроектировал, не могу.
> $ru = "А а Б б В в Г г Д д Е е Ё ё Ж ж З з И и Й й К к Л л М
> $eng = "A a B b V v G g D d E e Yo yo Zh zh Z z I i Y y K k L
Это плохой способ так как на глаз трудно понять какой букве соответствует й и нет ли тут ошибки.
Теперь поговорим про то, как делать ООП. То, что у тебя — не ООП. Ты не исплоьзуешь объекты, а просто используешь статические методы как обычные функции. Единственная польза, которую дают классы тут — это объединение функций в один класс, а так это не ООП.
Чтобы писать в ООП-стиле, надо делать именно классы и создавать объекты. Прежде чем писать классы, надо ответить на такие вопросы:
- какие сущности есть в программе? Ну у нас может быть например ЗагрузчикФайлов, УменьшательКартинок, и может быть можно картинку представить в виде объекта (а можно и не представлять).
- какие у них есть свойства? Ну у загрузчика свойством может быть например название папки куда складывать картинки, разрешенные расширения, разрешенный размер. А можно не делать их свойствами, а просто жестко прописать к коде. Но со свойствами гибче получается
- что мы хотим от объектов получить? какую задачу решить (и соответственно какие методы нам нужны)? Ну например ЗагрузчикФайлов должен уметь загружать файлы, а УменьшательКартинок — умеьшать картинки.
Вот примеры библиотек для работы с картинками в ООП-стиле:
http://phpimagemagician.jarrodoberto.com/
http://image.intervention.io/
И вот еще. Ты жестко привязываешь классы друг к другу такими конструкицями:
> $connect = Connect::getPdo( );
Мы не можем никак в этот класс передать другой объект БД. Лучше передавать PDO через конструктор:
$database = new Database($pdo);
$database->addImage(...);
Вот урок на эту тему (может быть сложным для начинающего): https://gist.github.com/codedokode/e1d31a31b37d5f635057
А вот про работу с БД в ООП-стиле: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
https://github.com/someApprentice/ThumbnailService/blob/master/Classes/Database.php#L14 — это что-то сложное, надо упростить и вынести в функции.
В общем, давай пока с этими ошибками разберемся, а я пока подумаю над задачей на ООП.
>>418798
> интересует, почему мой способ не работал, а этот - работает, хотя, на мой взгляд, они одинаковы? В чём их различие?
Не очень понимаю, какой «твой» способ?
По коду: да, он работает, но его можно еще чуть-чуть улучшить. Вот у тебя есть повторяющиеся действия:
> $creditBalance -= $monthlyPayment;
> $creditBalance -= $sumToPay;
Эти 2 строчки делают одно и то же и значит можно их вынести из ифа и вместо них написать одну строчку.
Ну и дальше, if можно будет заменить на min или max.
>>418533
Насчет базы данных, почему не выоложишь дамп в формате SQL? Без него я проверить, правльно ли ты ее спроектировал, не могу.
> $ru = "А а Б б В в Г г Д д Е е Ё ё Ж ж З з И и Й й К к Л л М
> $eng = "A a B b V v G g D d E e Yo yo Zh zh Z z I i Y y K k L
Это плохой способ так как на глаз трудно понять какой букве соответствует й и нет ли тут ошибки.
Теперь поговорим про то, как делать ООП. То, что у тебя — не ООП. Ты не исплоьзуешь объекты, а просто используешь статические методы как обычные функции. Единственная польза, которую дают классы тут — это объединение функций в один класс, а так это не ООП.
Чтобы писать в ООП-стиле, надо делать именно классы и создавать объекты. Прежде чем писать классы, надо ответить на такие вопросы:
- какие сущности есть в программе? Ну у нас может быть например ЗагрузчикФайлов, УменьшательКартинок, и может быть можно картинку представить в виде объекта (а можно и не представлять).
- какие у них есть свойства? Ну у загрузчика свойством может быть например название папки куда складывать картинки, разрешенные расширения, разрешенный размер. А можно не делать их свойствами, а просто жестко прописать к коде. Но со свойствами гибче получается
- что мы хотим от объектов получить? какую задачу решить (и соответственно какие методы нам нужны)? Ну например ЗагрузчикФайлов должен уметь загружать файлы, а УменьшательКартинок — умеьшать картинки.
Вот примеры библиотек для работы с картинками в ООП-стиле:
http://phpimagemagician.jarrodoberto.com/
http://image.intervention.io/
И вот еще. Ты жестко привязываешь классы друг к другу такими конструкицями:
> $connect = Connect::getPdo( );
Мы не можем никак в этот класс передать другой объект БД. Лучше передавать PDO через конструктор:
$database = new Database($pdo);
$database->addImage(...);
Вот урок на эту тему (может быть сложным для начинающего): https://gist.github.com/codedokode/e1d31a31b37d5f635057
А вот про работу с БД в ООП-стиле: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
https://github.com/someApprentice/ThumbnailService/blob/master/Classes/Database.php#L14 — это что-то сложное, надо упростить и вынести в функции.
В общем, давай пока с этими ошибками разберемся, а я пока подумаю над задачей на ООП.
>>418798
> интересует, почему мой способ не работал, а этот - работает, хотя, на мой взгляд, они одинаковы? В чём их различие?
Не очень понимаю, какой «твой» способ?
По коду: да, он работает, но его можно еще чуть-чуть улучшить. Вот у тебя есть повторяющиеся действия:
> $creditBalance -= $monthlyPayment;
> $creditBalance -= $sumToPay;
Эти 2 строчки делают одно и то же и значит можно их вынести из ифа и вместо них написать одну строчку.
Ну и дальше, if можно будет заменить на min или max.
Задача про миллион — сделана верно. Ну, она и проще чем кредит.
>>418813
Чтобы отделить имя переменной от окружающего текста
>>418858
А, полезная статья. Трюк с dummy field помог на одном сайте отсеять автоматических ботов и отказаться откапчи для юзеров.
>>418864
> Какие преимущества может дать мне PHP?
Не знаю, я же не продаю тут курсы по PHP. Но я не думаю, что можно нормально писать большие приложения на JS ибо там нет классов, приватных свойств, тайп хинтов (то есть нормального ООП). Кофескрипт - мне он не нравится и я его всерьез вообще не воспринимаю, просто кто-то любит отступы и не любит скобки, ну это их дело, меня скобки устраивают а перлоподобный синтаксис нет.
> найти все необходимые модули на все случаи жизни,
И они будут кривые, тормозящие, неподдерживаемые и т.д. в то время как в PHP расширения пишутся на Си.
> можно в несколько строк кода поднять сервер без всяких апачей и нгинксов,
В продакшене ты все равно спереди нгинкс поставишь
> При использовании же его и на сервере, и на клиенте появляется возможность не реализовывать одни и те же вещи типа логики и валидации дважды.
Только если ты используешь специально заточенный под это фреймворк. Валидация же это не только проверка что x > 2, там и в базу может понадобиться залезть.
В общем, я не столько нахвативаю PHP сколько хочу сказать что JS выглядит очень несерьезно для больших приложений. Нода хорошо подходит для написания небольших асинхронных демонов на вебсокете, это у нее получается лучше всего. Но серверные приложения на ней мне кажется можно писать только из фанатизма. Не нравится PHP — возьми Питон, Руби, Яву, Моно — все лучше будет.
Ну и как аноны замечают, на PHP есть куча проектов, Симфони, Вордпресс, разные CMS для интернет-магазинов и блогов. Всего этого на ноде нет.
Ну и еще, у вас в JS средства сборки — это насмешка над нормальными средствами сборки. grunt и gulp выглядят как наспех слепленные поделки: они даже конфиг не осилили сделать, и надо писать код (аналогичные вещи - код вместо конфига — я пока видел только в JS и ruby, видимо там много альтернативно одаренных разработчиков). Соответственно никакими автоматизированными средствами например с их конфигами работать нельзя.
Задача про миллион — сделана верно. Ну, она и проще чем кредит.
>>418813
Чтобы отделить имя переменной от окружающего текста
>>418858
А, полезная статья. Трюк с dummy field помог на одном сайте отсеять автоматических ботов и отказаться откапчи для юзеров.
>>418864
> Какие преимущества может дать мне PHP?
Не знаю, я же не продаю тут курсы по PHP. Но я не думаю, что можно нормально писать большие приложения на JS ибо там нет классов, приватных свойств, тайп хинтов (то есть нормального ООП). Кофескрипт - мне он не нравится и я его всерьез вообще не воспринимаю, просто кто-то любит отступы и не любит скобки, ну это их дело, меня скобки устраивают а перлоподобный синтаксис нет.
> найти все необходимые модули на все случаи жизни,
И они будут кривые, тормозящие, неподдерживаемые и т.д. в то время как в PHP расширения пишутся на Си.
> можно в несколько строк кода поднять сервер без всяких апачей и нгинксов,
В продакшене ты все равно спереди нгинкс поставишь
> При использовании же его и на сервере, и на клиенте появляется возможность не реализовывать одни и те же вещи типа логики и валидации дважды.
Только если ты используешь специально заточенный под это фреймворк. Валидация же это не только проверка что x > 2, там и в базу может понадобиться залезть.
В общем, я не столько нахвативаю PHP сколько хочу сказать что JS выглядит очень несерьезно для больших приложений. Нода хорошо подходит для написания небольших асинхронных демонов на вебсокете, это у нее получается лучше всего. Но серверные приложения на ней мне кажется можно писать только из фанатизма. Не нравится PHP — возьми Питон, Руби, Яву, Моно — все лучше будет.
Ну и как аноны замечают, на PHP есть куча проектов, Симфони, Вордпресс, разные CMS для интернет-магазинов и блогов. Всего этого на ноде нет.
Ну и еще, у вас в JS средства сборки — это насмешка над нормальными средствами сборки. grunt и gulp выглядят как наспех слепленные поделки: они даже конфиг не осилили сделать, и надо писать код (аналогичные вещи - код вместо конфига — я пока видел только в JS и ruby, видимо там много альтернативно одаренных разработчиков). Соответственно никакими автоматизированными средствами например с их конфигами работать нельзя.
>>418887
> Прототипы ничем не хуже классов.
Хуже ибо выглядят как костыли
> пример: http://ideone.com/55xaIa — слишком сложно для меня
Ни разу не видел такой код на практике. Он только в учебнике и в вопросах к собеседованию используется. И сложного там ничего нет − оператор инкремента, примененный к строке, увеличивает цифры и буквы на одну по моему, то есть "aa"++ дает "ab". Это в мануале описано.
Ну а говоря про JS там еще хуже:
var data = { hello: 'world' };
data.helo; // ошибка в написании молча игнорируется
data.x = 1 + data.helo; // исключения здесь выброшено не будет, оно будет намного позже когда ты попытаешься поспользоваться данными. В большой программе это может быть очень далеко от места где реальная причина ошибки (я сталкивался)
У JS точно также есть исторические ошибки. Ты просто наверно начитался хабра или блогов и строишь свое мнение на малограмотных оценках этих людей, а лучше бы лично изучить оба языка и сделать выводы.
> Остался уверен, что ничего не мешает написать в том же стиле что-то больше и серьёзнее, все необходимые средства абстракции в JavaScript для этого есть.
Ну хорошо, пиши.
> Это хорошо, что уже можно, но я интересовался, что может мне дать PHP, чего нет в экосистеме JavaScript. Или всё сводится к языковым предпочтениям?
Ничего такого нет. Если алгоритм можно реализовать на JS, то можно и на PHP, и наоборот.
>>418897
Может надо удалять student[name] или что там у тебя?
>>418948
Да, верно, хотя мне больше нравится res.push( ) писать.
>>418950
Ну это вообще не вариант. Ты ищешь любые символы кроме букв, то есть вообще все знаки будут попадать, а надо только числа.
> Число нужно вывести без пробелов?
Да. Ты можешь удалить их дополнительными командами.
>>418887
> Прототипы ничем не хуже классов.
Хуже ибо выглядят как костыли
> пример: http://ideone.com/55xaIa — слишком сложно для меня
Ни разу не видел такой код на практике. Он только в учебнике и в вопросах к собеседованию используется. И сложного там ничего нет − оператор инкремента, примененный к строке, увеличивает цифры и буквы на одну по моему, то есть "aa"++ дает "ab". Это в мануале описано.
Ну а говоря про JS там еще хуже:
var data = { hello: 'world' };
data.helo; // ошибка в написании молча игнорируется
data.x = 1 + data.helo; // исключения здесь выброшено не будет, оно будет намного позже когда ты попытаешься поспользоваться данными. В большой программе это может быть очень далеко от места где реальная причина ошибки (я сталкивался)
У JS точно также есть исторические ошибки. Ты просто наверно начитался хабра или блогов и строишь свое мнение на малограмотных оценках этих людей, а лучше бы лично изучить оба языка и сделать выводы.
> Остался уверен, что ничего не мешает написать в том же стиле что-то больше и серьёзнее, все необходимые средства абстракции в JavaScript для этого есть.
Ну хорошо, пиши.
> Это хорошо, что уже можно, но я интересовался, что может мне дать PHP, чего нет в экосистеме JavaScript. Или всё сводится к языковым предпочтениям?
Ничего такого нет. Если алгоритм можно реализовать на JS, то можно и на PHP, и наоборот.
>>418897
Может надо удалять student[name] или что там у тебя?
>>418948
Да, верно, хотя мне больше нравится res.push( ) писать.
>>418950
Ну это вообще не вариант. Ты ищешь любые символы кроме букв, то есть вообще все знаки будут попадать, а надо только числа.
> Число нужно вывести без пробелов?
Да. Ты можешь удалить их дополнительными командами.
> Может кому не сложно можете дать какое-нибудь задание на написание парсера?
Правильно говорить скрейпер. Если ты готов решить с иcпользованием DOM, а не костыльного кода на регулярках, то давай.
http://www.nyaa.se/
Распарсь список торрентов в массив объектов. Решать надо с исопльзованием DOM или аналогичного парсера, код должен быть краток и минималистичен, легко исправляться при изменениях в верстке.
мне нравится res.push(...);
>>419010
> парсер находит открывающую скобку < дальше идут символы, дальше он находит ещё один тег
Надо не разрешать < внутри тега. Тег выглядит (в нашем варианте) как
< (не <>) >
http://ideone.com/oGpJvq — теги между 2 комментариями не распознаются. Тег внутри многострочного комментария распознается.
Почитай
http://php.net/manual/ru/regexp.reference.repetition.php про жадность
http://php.net/manual/ru/reference.pcre.pattern.modifiers.php про PCRE_DOTALL
Делаю вторую задачу по массивам.
Хочу уточнить, это мне нужно в середине массива сделать цикл, который будет отбирать учеников, что выше анона и за каждовать плюсовать $number?
А тут кто-то есть?
Я делаю 4ю задачу с генератором имён. Спросить хочу:
$random = mt_rand(1, count($letters));
Эта строка делает число от 1 до кол-ва пунктов в массиве, или же от одного, до определённого пункта массива, который сама и рандомит? пока писал, понял очевидность ответа, но хочется уточнить.
count возвращает число, соответственно и рандом будет работать как с числом.
Точнее, ясно, что нужна. А зачем её записали именно там?
Я её удалял - и ничего не произошло.
Ничего не появилось.
Правда, я два массива писал. На рандомные буквы и окончание. Сейчас над вторым работаю. Может по завершению всплывёт.
http://ideone.com/iLIKFl
А что здесь не так сделано, что рандом по второму арраю срабатывает через раз?
Понял, теперь что.
Переменную с первой поставил во вторую, вот оно и считает несуществующие пунты второго аррая.
>PHP Notice: Undefined variable: name in
Ну я же говорил.
>PHP Notice: Undefined offset: 5
Неопределенный индекс 5, у тебя в первом массиве идет 4, а затем сразу 6. Если у тебя не асоциативный массив, индексы не обязательно прописывать, можно записывать только значения, а индексы автоматически расставятся. ,
>>PHP Notice: Undefined variable: name in
Но ведь она назначается уже внутри цикла. Без него она не нужна.
>PHP Notice: Undefined offset: 5
Виноват, лол. Копипастил числа - пропустил пятерку.
А еще вопрос - как сделать первую букву большой?
>А еще вопрос - как сделать первую букву большой?
Есть специальная функция, но с многобайтными кодировками (то бишь с кириллицей) она не работает.
http://php.net/manual/ru/function.ucfirst.php
Там в комментах ниже люди пишут свою реализацию этой функции для многобайтных кодировок, с помощью
http://php.net/manual/ru/function.mb-substr.php в сочетании с http://php.net/manual/ru/function.mb-strtoupper.php
можешь подглядеть и так-же сделать.
>Конечно, задачки я всегда готов придумывать. А ты решил задачку про кошек-мышек и задачку про ООО Вектор из учебника? Мне решения показывал? Если нет, то хорошо бы с них начать (и если ты хочешь, ты можешь решить их сначала процедурно, чтобы потом сравнить оба подхода). Если решил и я их проверил то можем придумать что-то еще.
Нет, не решал. Мне больше понравилась задача с привьюшками, потому что её можно применить на практике. Давай я возьмусь за них как закончу текущую? Думаю там не так сложно будет, и я их быстро решу.
>Это ошибка. Через двоеточие можно обращаться только к статическим функциям и свойствам. У тебя нет слова static в определении и такую функцию можно вызывать только на объекте:
>$upload = new Upload( );
>$upload->extension(...);
>Я думаю, ты просто забыл слово static вписать.
А как будет правильнее: добавить слово static или переписать вызовы методов?
>Кстати, PHP в таких случаях выводит предупреждение — ты его видел или у тебя отключен вывод предупреждений?
Нет, не выводит. Я вроде сам отключил это. Точно не могу вспомнить.
>Придумай способ или попроси подсказку, как избавиться от гигантских ифов.
Подскажи, я сообразить не могу как лучше будет. Мне вот понравился вот этот способ:
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
>А что нелогичного?
Лаконично же! Т_Т
Какие-то зачатки понимания ООП в голове начинают появляться. Давай я сначала исправлю твои замечания по коду, а потом попробую что-нибудь сделать с ООП
>Конечно, задачки я всегда готов придумывать. А ты решил задачку про кошек-мышек и задачку про ООО Вектор из учебника? Мне решения показывал? Если нет, то хорошо бы с них начать (и если ты хочешь, ты можешь решить их сначала процедурно, чтобы потом сравнить оба подхода). Если решил и я их проверил то можем придумать что-то еще.
Нет, не решал. Мне больше понравилась задача с привьюшками, потому что её можно применить на практике. Давай я возьмусь за них как закончу текущую? Думаю там не так сложно будет, и я их быстро решу.
>Это ошибка. Через двоеточие можно обращаться только к статическим функциям и свойствам. У тебя нет слова static в определении и такую функцию можно вызывать только на объекте:
>$upload = new Upload( );
>$upload->extension(...);
>Я думаю, ты просто забыл слово static вписать.
А как будет правильнее: добавить слово static или переписать вызовы методов?
>Кстати, PHP в таких случаях выводит предупреждение — ты его видел или у тебя отключен вывод предупреждений?
Нет, не выводит. Я вроде сам отключил это. Точно не могу вспомнить.
>Придумай способ или попроси подсказку, как избавиться от гигантских ифов.
Подскажи, я сообразить не могу как лучше будет. Мне вот понравился вот этот способ:
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
>А что нелогичного?
Лаконично же! Т_Т
Какие-то зачатки понимания ООП в голове начинают появляться. Давай я сначала исправлю твои замечания по коду, а потом попробую что-нибудь сделать с ООП
Это тот новенький анон, который уже заебал здесь всех.
Накидайте задачек по массивам, что-бы укрепить знания.
Пока написал тесты к первым 4 задачкам, посмотри, скажи, что думаешь.
Я тут на секунду забежал в тред. Вот ты пишешь
expect(prototype.что то там).shouldEqual('[Function function]')
у тебя не возникало желания заменить эту нечитаемую портянку на
expect(x).toBeFunction() ?
А в остальном ты конечно молодец, что делаешь эти тесты, я думаю ты хорошо сможешь осилить не только простые задачки, но и написание приложений на клиенте, надеюсь я все же успею придумать хорошую задачку на эту тему.
Ты хочешь с нуля создать или готовый форум годится?
Во втором случае тебе надо лишь скачать, установить его на локалхост себе или на хостинг и настроить.
С нуля. Про локалхост я уже догадался, зопелил себе сервер на пеке, а вот что дальше делать?
Что из этого ты знаешь?
- HTML/CSS
- PHP
- ООП в PHP
- SQL и базы данных
- какой-нибудь фреймворк вроде Slim, Yii, Symfony 2
Если ты хочешь сделать форум, то тебе надо знать все это хотя бы на четверку.
Если не лень, то можешь скинуть ссылки по всем пунктикам?
Всё, что ниже ООП в PHP мне неизвестно вообще.
У меня есть задачи на HTML/CSS, в них есть ссылки на самоучитель: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
По PHP я могу посоветовать свой сайт с уроками (в ОП-посте), сайт phptherightway, 2 книги которые указаны в Оп-посте.
По ООП, есть урок на моем сайте, и ООП описан в упомынутых выше 2 книгах (Зандстра и Шлосснейгл).
По SQL, есть задачки и ссылки тут: https://gist.github.com/codedokode/10539213
Там есть ссылка на эту статью: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html — это цикл из 3 статей, их надо прочесть обязательно, а потом можно еще учебник Пирамидина почитать.
По фреймворкам:
- по Slim есть докуменатция на англ. языке на его сайте: http://docs.slimframework.com/
- По Yii есть документация на русском и английском, официальный сайт
http://www.yiiframework.com/
русский частичный перевод yii 2 https://github.com/yiisoft/yii2/tree/master/docs/guide-ru
русская дока по yii 1 есть на оф. сайте
- По Симфони 2 есть много учебников вроде такого http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html
Если тебе там что-то непонятно, можешь задавать вопрсоы. Также. если ты решаешь задачки, советую постить решения в тред для проверки и получения полезных советов.
У меня есть задачи на HTML/CSS, в них есть ссылки на самоучитель: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
По PHP я могу посоветовать свой сайт с уроками (в ОП-посте), сайт phptherightway, 2 книги которые указаны в Оп-посте.
По ООП, есть урок на моем сайте, и ООП описан в упомынутых выше 2 книгах (Зандстра и Шлосснейгл).
По SQL, есть задачки и ссылки тут: https://gist.github.com/codedokode/10539213
Там есть ссылка на эту статью: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html — это цикл из 3 статей, их надо прочесть обязательно, а потом можно еще учебник Пирамидина почитать.
По фреймворкам:
- по Slim есть докуменатция на англ. языке на его сайте: http://docs.slimframework.com/
- По Yii есть документация на русском и английском, официальный сайт
http://www.yiiframework.com/
русский частичный перевод yii 2 https://github.com/yiisoft/yii2/tree/master/docs/guide-ru
русская дока по yii 1 есть на оф. сайте
- По Симфони 2 есть много учебников вроде такого http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html
Если тебе там что-то непонятно, можешь задавать вопрсоы. Также. если ты решаешь задачки, советую постить решения в тред для проверки и получения полезных советов.
Почитайте, кто JS/DOM изучает, может пригодится.
Спасибо, няша! Буду отписываться тут в течение выполнения моей "миссии".
Делаю палиндром. Убрал пробелы, уменьшил все буквы...дальше полный ступор.
В нее кладутся слоги, чтобы в итоге получить имя.
>>419050
> Я её удалял - и ничего не произошло.
Если ее удалить то эта команда вызовет ошибку:
$name = $name . $randomText;
Так как при вычислении правой части идет обращение к несуществующей еще на тот момент переменной $name.
Ты всегда должен сначала создать переменную, а только потом использовать, а не наоборот.
>>419054
Ну вот тут как раз эта ошибка:
> PHP Notice: Undefined variable: name in /home/3MtXRS/prog.php on line 33
> $random = mt_rand(1, count($letters));
Взять случайный ключ кстати можно проще, через
$random = array_rand($letters);
Также, ты зря исплоьзуешь ucfirst. Она не работает с utf-8. Подробнее: https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>419057\t
> Но ведь она назначается уже внутри цикла. Без него она не нужна.
Чтобы выполнить команду
$name = ...
и создать переменную, надо сначала вычислить то, что справа от знака равно. А там исплоьзуется не существующая на момент вычисления переменная, отсюда ошибка.
> как сделать первую букву большой?
mb_substr + mb_strtoupper
В нее кладутся слоги, чтобы в итоге получить имя.
>>419050
> Я её удалял - и ничего не произошло.
Если ее удалить то эта команда вызовет ошибку:
$name = $name . $randomText;
Так как при вычислении правой части идет обращение к несуществующей еще на тот момент переменной $name.
Ты всегда должен сначала создать переменную, а только потом использовать, а не наоборот.
>>419054
Ну вот тут как раз эта ошибка:
> PHP Notice: Undefined variable: name in /home/3MtXRS/prog.php on line 33
> $random = mt_rand(1, count($letters));
Взять случайный ключ кстати можно проще, через
$random = array_rand($letters);
Также, ты зря исплоьзуешь ucfirst. Она не работает с utf-8. Подробнее: https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>419057\t
> Но ведь она назначается уже внутри цикла. Без него она не нужна.
Чтобы выполнить команду
$name = ...
и создать переменную, надо сначала вычислить то, что справа от знака равно. А там исплоьзуется не существующая на момент вычисления переменная, отсюда ошибка.
> как сделать первую букву большой?
mb_substr + mb_strtoupper
foreach(foo() as $bar) { ... }
будет ли foo() высчитываться при каждом шаге цикла или он её закеширует?
если foo функция, то глупо не закешировать
Колупаю тот палиндром. Переписал с примера цикл. Вроде как слово в слово.
http://ideone.com/7ttSmb результат - линк-рилейтед.
Откуда там целая куча пуыстых символов?
Пробелы убирать нужно.
>Откуда там целая куча пуыстых символов?
Для русских слов нужно использовать mb_strlen.
strlen принимает каждую русскую букву за 2 символа, отсюда у тебя цикл в два раза дольше продолжается, чем должен.
дана строка, найти самую длинную подстроку являющуюся палиндромом
Вперёд я посчитал, а как назад считать? Можно тем-же циклом, или надо как-то по-другому делать?
Я даже посчитал назад, но есть один лишний символ. Яхз как он появился. И что с ним делать, ничего не хочет делать.
> Давай я возьмусь за них как закончу текущую?
Обязательно возьмись. Эти задачи помогают понять преимущетва ООП и лучше его изучить. Для сравнения ты можешь также попробоват решить их процедурно, если хочешь (один анон пытался, получился такой ад, что он на полпути бросил и перешел на ООП).
> А как будет правильнее: добавить слово static или переписать вызовы методов?
Переделать код без static конечно же. Но для этого надо хорошо понимать ООП, а чтобы его понимать, надо решить задачи на ООП. Ты их пропустил, из-за этого сложности.
> Нет, не выводит. Я вроде сам отключил это.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
> Подскажи, я сообразить не могу как лучше будет.
Можно перенести код из файла в функцию. Тогда, если какое-то условие не выполняется, можно выйти из нее с помощью return.
Вот этот код например https://github.com/someApprentice/ThumbnailService/blob/master/delete.php#L14 можно без проблем перенести.
> Давай я сначала исправлю твои замечания по коду,а потом попробую что-нибудь сделать
Давай.
хорошо.
a^2 - a^2 = ab - b^2, то есть 0 = 0
но я не остановлюсь, т.к. знаю формулку
(a+b)(a-b) = b(a-b)
a ведь равна b, тогда (a-b) = 0. доказал. возьмете меня на работу?
Ты бы код весь скидывал, здесь не экстрасенсы сидят, которые по куску на скриншоте угадывают.
Проблема в этом куске, на самом деле.
http://ideone.com/czcbId, а код я по 10 раз меняю, что-бы результат посмотреть.
Ну закрывать тред никто не будет. В декабре страна работает, а мы изучаем PHP. В январе на праздники я уезжаю домой, так что может не буду в первые несколько дней появляться или буду только вечером, а потом вернемся к обычному ритму. Разумеется, это не должно никому, кто хочет, мешать изучать PHP — вкидывайте задачки, рано или поздно их проверят.
>>419100
> 2ch
> выложи фотку
Ну ок, выложил, пикрелейтед.
>>419107
Многострочный комментарий не вырезался http://ideone.com/kgsMKK
Почитай про флаг PCRE_DOTALL в мануале
>>419108
Лучший способ отметить праздник - решить несколько задачек на PHP
>>419158
1) Дано 2 массива: первый содержит список оценок учеников за 2013 год в виде array("Иванов" => 4, "Петров" => 3, ...), а второй — аналогичные оценки за 2014 год. Напиши программу, которая выведет сначала список учеников с ухудщившимися оценками, а потом с улучшившимися в таком виде:
Иванов: было 4, стало 3
....
2) Дан список фамилий вида
$list = array('Иванов', 'Иванов', 'Петров', ..);
Посчитай сколько раз встречается каждая фамилия и выведи их список в порядке убывания частоты:
Иванов: 3
Петров: 2
....
3) дан список пользователей такого вида
$users = array(
array('Ivan', 'ivan@example.ru'),
array('Petr', 'peter@example.ru'),
...
);
И в нем у некотрых пользователей указан одинаковый email. Выведи такие email, которые исплоьзуются некоторыми пользователями, в виде:
Адрес ivan@example.ru используют Ivan, Ivan2, Ivan-tsar, Ivanov
...
Ну закрывать тред никто не будет. В декабре страна работает, а мы изучаем PHP. В январе на праздники я уезжаю домой, так что может не буду в первые несколько дней появляться или буду только вечером, а потом вернемся к обычному ритму. Разумеется, это не должно никому, кто хочет, мешать изучать PHP — вкидывайте задачки, рано или поздно их проверят.
>>419100
> 2ch
> выложи фотку
Ну ок, выложил, пикрелейтед.
>>419107
Многострочный комментарий не вырезался http://ideone.com/kgsMKK
Почитай про флаг PCRE_DOTALL в мануале
>>419108
Лучший способ отметить праздник - решить несколько задачек на PHP
>>419158
1) Дано 2 массива: первый содержит список оценок учеников за 2013 год в виде array("Иванов" => 4, "Петров" => 3, ...), а второй — аналогичные оценки за 2014 год. Напиши программу, которая выведет сначала список учеников с ухудщившимися оценками, а потом с улучшившимися в таком виде:
Иванов: было 4, стало 3
....
2) Дан список фамилий вида
$list = array('Иванов', 'Иванов', 'Петров', ..);
Посчитай сколько раз встречается каждая фамилия и выведи их список в порядке убывания частоты:
Иванов: 3
Петров: 2
....
3) дан список пользователей такого вида
$users = array(
array('Ivan', 'ivan@example.ru'),
array('Petr', 'peter@example.ru'),
...
);
И в нем у некотрых пользователей указан одинаковый email. Выведи такие email, которые исплоьзуются некоторыми пользователями, в виде:
Адрес ivan@example.ru используют Ivan, Ivan2, Ivan-tsar, Ivanov
...
Кто-то еще ведется на деление на ноль?
То, что у тебя не совсем чистое выполнение в консоли. Он использует PhantomJS, то есть безголовый браузер (он упомянут в моем уроке по тестированию). Это довольно-таки неэффективно, требует больше ресурсов и медленнее работает, напоминает костыль и вносит лишние риски из-за усложнения системы (так как нужен браузер и сервер и проблемы в них влияют на результат тестов). Также, я подозреваю, результат выполнения трудно проверить автоматически так как он не возвращает код возврата (любая программа при завершении возвращает код, обычно 0 значит что все ок, а не 0 что есть ошибки. Но программа выполняющаяся внутри браузера не может повлиять на его код возврата). Впрочем, гугление показывает что решения есть.
Но это все равно костыль. Чтобы проверить JS функцию незачем поднимать полноценный браузер, достаточно Node.JS. Судя по докам, http://jasmine.github.io/2.1/node.html жасмин это умеет.
Разумеется без браузера, на голой ноде не будут работать тесты взаимодействующие с DOM. Не беда, для таких случаев есть имитация DOM на яваскрипте под названием JSDOM.
Node.JS — это платформа, которая позволяет писать консольные и серверные приложения на яваскрипте (без браузера). Node.JS использует v8, тот же движок что используется для выполнения явакрипта в Chrome. Для Node.JS написано большое число библиотек, которые доступны через менеджер пакетов npm.
На ноде за счет ее асинхронной однопоточной архитектуры хорошо реализуются приложения, требущие обработки большого числа одновременных соединений. Если тебе будет интересно, мы потом можем сделать что-нибудь на ноде, например написать чат на вебсокетах, который выдержит большое число подключений, простой сайт или может даже простой джаббер-клиент, работающий в браузере (не обещаю, джаббер все же сложный протокол).
> Если тесты можно запускать из консоли, то можно сделать небольшой интерактивный курс из этих задачек, где анон сабмитил вы свои решения в формочку, они бы тестировались, и возвращался бы ответ (правильно решено или нет).
да, у меня была такая мысль, сделать такое для PHP. Но тут не все просто. Например, вывод тестов на английском языке будет понятен не всем, и результаты надо подать в таком виде, чтобы было ясно в чем причина. Потому у меня пока просто план сделать инструкцию, как установить жасмин и как с его помощью и с помощью тестов проверить решение задачи.
Ну и сделать это можно без консоли и сервера: переделать specRunner чтобы там была форма для вставки кода, введенный код бы eval-ился и запускался тест (плюс перезагружать страницу после теста или восстанавливать глобальные переменные). Это можно сделать на стороне браузера целиком.
Более того, так как сервер не нужен, это можно выложить на github-pages (для этого достаточно в репозитории создать дополнительную ветку).
> Пока написал тесты к первым 4 задачкам, посмотри, скажи, что думаешь.
https://github.com/dKab/jasmine-tests/blob/master/1.js#L24 тут ты забыл var и создаешь глобальную переменную что плохо для теста. Если бы ты использовал strict mode в начале файла, JS выдал бы исключение.
Кстати, ты не используешь JSHint? Он тоже обнаруживает такие вещи. Для Sublime есть плагин JSHintGutter, который подчеркивает ошибки. Только советую поставить режим проверки On Save (при сохранении файла), а не при любом редактировании так как для проверки запускается node.js и это может притормаживать. JSHint — наследник известного JSLint, с возможностью более тонкой настройки. Опции для JSHint можно задать как комментарием, так и файлом .jshintrc в папке проекта. JSHint поможет тебе исправить ошибки еще до запуска кода.
Познакомиться с ним можно без установки на сайте http://jshint.com/
JSHint может использоваться также для автоматизированных проверок кода. Из минусов — любит ругаться на несуществующие переменные и функции, объявленные в другом файле. Но если ты исплоьзуешь систему модулей вроде AMD.js то такой проблемы нет.
> expect(res.constructor).toBe(Array);
Плохая проверка на массив. Лучше через (x instanceof Array), ну и написать свой матчер для этого (expect.toBeArray или expect.toBeInstanceOf), как описано тут: http://jasmine.github.io/2.1/custom_matcher.html
Также, имей в виду проверка через instanceof не обнаружит массив если он создан в другом окне или фрейме так как там свой Array: window.Array !== window.frames[x].Array. Универсально проверить можно через toString, погугли, или через Array.isArray в ES5-браузерах.
Проверить на функцию можно проще чем ты делал, через typeof x == 'function', это работает для всех функций включая экзотическую Function: typeof (new Function()) == 'function'
> var rand = Math.random( );
В тестах не стоит использовать эту функцию, чтобы они были повторяемыми. Лучше создать массив руками то есть expect.toReturn([1, 1, 1]); Это еще и проще (тесты должны быть еще и максимально простыми).
То же самое с var curtime = new Date().getTime().toString()
> https://github.com/dKab/jasmine-tests/blob/master/3.js#L31
По моему, ты не так понял «не изменяет исходный массив» (или я плохо объяснил). Если мы даем массив объектов [ {a:1, ..}] и функция меняет объекты в массиве это ок. В данном случае можно написать тест как у меня в задаче:
var arr = [1, 2, 3];
map(square, arr);
expect(arr).toEqual([1, 2, 3]);
Ну и старайся не слишком много выносить в переменные. Вот такой тест, без внешних переменных, читается быстрее и понятнее. С другой стороны, копипастой, конечно, тоже увлекаться не следует.
Например этот тест https://github.com/dKab/jasmine-tests/blob/master/2.js#L17 слишком сложный. Я бы сделал тестовую функцию вида { return i++; } и массив [1, 2, 3] для проверки. Пиши короче и проще.
Заметь также что необязательно создавать свою функцию-пустышку, можно использовать jasmine.createSpy.
В этом тесте https://github.com/dKab/jasmine-tests/blob/master/2.js#L9 незачем использовать функцию sequence, так как это без надобности усложняет тест (мы теперь зависим от правильности этой функции) — тут хватит пустышки jasmine.createSpy.and.returnValue
> https://github.com/dKab/jasmine-tests/blob/master/4.js#L33
Честно говоря имена типа bar, quuux трудно понять, лучше использовать осмысленные названия типа fmappedFunction.
> https://github.com/dKab/jasmine-tests/blob/master/4.js#L34
думаю тест должен проверять конечный, а не промежуточный результат. А если проверять массив, то лучше не через shift, а через ToEqual([0])
В общем, упрости тесты везде где можно. Тесты должны быть максимально читаемы.
> посмотри, скажи, что думаешь.
Думаю, что у тебя хорошо получается и надо дальше решать задачки на JS, и потом сделать на нем какое-нибудь приложение, а заодно может и ноду изучить.
То, что у тебя не совсем чистое выполнение в консоли. Он использует PhantomJS, то есть безголовый браузер (он упомянут в моем уроке по тестированию). Это довольно-таки неэффективно, требует больше ресурсов и медленнее работает, напоминает костыль и вносит лишние риски из-за усложнения системы (так как нужен браузер и сервер и проблемы в них влияют на результат тестов). Также, я подозреваю, результат выполнения трудно проверить автоматически так как он не возвращает код возврата (любая программа при завершении возвращает код, обычно 0 значит что все ок, а не 0 что есть ошибки. Но программа выполняющаяся внутри браузера не может повлиять на его код возврата). Впрочем, гугление показывает что решения есть.
Но это все равно костыль. Чтобы проверить JS функцию незачем поднимать полноценный браузер, достаточно Node.JS. Судя по докам, http://jasmine.github.io/2.1/node.html жасмин это умеет.
Разумеется без браузера, на голой ноде не будут работать тесты взаимодействующие с DOM. Не беда, для таких случаев есть имитация DOM на яваскрипте под названием JSDOM.
Node.JS — это платформа, которая позволяет писать консольные и серверные приложения на яваскрипте (без браузера). Node.JS использует v8, тот же движок что используется для выполнения явакрипта в Chrome. Для Node.JS написано большое число библиотек, которые доступны через менеджер пакетов npm.
На ноде за счет ее асинхронной однопоточной архитектуры хорошо реализуются приложения, требущие обработки большого числа одновременных соединений. Если тебе будет интересно, мы потом можем сделать что-нибудь на ноде, например написать чат на вебсокетах, который выдержит большое число подключений, простой сайт или может даже простой джаббер-клиент, работающий в браузере (не обещаю, джаббер все же сложный протокол).
> Если тесты можно запускать из консоли, то можно сделать небольшой интерактивный курс из этих задачек, где анон сабмитил вы свои решения в формочку, они бы тестировались, и возвращался бы ответ (правильно решено или нет).
да, у меня была такая мысль, сделать такое для PHP. Но тут не все просто. Например, вывод тестов на английском языке будет понятен не всем, и результаты надо подать в таком виде, чтобы было ясно в чем причина. Потому у меня пока просто план сделать инструкцию, как установить жасмин и как с его помощью и с помощью тестов проверить решение задачи.
Ну и сделать это можно без консоли и сервера: переделать specRunner чтобы там была форма для вставки кода, введенный код бы eval-ился и запускался тест (плюс перезагружать страницу после теста или восстанавливать глобальные переменные). Это можно сделать на стороне браузера целиком.
Более того, так как сервер не нужен, это можно выложить на github-pages (для этого достаточно в репозитории создать дополнительную ветку).
> Пока написал тесты к первым 4 задачкам, посмотри, скажи, что думаешь.
https://github.com/dKab/jasmine-tests/blob/master/1.js#L24 тут ты забыл var и создаешь глобальную переменную что плохо для теста. Если бы ты использовал strict mode в начале файла, JS выдал бы исключение.
Кстати, ты не используешь JSHint? Он тоже обнаруживает такие вещи. Для Sublime есть плагин JSHintGutter, который подчеркивает ошибки. Только советую поставить режим проверки On Save (при сохранении файла), а не при любом редактировании так как для проверки запускается node.js и это может притормаживать. JSHint — наследник известного JSLint, с возможностью более тонкой настройки. Опции для JSHint можно задать как комментарием, так и файлом .jshintrc в папке проекта. JSHint поможет тебе исправить ошибки еще до запуска кода.
Познакомиться с ним можно без установки на сайте http://jshint.com/
JSHint может использоваться также для автоматизированных проверок кода. Из минусов — любит ругаться на несуществующие переменные и функции, объявленные в другом файле. Но если ты исплоьзуешь систему модулей вроде AMD.js то такой проблемы нет.
> expect(res.constructor).toBe(Array);
Плохая проверка на массив. Лучше через (x instanceof Array), ну и написать свой матчер для этого (expect.toBeArray или expect.toBeInstanceOf), как описано тут: http://jasmine.github.io/2.1/custom_matcher.html
Также, имей в виду проверка через instanceof не обнаружит массив если он создан в другом окне или фрейме так как там свой Array: window.Array !== window.frames[x].Array. Универсально проверить можно через toString, погугли, или через Array.isArray в ES5-браузерах.
Проверить на функцию можно проще чем ты делал, через typeof x == 'function', это работает для всех функций включая экзотическую Function: typeof (new Function()) == 'function'
> var rand = Math.random( );
В тестах не стоит использовать эту функцию, чтобы они были повторяемыми. Лучше создать массив руками то есть expect.toReturn([1, 1, 1]); Это еще и проще (тесты должны быть еще и максимально простыми).
То же самое с var curtime = new Date().getTime().toString()
> https://github.com/dKab/jasmine-tests/blob/master/3.js#L31
По моему, ты не так понял «не изменяет исходный массив» (или я плохо объяснил). Если мы даем массив объектов [ {a:1, ..}] и функция меняет объекты в массиве это ок. В данном случае можно написать тест как у меня в задаче:
var arr = [1, 2, 3];
map(square, arr);
expect(arr).toEqual([1, 2, 3]);
Ну и старайся не слишком много выносить в переменные. Вот такой тест, без внешних переменных, читается быстрее и понятнее. С другой стороны, копипастой, конечно, тоже увлекаться не следует.
Например этот тест https://github.com/dKab/jasmine-tests/blob/master/2.js#L17 слишком сложный. Я бы сделал тестовую функцию вида { return i++; } и массив [1, 2, 3] для проверки. Пиши короче и проще.
Заметь также что необязательно создавать свою функцию-пустышку, можно использовать jasmine.createSpy.
В этом тесте https://github.com/dKab/jasmine-tests/blob/master/2.js#L9 незачем использовать функцию sequence, так как это без надобности усложняет тест (мы теперь зависим от правильности этой функции) — тут хватит пустышки jasmine.createSpy.and.returnValue
> https://github.com/dKab/jasmine-tests/blob/master/4.js#L33
Честно говоря имена типа bar, quuux трудно понять, лучше использовать осмысленные названия типа fmappedFunction.
> https://github.com/dKab/jasmine-tests/blob/master/4.js#L34
думаю тест должен проверять конечный, а не промежуточный результат. А если проверять массив, то лучше не через shift, а через ToEqual([0])
В общем, упрости тесты везде где можно. Тесты должны быть максимально читаемы.
> посмотри, скажи, что думаешь.
Думаю, что у тебя хорошо получается и надо дальше решать задачки на JS, и потом сделать на нем какое-нибудь приложение, а заодно может и ноду изучить.
в mb_substr нумерация начинается с нуля, соответственно в слове из 5 букв, индекс последней буквы будет 4, если попытаться вернуть 5ую, тебе выдаст пустой символ.
Программа работает правильно, но тут вот нехорошо написано:
> $r1 = mt_rand(0, 3);
Если мы поменяем исходные массивы, надо вручную пересчитывать все цифры. Сделай, чтобы они считались автоматически. Кстати, для выбора случайного ключа есть функция array_rand.
>>419287
Дальше мы должны сравнивать буквы по одной, идя от краев к центру: первую с последней, вторую с предпоследней, и т.д.
>>419338
Она вызывается только один раз, перед началом цикла (кстати ты бы мог легко проверить это и сам с помощью echo).
>>419347
> Откуда там целая куча пуыстых символов?
strlen не работает с русскими буквами, почитай урок https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>419354
Он домножает обе стороны на (a-b) то есть на 0.
>>419372
Не a равно нулю, а a - b равно нулю.
>>419373
Отдельным циклом, хоят не думаю что это надо для решения задачи.
>>419385
Выведи чему равно $length.
>>419395
Он там strlen использует
Программа работает правильно, но тут вот нехорошо написано:
> $r1 = mt_rand(0, 3);
Если мы поменяем исходные массивы, надо вручную пересчитывать все цифры. Сделай, чтобы они считались автоматически. Кстати, для выбора случайного ключа есть функция array_rand.
>>419287
Дальше мы должны сравнивать буквы по одной, идя от краев к центру: первую с последней, вторую с предпоследней, и т.д.
>>419338
Она вызывается только один раз, перед началом цикла (кстати ты бы мог легко проверить это и сам с помощью echo).
>>419347
> Откуда там целая куча пуыстых символов?
strlen не работает с русскими буквами, почитай урок https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>419354
Он домножает обе стороны на (a-b) то есть на 0.
>>419372
Не a равно нулю, а a - b равно нулю.
>>419373
Отдельным циклом, хоят не думаю что это надо для решения задачи.
>>419385
Выведи чему равно $length.
>>419395
Он там strlen использует
>Выведи чему равно $length.
А где оно увидело столько символов?
Как с этим бороться?
>Отдельным циклом, хоят не думаю что это надо для решения задачи.
А как ещё решить можно?
> Как с этим бороться?
https://gist.github.com/codedokode/ff99e357e9860ea169b8
> А как ещё решить можно?
Одним циклом
>Одним циклом
Божественная подсказка.
В принципе, я так и поступил, и выполнил задачу, надеюсь, что правильно. Хотя, букву "Н" мне так и не показало.
http://ideone.com/czcbId
Непраивльно пока что: http://ideone.com/l4pa3m
Посмтри внимательно: ты сравниваешь не все пары букв, а только последнюю.
Сколько раз по твоему вызывается команда
if ($symbol1 == $symbol2) {
?
И почему он считает слово «сказка» палиндромом?
Начал делать простую задачу на сайт про абитуриентов
Укажи основные ошибки.
https://github.com/tokotun/matriculant
Какой аккуратный код. У меня регистрация, редактирование профиля по 80 строк и файл класса больше сотни.
https://github.com/sqghub/TestHub
Я боюсь дальше хоть что-то писать.
Пока неплохо, но эту задачу надо проверить на большем числе номеров, чтобы убедиться что твой код правильный.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Также. если номер непраильный, например, содержит буквы, не надо его приводить ни к какому формату, а надо написать что он неприальный.
Решаю придуманые задачки, пока на первой сижу.
В общем, решил идти через перечисление 1го массива, и второго массива. Потом сравнение по одинаковой фамилии и увеличившейся или уменьшившейся оценки. Но для этого, нужно, чтобы считало два массива одновременно. Тут-то я и остановился.
Обходишь первый массив циклом и для каждого элемента проверяешь чему равна оценка эттго же ученика в другом массиве. Также, показывай код если зашел в тупик, так как по словам не всегда можно угадать что ты написал.
немного конечно по каличному условия поставил, надо было наверное в начале проверку сделать на +7 либо 8 в самом начале, если нет - то сразу к следующему элементу, если подходит то уже через preg_replace удалить все спецсимволы и пробелы, дальше проверить на длину и наличие букв, у меня как то всё в другом порядке вышло
$fuck = substr(blahblahblah);
не видит и требует переделывать, а вот так:
$fuck=substr(blahblahblah); //без пробелов
видит. Нахуй так жить? Может, им написать куда-нибудь?
В косноли MySQL клиента надо писать SQL запросы и дамп сделать нельзя.
Надо выйти из клиента в обычную консоль и там набирать mysqldump
Точка с запятой будет воспринята как часть имени файла кстати.
Прочти заодно мой урок по командной строке, думаю пригодится: https://gist.github.com/codedokode/10539568
черт
Соль надо хранить в открытом виде так как без нее не проверить правильность пароля. Также как и без знания алгоритма. Логично их хранить рядом с хешем чтобы не потерялись.
Соль должна быть уникальной для каждого пользователя, потому ее нельзя хранить в коде.
> Что мешает хакеру использовать свои "радужные таблицы" как прежде, просто генерируя их с моей солью?
Сгенерирвать таблицы займет столько же времени сколько сделать перебор то есть никакого профита. Профит таблиц в том чтобы на мощном компьютере долго генерировать один раз и потом ими пользоваться быстро.
Соль добавляет уникальности паролю (даже пароль 123456 станвится сложнее), а также добавляет хитрые символы которых может не быть в радужных таблицах.
> Как правильно хранить пароли?
C солью.
Вот мой урок на тему:
> Как солить и хешировать пароли.md
https://gist.github.com/codedokode/9576319
Вот еще полезная инфа на английском http://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication
PASSWORD(20)
Ну а теперь посчитай влезет ли туда хеш.
Кстати ограничение длины VARCHAR не 255, а 65535 (правда там еще есть ограничение на длину строки так что в реальности около 22000 символов
).
бумп
http://ideone.com/i9WCGb
Пока до такого додумал. Дальше знаний не хватает. Хочу завтра что-то новое почитать.
Если 2 файла на диске то можно сравнить содержимое или md5 от содержимого. В базе удобнее хранить просто md5
в первом вопросе я имел ввиду ф-ю crypt
Так xor==0!
О, тут лучше, тут ты сравниваешь все буквы попарно. Надо еще чуть доработать программу, чтобы она не писала 6 раза «палиндром», а только один. Можно например завести переменную и в ней хранить, есть ли несовпадения. А потом в конце проверить ее значение.
>>419433
> `name` text NOT NULL
Обычно TEXT используют для огромных полей (до 65535 символов), а для имени лучше VARCHAR(50)
> `sex` text NOT NULL,
> `location` text NOT NULL,
Иди-ка погугли по словам «mysql ENUM»
> `numberGroup` int(11) NOT NULL,
Номер группы не стоит делать числом, а то вдруг группа наызвается 2106M например? Или 0012?
Аналогично, телефон нельзя хранить числом иначе получится как тут описано: http://habrahabr.ru/post/113435/
Шаблоны лучше положить в отдельную папку, например templates. И дать им расширение php или phtml чтобы отличить от обычных статических HTML-файлов.
> connectvars.php
Обычно такой файл называют config.php. Я не советую использовать константы, лучше переменные, а то их например нельзя переопределить.
https://github.com/tokotun/matriculant/blob/master/dataMapper.php
В одно файле должен быть ровно один класс. Название файла должно совпадать с названием класса.
MyClass => MyClass.php
> (Matriculant &$matriculant)
Объекты и так передаются по ссылке (точнее, они передаются без копирования, и функция работает с оригиналом), & не нужен: http://php.net/manual/ru/language.oop5.references.php
> https://github.com/tokotun/matriculant/blob/master/dataMapper.php#L29
Тут лучше бы разбить эту длинную портянку на функции insert и update. Также, чтобы не копипастить код bind 2 раза, можно сделать отдельный метод toArray, который по объекту создаст массив аргументов или же метод который делает нужные bindParam.
Также, DataMapper не должен ставить куки. Его задача — только сохранять и загружать объекты из БД
> public function viewMatriculant(Matriculant &$matriculant)
Такая функция обычно используется так:
$m = $mapper->getMatriculantById($id);
То есть она сама создает и возвращает объект (а при неправильном id выбрасывет исключение либо возвращает null. Исключение наверно лучше).
Классы типа DataMapper тоже стоит убрать в папку, например, app, lib.
> https://github.com/tokotun/matriculant/blob/master/main.html
Не используй echo в шаблонах. Используй <?=
Не копипасть. У тебя в шаблонах скопирована шапка — это надо исправить. Копипаста — зло, есть специальный принцип DRY (не повторяйся) которого стоит придерживаться.
> value="<?php if (!empty($name)) echo $name;?>">
Почему не <?= $name ?> ?
А, и кстати, почитай урок про уязвимость XSS: https://gist.github.com/anonymous/52adda0113428b274c64
Также, в шаблонах надо применять версии if, for с двоеточием: http://php.net/manual/ru/control-structures.alternative-syntax.php Он лучше читается среди HTML тегов.
> <label>Год рождения</label>
> <input type="text" placeholder="Введите текст…"
Во-певрых, не «введите текст», а «введите год рождения». Во-вторых, зачем дублировать то что уже написано в label? Я думаю, незачем.
Ну и если ты хранишь только год то в базе надо вместо DATE использовать тип YEAR (да, такой тип есть, гугли. Вообще, почитай про то какие типы есть, я вижу ты слабо их знаешь: http://www.mysql.ru/docs/man/Column_types.html ).
Насчет обработки форм. Вот, как надо это делать. Работа с формами обычно строится по такому алгоритму. Он позволяет при ошибке снова показать форму с введенными значениями:
------------
$values = значения по умолчанию (пустые);
$errors = пустой массив;
Если (форма отправлена через POST) {
Читаем значения полей в $values;
Если (все заполнено верно) {
Делаем требуемое действие (например вставляем запись в БД);
Редиректим куда-нибудь;
Выходим;
}
Кладем ошибки в $errors;
}
Выводим форму($values, $errors);
-------------
Ну а так, в целом, неплохо.
О, тут лучше, тут ты сравниваешь все буквы попарно. Надо еще чуть доработать программу, чтобы она не писала 6 раза «палиндром», а только один. Можно например завести переменную и в ней хранить, есть ли несовпадения. А потом в конце проверить ее значение.
>>419433
> `name` text NOT NULL
Обычно TEXT используют для огромных полей (до 65535 символов), а для имени лучше VARCHAR(50)
> `sex` text NOT NULL,
> `location` text NOT NULL,
Иди-ка погугли по словам «mysql ENUM»
> `numberGroup` int(11) NOT NULL,
Номер группы не стоит делать числом, а то вдруг группа наызвается 2106M например? Или 0012?
Аналогично, телефон нельзя хранить числом иначе получится как тут описано: http://habrahabr.ru/post/113435/
Шаблоны лучше положить в отдельную папку, например templates. И дать им расширение php или phtml чтобы отличить от обычных статических HTML-файлов.
> connectvars.php
Обычно такой файл называют config.php. Я не советую использовать константы, лучше переменные, а то их например нельзя переопределить.
https://github.com/tokotun/matriculant/blob/master/dataMapper.php
В одно файле должен быть ровно один класс. Название файла должно совпадать с названием класса.
MyClass => MyClass.php
> (Matriculant &$matriculant)
Объекты и так передаются по ссылке (точнее, они передаются без копирования, и функция работает с оригиналом), & не нужен: http://php.net/manual/ru/language.oop5.references.php
> https://github.com/tokotun/matriculant/blob/master/dataMapper.php#L29
Тут лучше бы разбить эту длинную портянку на функции insert и update. Также, чтобы не копипастить код bind 2 раза, можно сделать отдельный метод toArray, который по объекту создаст массив аргументов или же метод который делает нужные bindParam.
Также, DataMapper не должен ставить куки. Его задача — только сохранять и загружать объекты из БД
> public function viewMatriculant(Matriculant &$matriculant)
Такая функция обычно используется так:
$m = $mapper->getMatriculantById($id);
То есть она сама создает и возвращает объект (а при неправильном id выбрасывет исключение либо возвращает null. Исключение наверно лучше).
Классы типа DataMapper тоже стоит убрать в папку, например, app, lib.
> https://github.com/tokotun/matriculant/blob/master/main.html
Не используй echo в шаблонах. Используй <?=
Не копипасть. У тебя в шаблонах скопирована шапка — это надо исправить. Копипаста — зло, есть специальный принцип DRY (не повторяйся) которого стоит придерживаться.
> value="<?php if (!empty($name)) echo $name;?>">
Почему не <?= $name ?> ?
А, и кстати, почитай урок про уязвимость XSS: https://gist.github.com/anonymous/52adda0113428b274c64
Также, в шаблонах надо применять версии if, for с двоеточием: http://php.net/manual/ru/control-structures.alternative-syntax.php Он лучше читается среди HTML тегов.
> <label>Год рождения</label>
> <input type="text" placeholder="Введите текст…"
Во-певрых, не «введите текст», а «введите год рождения». Во-вторых, зачем дублировать то что уже написано в label? Я думаю, незачем.
Ну и если ты хранишь только год то в базе надо вместо DATE использовать тип YEAR (да, такой тип есть, гугли. Вообще, почитай про то какие типы есть, я вижу ты слабо их знаешь: http://www.mysql.ru/docs/man/Column_types.html ).
Насчет обработки форм. Вот, как надо это делать. Работа с формами обычно строится по такому алгоритму. Он позволяет при ошибке снова показать форму с введенными значениями:
------------
$values = значения по умолчанию (пустые);
$errors = пустой массив;
Если (форма отправлена через POST) {
Читаем значения полей в $values;
Если (все заполнено верно) {
Делаем требуемое действие (например вставляем запись в БД);
Редиректим куда-нибудь;
Выходим;
}
Кладем ошибки в $errors;
}
Выводим форму($values, $errors);
-------------
Ну а так, в целом, неплохо.
Не бойся. Мы же не наказываем никого за ошибки.
Главное, с чем нам стоит разобраться — это правильно сделать модель теста и вопросов с вариантами ответа. Имея модель, написать код для ее отображения и редактирования становится не так трудно.
Я вижу, что у тебя сделано довольно странно: у тебя есть 4 класс-опций (вариантов ответа?) в то время как у нас 4 варианта Вопросов (а не ответов).
Давай подумаем, как она должна быть устроена, какие есть сущности и как они связаны.
Очевидно, есть Тест. Тест содержит много Вопросов. Вопрос бывает разный: ВопросСОдиночнымВыбором, ВопросСЧисловымОтветом, итд. Ну и некоторые Вопросы могут иметь несколько ВариантовОтвета. Тут есть несколько вариантов релизации:
- сделать абстрактный класс Вопрос и 4 конкретных класса-наследника
- сделать один класс Вопрос с полем типВопроса
Первый вариант более удобным с точки зрения того, что разный функционал будет разнесе по разным классам. Вариант 2 проще в реализации. Я советую тебе взять более сложный, чтобы лучше разобраться с наследвоанием моделей в Юи.
Итак, нам надо решить 2 задачи:
- сделать наследование моделей
- сделать связи
гуглим и находим:
- https://github.com/samdark/yii2-cookbook/blob/master/book/ar-single-table-inheritance.md (я бы там type сделать через ENUM а не string). Это мануал от автора Yii как я понимаю.
Заметь, там за счет метода instantiate мы при загрузке из БД создаем объект нужного класса.
- связи описаны в мануале http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#working-with-relational-data (кстати я советую прочесть весь этот раздел, а не только про связи)
В общем, давай для начала исправим модель. Есличто-то непонятно, спрашивай. Если понятно — пиши код.
И еще. Я советую вот это откючить в настройках IDE:
> Created by PhpStorm.
Этот комментарий не несет никакой ценности так как дату создания и автора видно в гите. Раз так, незачем его добавлять. Лучше в начале файла кратко описать что это за класс и зачем он нужен.
Не бойся. Мы же не наказываем никого за ошибки.
Главное, с чем нам стоит разобраться — это правильно сделать модель теста и вопросов с вариантами ответа. Имея модель, написать код для ее отображения и редактирования становится не так трудно.
Я вижу, что у тебя сделано довольно странно: у тебя есть 4 класс-опций (вариантов ответа?) в то время как у нас 4 варианта Вопросов (а не ответов).
Давай подумаем, как она должна быть устроена, какие есть сущности и как они связаны.
Очевидно, есть Тест. Тест содержит много Вопросов. Вопрос бывает разный: ВопросСОдиночнымВыбором, ВопросСЧисловымОтветом, итд. Ну и некоторые Вопросы могут иметь несколько ВариантовОтвета. Тут есть несколько вариантов релизации:
- сделать абстрактный класс Вопрос и 4 конкретных класса-наследника
- сделать один класс Вопрос с полем типВопроса
Первый вариант более удобным с точки зрения того, что разный функционал будет разнесе по разным классам. Вариант 2 проще в реализации. Я советую тебе взять более сложный, чтобы лучше разобраться с наследвоанием моделей в Юи.
Итак, нам надо решить 2 задачи:
- сделать наследование моделей
- сделать связи
гуглим и находим:
- https://github.com/samdark/yii2-cookbook/blob/master/book/ar-single-table-inheritance.md (я бы там type сделать через ENUM а не string). Это мануал от автора Yii как я понимаю.
Заметь, там за счет метода instantiate мы при загрузке из БД создаем объект нужного класса.
- связи описаны в мануале http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#working-with-relational-data (кстати я советую прочесть весь этот раздел, а не только про связи)
В общем, давай для начала исправим модель. Есличто-то непонятно, спрашивай. Если понятно — пиши код.
И еще. Я советую вот это откючить в настройках IDE:
> Created by PhpStorm.
Этот комментарий не несет никакой ценности так как дату создания и автора видно в гите. Раз так, незачем его добавлять. Лучше в начале файла кратко описать что это за класс и зачем он нужен.
>Я вижу, что у тебя сделано довольно странно: у тебя есть 4 класс-опций (вариантов ответа?) в то время как у нас 4 варианта Вопросов (а не ответов).
Я посчитал, что типы у нас как раз у ответов. Я их и хранить в разных таблицах собирался.
>- связи описаны в мануале
Читал.
>И еще. Я советую вот это отключить в настройках IDE:
Я обычно удаляю, это пропустил видимо.
Для вопросов типа текст или число не надо создавать варианты ответа — варианты нужны только для вопросов с выбором.
Ну и я советую реализовать наследование на STI так как оно описано в официальном гайде.
>>419504
Ок, верно.
>>419552
Ой, форматировние ужасное, в следующий раз пропусти код через phpformatter.com ибо читать очень тяжело без отступов.
> \tif (preg_match('/^\s?[+]?\s?(7|8)/', $number))
> if (strlen($number) != 11 OR !is_numeric($number)
Не, так наверно не пойдет. Давай напишем одну регулярку, которая проверит праивльный номер или нет. Это будет гораздо короче и проще.
Ну и телефон — это не число, а строка из цифр. К нему неприавильно примерять функции типа is_numeric.
>>419575
Ну там вроде есть форум для обратной связи.
>>419674
Вот смотри, у тебя есть первый цикл. Внутри него на каждом шаге в $pupil записывается фамилия, а в $grage — оценка за 2013 год. Сделай чтобы тут же с помощью echo выводилась оценка этого же ученика за 2014 год. Для этого тебе надо взять из второго массива элемент с нужным ключом (и тебе тут помогут квадратные скобки).
>>419688
Обрти внимание, в php 5.5 добавили новые готовые функции для хеширования и проверки пароля: http://habrahabr.ru/post/194972/
> Ну и зачем на сайтах запрещают использовать например ./&# ?
Видимо плохо разбираются в предмете и боятся что их взломают через эти символы. Конечно, надо их разрешать. Хороший программист (которых мы стараемся готовить в этом треде) разумеется напишет код так, что проблем не будет.
Правда, пробелы в пароле стоит обрезать с краев, а может и вообще запрещать - чтобы пользователь сам же не запутался.
Вообще, в формах принято отрезать пробелы с краев, так как они не видны и не несут никакого смысла.
> Алфавиты указанные для солей алгоритмов относятся только к соли или к параметру str тоже?
Только к соли.
Для вопросов типа текст или число не надо создавать варианты ответа — варианты нужны только для вопросов с выбором.
Ну и я советую реализовать наследование на STI так как оно описано в официальном гайде.
>>419504
Ок, верно.
>>419552
Ой, форматировние ужасное, в следующий раз пропусти код через phpformatter.com ибо читать очень тяжело без отступов.
> \tif (preg_match('/^\s?[+]?\s?(7|8)/', $number))
> if (strlen($number) != 11 OR !is_numeric($number)
Не, так наверно не пойдет. Давай напишем одну регулярку, которая проверит праивльный номер или нет. Это будет гораздо короче и проще.
Ну и телефон — это не число, а строка из цифр. К нему неприавильно примерять функции типа is_numeric.
>>419575
Ну там вроде есть форум для обратной связи.
>>419674
Вот смотри, у тебя есть первый цикл. Внутри него на каждом шаге в $pupil записывается фамилия, а в $grage — оценка за 2013 год. Сделай чтобы тут же с помощью echo выводилась оценка этого же ученика за 2014 год. Для этого тебе надо взять из второго массива элемент с нужным ключом (и тебе тут помогут квадратные скобки).
>>419688
Обрти внимание, в php 5.5 добавили новые готовые функции для хеширования и проверки пароля: http://habrahabr.ru/post/194972/
> Ну и зачем на сайтах запрещают использовать например ./&# ?
Видимо плохо разбираются в предмете и боятся что их взломают через эти символы. Конечно, надо их разрешать. Хороший программист (которых мы стараемся готовить в этом треде) разумеется напишет код так, что проблем не будет.
Правда, пробелы в пароле стоит обрезать с краев, а может и вообще запрещать - чтобы пользователь сам же не запутался.
Вообще, в формах принято отрезать пробелы с краев, так как они не видны и не несут никакого смысла.
> Алфавиты указанные для солей алгоритмов относятся только к соли или к параметру str тоже?
Только к соли.
Нет, у нас есть именно 4 типа вопросов и некоторые вопросы имеют ВариантыОтветов, а некоторые нет (ответ тогда удобно хранить прямо в самом вопросе). То есть у класса ВопросСЧислом могут быть свойства Ответ и Погрешность.
Если бы было 4 типа ответов то тогда не очень понятно какая связь между Вопросом и Ответом? Вопрос может иметь несколько Ответов разных типов? Нет, конечно. Способ ответа определяется вопросом.
Вообще, можно еще хранить варианты ответа каким-нибудь JSON, но как по мне так лучше тут сделать нормально, а не оптимизировать то что не требует оптимизации.
> Я обычно удаляю, это пропустил видимо.
Это в настройках удаляется, зачем каждый раз руками удалять?
Кстати, ты не решал мои задачки на SQL? Будет время - глянь: https://gist.github.com/codedokode/10539213 будет над чем поломать голову.
Только про лайки. Я решил, что пока что мне их хватит. Сейчас с сессией разберусь и смогу уделить больше внимания тестхабу.
У меня есть тест, который имеет много вопросов, которые имеют много ответов. При создании делаю примерно такую обработку: http://pastebin.com/SGmpS8WZ .
Но так ведь не совсем правильно, да?
Например, у нас есть человек, который оставил название теста пустым, а в правилах валидации он должен быть заполнен. Если у него отключен js, то и клиентская валидаци, и мы сможем проверять только на сервере, а в этом случае $test->validate() вернёт false и мы не подгрузим вопросы через Model::loadMultiple(), и из-за этого то, что пользователь вводил в вопросах исчезнет.
Может я слишком заморачиваюсь и стоит игнорировать людей с выключенным js?
Допустим, мы их не игнорируем, и делаем что-то вроде http://pastebin.com/dHfdnmKe . А стоит ли в таком случае вообще проверять результат подгрузки данных в модель через load? Получится, что если данные через load не загрузятся, то валидация не запустится и пользователь не поймёт где ошибка. С другой стороны, это случится только если явно менять post параметры, а для этого нужно будет менять форму.
Вообще, на вики по yii часто вижу код как в первом пастебине или http://pastebin.com/unQB6UBh . Может тоже не стоит заморачиваться и писать так же?
>Нет, у нас есть именно 4 типа вопросов и некоторые вопросы имеют ВариантыОтветов, а некоторые нет (ответ тогда удобно хранить прямо в самом вопросе).
Так-то да, но у нас на четыре типа у одного нет вариантов.
>То есть у класса ВопросСЧислом могут быть свойства Ответ и Погрешность.
А с остальными что делать? Все равно на каждый тип придется по таблице делать. У меня же в любом вопросе может быть 1-∞ вариантов ответа.
> Может я слишком заморачиваюсь и стоит игнорировать людей с выключенным js?
Так как это учебная задача то не стоит искать легких путей, а стоит стараться делать как можно правильнее.
> и мы не подгрузим вопросы через Model::loadMultiple(), и из-за этого то, что пользователь вводил в вопросах исчезнет.
Это баг твоего алгоритма работы с формами. По идее все что вводится, должно быть вписано в поля формы и отправляться на сервер. А на сервере должно быть примерно так:
------------
Если (мы создаем тест) {
модель = создать новую пустую модель теста;
} иначе если (мы редактируем тест) {
модель = загрузить из базы модель теста со всеми вопросами;
}
Если (форма запощена) {
читаем данные из POST и заполняем на их основе модель теста, создаем и прикрепляем к ней вопросы и варианты ответов;
если (все правильно) {
вставляем все это в Бд ;
редиректим;
}
}
// если есть ошибки или мы только открыли форму
показать форму с данными из модели;
------------------
Это универсальный алгоритм вообще для любых форм. То есть у нас есть модель, мы ее заполняем данными из POST и за счет этого никогда не теряем введенные данные.
Я в этом подходе не учел аякс-валидацию. В Юи при аякс-валидации по моему вызывается то же самое децствие в констроллере, но результаты валидации отдаются в нужном формате. Надо проверить что аякс- или JS-валидация не сломалась, если она используется.
Твой подход «загружаем вопросы только если тест правильный» неверный.
> Вообще, на вики по yii часто вижу код как в первом пастебине
Он неправильный.
> Может я слишком заморачиваюсь и стоит игнорировать людей с выключенным js?
Так как это учебная задача то не стоит искать легких путей, а стоит стараться делать как можно правильнее.
> и мы не подгрузим вопросы через Model::loadMultiple(), и из-за этого то, что пользователь вводил в вопросах исчезнет.
Это баг твоего алгоритма работы с формами. По идее все что вводится, должно быть вписано в поля формы и отправляться на сервер. А на сервере должно быть примерно так:
------------
Если (мы создаем тест) {
модель = создать новую пустую модель теста;
} иначе если (мы редактируем тест) {
модель = загрузить из базы модель теста со всеми вопросами;
}
Если (форма запощена) {
читаем данные из POST и заполняем на их основе модель теста, создаем и прикрепляем к ней вопросы и варианты ответов;
если (все правильно) {
вставляем все это в Бд ;
редиректим;
}
}
// если есть ошибки или мы только открыли форму
показать форму с данными из модели;
------------------
Это универсальный алгоритм вообще для любых форм. То есть у нас есть модель, мы ее заполняем данными из POST и за счет этого никогда не теряем введенные данные.
Я в этом подходе не учел аякс-валидацию. В Юи при аякс-валидации по моему вызывается то же самое децствие в констроллере, но результаты валидации отдаются в нужном формате. Надо проверить что аякс- или JS-валидация не сломалась, если она используется.
Твой подход «загружаем вопросы только если тест правильный» неверный.
> Вообще, на вики по yii часто вижу код как в первом пастебине
Он неправильный.
Насчет вопросов, а где ты хранишь варианты ответов в вопросах с выбором?
Ну и еще, было бы неплохо в учебных целях сделать наследование моделей. Сейчас у тебя одна модель Вопрос. Но ведь вопросы бывают разные: с числовым ответом, с текстовым, с множественным выбором. у них разные поля и разные методы и неплохо бы сделать их разными классами, верно? Это же классический пример наследования.
Было бы неплохо если бы ты изучил паттерны наследования таблиц в БД:
http://design-pattern.ru/patterns/single-table-inheritance.html
http://design-pattern.ru/patterns/class-table-inheritance.html
http://design-pattern.ru/patterns/concrete-table-inheritance.html
А потом реализовал это в Yii. Там есть вариант для реализации STI: http://rmcreative.ru/blog/post/nasledovanie-s-odnoy-tablitsey-v-yii
Ну и советую код показывать так как чем раньше мы увидим ошибки тем меньше переделывать придется.
> Так-то да, но у нас на четыре типа у одного нет вариантов.
Даже у двух: у вопроса на число и на текст. У них не должно быть связи с ВариантамиОтветов.
То есть у вопроса с числом нет никаких вариантов ответов. У вопроса с множественным выбором есть 1 или больше вариантов (точнее, два или больше: какой смысл делать один вариант ответа?).
Я не знаю, позволяет ли Юи при наследовании для части наследников добавить связь, а для части нет. Если позволяет то ок, если нет то делаем связь на базовом классе, а в наследниках делаем валидацию, что к вопросу на число не прикреплено вариантов ответа, а к вопросы с выбором прикреплено минимум два.
> А с остальными что делать? Все равно на каждый тип придется по таблице делать. У меня же в любом вопросе может быть 1-∞ вариантов ответа.
Не придется делать. Изучи паттерн STI: http://design-pattern.ru/patterns/single-table-inheritance.html
Там все поля всех классов отображаются на одну общую таблицу. Ну а для вариантов ответов делаем вторую таблицу.
>Даже у двух: у вопроса на число и на текст.
Неправда. У текста может быть несколько вариантов.
>Не придется делать. Изучи паттерн STI
Не нравится мне он.
>Ну а для вариантов ответов делаем вторую таблицу.
Все равно же для двух классов из четырех пилим отдельную таблицу. Даже для трех: у нас в тексте тоже несколько ответов может быть.
после многочисленных танцев с бубном я таки создал репозиторий и добавил в него файлы. Вроде все сделал, кроме одного: отображение по 50 записей на странице. Не совсем представляю как это сделать. Ясно, что с помощью LIMIT, а вот как создавать динамически страницы, в зависимости от количества записей?
> Неправда. У текста может быть несколько вариантов.
Гм. Точно, ты прав. Ну сути это не меняет, а наследование хорошо тем что завтра например мы легко можем добавить новый тип вопроса не переделывая весь код.
> Не нравится мне он.
Чем? Поясни. И какой паттерн нравится больше?
Мне он нравится тем что он поддерживается в Юи, позволяет организоваь в БД связь от ВариантаОтвета к Вопросу через FOREIGN KEY, позволяет легко искать несколько типов вопросов в Бд в одной таблице без использования UNION. Например, выбрать все вопросы к тесту одним простым SELECT.
Напиши, какой вариант тебе нравится, какие у него плюсы и минусы.
> Все равно же для двух классов из четырех пилим отдельную таблицу. Даже для трех: у нас в тексте тоже несколько ответов может быть.
Если используем STI то пилится только одна таблица так как это Single Table INheritance.
Их не надо создавать динамически, ты просто добавляешь номер страницы в URL вроде
index.php?page=3
или
/students/page/3
(если ты используешь rewrite для URL). И потом по этому номеру выссчитываешь OFFSET для LIMIT.
Код проверю, но попозже, прямо сейчас некогда, а кода много. Сразу могу сказать что надо будет файлы типа такого https://github.com/MindiMakridi/Students/blob/master/profile.php разбить на несколько: сваливать все в одну кучу не надо. Также не выводи HTML через echo, используй отдельные файлы-шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Также, код вставки студента в БД надо будет сделать с применением паттерна вроде DataMapper (или хотя бы на функциях если ты не знаешь ООП, но я советую его изучить так как он везде требуется и без него тебя никуда не возьмут, у меня есть простой урок по ООП если что). Вот урок про работу с БД с использованием ООП: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
То, что у тебя все написано длинной портянкой это нехорошо конечно.
По базе данных
> `sex` varchar(4) COLLATE utf8_unicode_ci DEFAULT NULL,
Погугли по слвоам MySQL ENUM
Также, почитай какие есть типы колонок в MySQL:
http://phpclub.ru/mysql/doc/column-types.html (рус, кратко)
http://dev.mysql.com/doc/refman/5.6/en/data-types.html (англ, подробно)
> `groupindex` int(11) DEFAULT NULL,
Номер группы не надо делать числом, вдруг будет группа 2106M или 212-20?
> `birthdate` int(11) DEFAULT NULL,
Тут надо использовать более подходящий тип
Для шаблонов стоит сделать отдельную папку вроде templates, для функций/классов папку lib или app.
Их не надо создавать динамически, ты просто добавляешь номер страницы в URL вроде
index.php?page=3
или
/students/page/3
(если ты используешь rewrite для URL). И потом по этому номеру выссчитываешь OFFSET для LIMIT.
Код проверю, но попозже, прямо сейчас некогда, а кода много. Сразу могу сказать что надо будет файлы типа такого https://github.com/MindiMakridi/Students/blob/master/profile.php разбить на несколько: сваливать все в одну кучу не надо. Также не выводи HTML через echo, используй отдельные файлы-шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Также, код вставки студента в БД надо будет сделать с применением паттерна вроде DataMapper (или хотя бы на функциях если ты не знаешь ООП, но я советую его изучить так как он везде требуется и без него тебя никуда не возьмут, у меня есть простой урок по ООП если что). Вот урок про работу с БД с использованием ООП: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
То, что у тебя все написано длинной портянкой это нехорошо конечно.
По базе данных
> `sex` varchar(4) COLLATE utf8_unicode_ci DEFAULT NULL,
Погугли по слвоам MySQL ENUM
Также, почитай какие есть типы колонок в MySQL:
http://phpclub.ru/mysql/doc/column-types.html (рус, кратко)
http://dev.mysql.com/doc/refman/5.6/en/data-types.html (англ, подробно)
> `groupindex` int(11) DEFAULT NULL,
Номер группы не надо делать числом, вдруг будет группа 2106M или 212-20?
> `birthdate` int(11) DEFAULT NULL,
Тут надо использовать более подходящий тип
Для шаблонов стоит сделать отдельную папку вроде templates, для функций/классов папку lib или app.
И еще. Обычно в базе с помощью NOT NULL помечают обязательные поля, а DEFAULT NULL - те, которые можно не заполнять. У тебя все почему-то помечены как необязательные.
>Насчет вопросов, а где ты хранишь варианты ответов в вопросах с выбором?
Сейчас есть 3 варианта вопросов - с выбором из одного, с выбором из нескольких, ввод вручную. Все они хранятся в answer. Question имеет один или несколько answer. Правильный вариант отмечается с помощью is_answer и их может быть несколько при желании. Но это лучше глазами смотреть, наверное.
Про паттерны почитаю, а когда ещё чуток доделаю покажу код, хорошо?
Ага, я просто сначала подумал что answer — это результат ответа на вопрос студентом. Теперь разобрался.
> а когда ещё чуток доделаю покажу код, хорошо?
Хорошо.
Не хочу окунаться в другие языки. Я лучше подтяну ООП в своем любимом пыхе. Все равно не планирую работать на работе никогда.
То что ты ищешь называется Web Desktop Application. Есть несколько проектов.
Для рисования GUI они используют встроенный браузер который выглядит как обычное окошко. А внутри обычный сервер. Т.е. нужно знать PHP, JS, CSS, HTML.
Вот например
TideSDK http://www.tidesdk.org/ , https://github.com/TideSDK/TideSDK
PhpDesktop https://code.google.com/p/phpdesktop/
Не хочешь юзать крестопарашу? Как я тебя понимаю, друг.
пора бы уже
>Ну сути это не меняет, а наследование хорошо тем что завтра например мы легко можем добавить новый тип вопроса не переделывая весь код.
Так я не говорю, что наследование плохо.
Я для этого и наследую все типы вариантов ответа от абстрактного класса. Хотя лучше, наверное, сделать интерфейс, а в него запихнуть всякие связанные с проверкой ответа методы.
>Чем? Поясни. И какой паттерн нравится больше?
Concrete Table Inheritance меня привлекает больше. И с ним будет легче, если я, например, завтра захочу добавить сверху вопросы на восстановление порядка / на соответствие.
А все дерево Тест-Вопрос-Ответы у нас в Yii же легко берется с помощью hasMany/hasOne методов.
Class Table Inheritance тоже катит. Я подумывал запихнуть id ответа, его тип и id вопроса в одну таблицу (и в базовый класс), а все связанное с типом по отдельным таблицам по 1-к-1 связи. Так у нас будет сплошная нумерация айди ответов и будет легко проверять в будущем тесты. Да и варианты ответов можно будет тасовать как угодно, в итоге придется просто сравнить айди выбранных ответов с ответом, а метод для этого запилить, собственно, в родительском абстрактном классе.
Зря не хочешь. Полезно расширять кругозор. Тем более что С++ довольно сложный и потому полезен.
Вот например только неьольшой с++ faq который стоит знать: http://www.parashift.com/c++-faq/
Если захочешь изучать, я могу подсказать по каким-то сложным моментам, например помочь разобраться с указателями или таблицами виртуальных функций.
>>419804
Глупо засовывать туда сервер, тем более с PHP. Если уж делать на веб-браузере, то без сервера и PHP, например с помощью Single Page App + прокинуть нужные функции снаружи (и все равно, будет есть память и тормозить если попробуешь сделать что-то сложное). Ты плохие советы даешь.
Разные языки лучше подходят для разных целей. PHP для разработки сайтов, а не десктопных приложений.
>>419821
запилим. Все равно тред весь день висел на главной. Повисим немного на второй странице.
>>419841
> Я для этого и наследую все типы вариантов ответа от абстрактного класса.
По моему у нас непонимание какое-то. Мне кажется, разных видов бывют именно Вопросы, потому наследовать надо их. А ВариантыОтветов одинаковые, будь то вопрос например с множественным или с одиночным выбором.
Насчет выбора схемы — я не наставиваю, ты можешь выбрать любую. Но сначала надо понять ее плюсы/минусы и как ты собираешься с ними бороться. Вообще, ты должен представлять себе плюсы/минусы всех этих 3 схем, иначе как ты можешь сделать выбор?
> Concrete Table Inheritance меня привлекает больше.
Вот ты не пишешь плюсы и минусы. Сложные моменты:
— для выборки всех вопросов к тесту надо делать либо несколько запросов либо сложный запрос с UNION
— как ты будешь хранить порядок следования вопросов? Как изменять его при перестановке вопросов местами и вставке новых?
— не будет единой нумерации id вопросов, id будут в каждой из 4 таблиц свои и будут повторяться
— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?
> Class Table Inheritance тоже катит.
Сложные моменты:
— как будет выглядеть запрос для выборки всех вопросов к тесту?
— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?
Варианты решения есть конечно, но я хочу увидеть понимаешь ли ты как это сделать или нет.
> Так у нас будет сплошная нумерация айди ответов
Вот это я не понял. По моему в любом из 3 вариантов наследования варианты ответа хранятся в отдельной таблице и нумерация у них и так сплошная.
Зря не хочешь. Полезно расширять кругозор. Тем более что С++ довольно сложный и потому полезен.
Вот например только неьольшой с++ faq который стоит знать: http://www.parashift.com/c++-faq/
Если захочешь изучать, я могу подсказать по каким-то сложным моментам, например помочь разобраться с указателями или таблицами виртуальных функций.
>>419804
Глупо засовывать туда сервер, тем более с PHP. Если уж делать на веб-браузере, то без сервера и PHP, например с помощью Single Page App + прокинуть нужные функции снаружи (и все равно, будет есть память и тормозить если попробуешь сделать что-то сложное). Ты плохие советы даешь.
Разные языки лучше подходят для разных целей. PHP для разработки сайтов, а не десктопных приложений.
>>419821
запилим. Все равно тред весь день висел на главной. Повисим немного на второй странице.
>>419841
> Я для этого и наследую все типы вариантов ответа от абстрактного класса.
По моему у нас непонимание какое-то. Мне кажется, разных видов бывют именно Вопросы, потому наследовать надо их. А ВариантыОтветов одинаковые, будь то вопрос например с множественным или с одиночным выбором.
Насчет выбора схемы — я не наставиваю, ты можешь выбрать любую. Но сначала надо понять ее плюсы/минусы и как ты собираешься с ними бороться. Вообще, ты должен представлять себе плюсы/минусы всех этих 3 схем, иначе как ты можешь сделать выбор?
> Concrete Table Inheritance меня привлекает больше.
Вот ты не пишешь плюсы и минусы. Сложные моменты:
— для выборки всех вопросов к тесту надо делать либо несколько запросов либо сложный запрос с UNION
— как ты будешь хранить порядок следования вопросов? Как изменять его при перестановке вопросов местами и вставке новых?
— не будет единой нумерации id вопросов, id будут в каждой из 4 таблиц свои и будут повторяться
— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?
> Class Table Inheritance тоже катит.
Сложные моменты:
— как будет выглядеть запрос для выборки всех вопросов к тесту?
— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?
Варианты решения есть конечно, но я хочу увидеть понимаешь ли ты как это сделать или нет.
> Так у нас будет сплошная нумерация айди ответов
Вот это я не понял. По моему в любом из 3 вариантов наследования варианты ответа хранятся в отдельной таблице и нумерация у них и так сплошная.
>По моему в любом из 3 вариантов наследования варианты ответа хранятся в отдельной таблице и нумерация у них и так сплошная.
Ну нет, так как у меня сейчас - нет.
>— для выборки всех вопросов к тесту надо делать либо несколько запросов либо сложный запрос с UNION
Так мы же решили воевать с AR? А там полно методов.
>— как ты будешь хранить порядок следования вопросов? Как изменять его при перестановке вопросов местами и вставке новых?
Я вообще планировал вопросы выводить в случайном порядке.
>— не будет единой нумерации id вопросов, id будут в каждой из 4 таблиц свои и будут повторяться
кк, пилим таблицу для вариантов, в которой будут три поля: id, id вопроса, тип ответа. В зависимости от последнего поля ломимся в любую нужную нам таблицу, где внешний ключ будет примарным.
>— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?
В таблице из вопроса выше.
>— как будет выглядеть запрос для выборки всех вопросов к тесту?
hasmany(Questions::ClassName(), "id => test_id") как-то так. И соответственно $test->questions.
>— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?
Наверное что-то вроде предыдуего.
> Ну нет, так как у меня сейчас - нет.
Ты не можешь, чтобы не было разногласий, объяснить какие у тебя сейчас (или планируется сделать) сущности, таблицы и как они связаны? А то я боюсь что я не совсем понимаю что именно ты делаешь.
> Я вообще планировал вопросы выводить в случайном порядке.
На странице редактирования теста есть порядок вопросов и их можно переставлять местами. Не знаю, можно сделать и случайный порядок при прохождении, но все равно, при редактировании теста желательно сохранять порядок, а не перемешивать их случайно каждый раз. Ну и плюс. мы можем захотеть завтра сделать переключение «выводить вопросы случайно/последовательно». Так что порядок, думаю, нужен.
> кк, пилим таблицу для вариантов, в которой будут три поля: id, id вопроса, тип ответа.
А почему «тип ответа» хранится не в вопросе? У нас же вроде есть разные типы вопросов, а не ответов: вопрос с одиночным выбором, вопрос с множественным выбором, вопрос с вводом ответа и т.д.
>Ты не можешь, чтобы не было разногласий, объяснить какие у тебя сейчас (или планируется сделать) сущности, таблицы и как они связаны?
Позже.
>будет есть память
Там же будет лишь один клиент (каждой программой будет пользоваться один юзер). 4 гига памяти и 4 ядра процессора будут доступны одному клиенту. Чему там тормозить ?
> тормозить
Чтобы не тормозил интерфейс с тысячью дивами есть библиотека react.js. Но тысяча дивов это редкость.
В JS треде вроде
>>419939
А зачем ты сделал разные типы ответов, а не разные типы вопросов? Мне кажется, с разными типами вопросов (а не ответов) было бы правильнее.
Также, если бы у вопроса был тип, не было бы проблемы когда у одного вопроса оказываются варианты ответа разных типов.
Как в твоей схеме например определить тип вопроса? Он нигде не указан.
Как реализовать вопрос со свободным ответом вроде «напишите свое мнение о творчестве Пушкина»?
Каким запросом можно выбрать все варианты ответа к вопросу?
По моему, ты сделал не очень удобную систему. И запросы к ней получаются сложные, потому непонятно получится ли это реализовать в Юи и не станет ли он все это выбирать запросами в цикле по одному. Да и вручную если надо написать запрос, неудобно.
Использую сборку open server самую расширеную, при попытке вывода даты на кириллице, выводится в виде кракозябр, как исправить? Гугл говорит, что нужно с локалью что-то делать, как решить проблему? Заранее благодарю
Это копия, сохраненная 24 января 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.