Это копия, сохраненная 29 августа 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>503607
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
- Простая, но полезная задача сделать список студентов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Yii2: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование
- Если ты все решил, переходи к Symfony 2/Doctrine 2
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863
Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.github.io/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git:
Подскажи сайты для поиска работы, я не умею гуглить? brainstorage.me, geekjob.ru, hh.ru
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Где искать работу и заказы — hh.ru, geekjob.ru, brainstorage.me, fl.ru, odesk.com. Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Легитимный тред с прошаренным ОПом и гейскими картинками все еще здесь https://2ch.hk/pr/res/510035.html#bottom
Даже ссылку на тред правильно не поменяли, ну их. И у нас всего 600 постов пока.
>>514851
> for ($i=0; $i<=strlen($lowercasedtext);$i++) {if (mb_substr($lowercasedtext,$i,1) != $empty) {
Чтобы убрать пробелы, используй функцию str_replace или strtr, заменяя пробелы на пустую строку.
>for ($ii=0; $ii <= $half; $ii++){
После $i можно использовать $j, $k, Они лучше читаются.
> strlen($without)-$ii-1
Тут ошибка. strlen возвращает длину в байтах, а не число букв (для русских букв не совпадает). Надо использоват mb_strlen. Почитай урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8
> \tif ($ii == $half){
> echo "this word is a fucking PALINDROME, congrats, m8";
Это неправильно так как ты не можешь по совпадению только первой и последней букв сказать что слово палиндром. Надо проверить все.
И смотри внизу ошибку:
> PHP Notice: Undefined variable: without in /home/hz6bPR/prog.php on line 12
Ты обращаешься к несуществующей на тот момент переменной, надо сначала ей присвоить какое-нибудь значение а потом использовать.
Попробуй сделть чтобы программа работала с руссикми буквами. Если что, задавай вопросы.
>>514860
Тролль, уходи.
Даже ссылку на тред правильно не поменяли, ну их. И у нас всего 600 постов пока.
>>514851
> for ($i=0; $i<=strlen($lowercasedtext);$i++) {if (mb_substr($lowercasedtext,$i,1) != $empty) {
Чтобы убрать пробелы, используй функцию str_replace или strtr, заменяя пробелы на пустую строку.
>for ($ii=0; $ii <= $half; $ii++){
После $i можно использовать $j, $k, Они лучше читаются.
> strlen($without)-$ii-1
Тут ошибка. strlen возвращает длину в байтах, а не число букв (для русских букв не совпадает). Надо использоват mb_strlen. Почитай урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8
> \tif ($ii == $half){
> echo "this word is a fucking PALINDROME, congrats, m8";
Это неправильно так как ты не можешь по совпадению только первой и последней букв сказать что слово палиндром. Надо проверить все.
И смотри внизу ошибку:
> PHP Notice: Undefined variable: without in /home/hz6bPR/prog.php on line 12
Ты обращаешься к несуществующей на тот момент переменной, надо сначала ей присвоить какое-нибудь значение а потом использовать.
Попробуй сделть чтобы программа работала с руссикми буквами. Если что, задавай вопросы.
>>514860
Тролль, уходи.
>>Стоит сделать проверку на наличие apc и при отсуствии откатываться на файловый кеш
> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L12
> $config->setQueryCacheImpl(new \Doctrine\Commmon\Cache\MemcacheCache());
По моему это не файловый кеш
> Это то о чем я говорил, что $app->getRootUri() возвращает не то что мне нужно, он показывает путь до файла index.php, то есть в моем случае он возвращает "/"
Ну и отлично, припиши к этому 'css/bootsrap.css' и получишь нужный путь который независим от текущего URL. Разве это то что надо?
> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/MediaInfo.php#L44
Эту функцию надо сделать либо нестатической либо сделать чтобы она сама создавала и возвращала объект. А то странно смотрится:
> $mediaInfo = $mediaInfo->setMediaInfo($mediaInfo, $info);
Ехал mediaInfo через mediaInfo.
Копипасту из ифов стоит заменить на список полей + цикл по нему.
json_decode лучше использовать с массивом, а не объектом StdClass, так как для работы с массивами есть много функций, а для StdClass нет.
Класс MediaInfoType лучше поместить в другую папку, например, Types.
> public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
Тут по идее должен возвращаться SQL-код для типа этого поля в MySQL (например если ты хочешь создать таблицу на основе аннотаций, доктрине надо знать какому типу поля соответствует твой тип). Посмоти как реализованы другие типы в доктрине и сделай по аналогии:
https://github.com/doctrine/dbal/tree/master/lib/Doctrine/DBAL/Types
Класс File стоит переименовать в FileUtil или FileUploader и перенести в другую папку.
Почему тип регистрируешь через
> Type::addType('mediainfotype', 'Uppu3\Resource\MediaInfoType');
А не как в мануале советуют,
> $conn->getDatabasePlatform()->registerDoctrineTypeMapping('db_mytype', 'mytype');
?
>>Стоит сделать проверку на наличие apc и при отсуствии откатываться на файловый кеш
> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L12
> $config->setQueryCacheImpl(new \Doctrine\Commmon\Cache\MemcacheCache());
По моему это не файловый кеш
> Это то о чем я говорил, что $app->getRootUri() возвращает не то что мне нужно, он показывает путь до файла index.php, то есть в моем случае он возвращает "/"
Ну и отлично, припиши к этому 'css/bootsrap.css' и получишь нужный путь который независим от текущего URL. Разве это то что надо?
> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/MediaInfo.php#L44
Эту функцию надо сделать либо нестатической либо сделать чтобы она сама создавала и возвращала объект. А то странно смотрится:
> $mediaInfo = $mediaInfo->setMediaInfo($mediaInfo, $info);
Ехал mediaInfo через mediaInfo.
Копипасту из ифов стоит заменить на список полей + цикл по нему.
json_decode лучше использовать с массивом, а не объектом StdClass, так как для работы с массивами есть много функций, а для StdClass нет.
Класс MediaInfoType лучше поместить в другую папку, например, Types.
> public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
Тут по идее должен возвращаться SQL-код для типа этого поля в MySQL (например если ты хочешь создать таблицу на основе аннотаций, доктрине надо знать какому типу поля соответствует твой тип). Посмоти как реализованы другие типы в доктрине и сделай по аналогии:
https://github.com/doctrine/dbal/tree/master/lib/Doctrine/DBAL/Types
Класс File стоит переименовать в FileUtil или FileUploader и перенести в другую папку.
Почему тип регистрируешь через
> Type::addType('mediainfotype', 'Uppu3\Resource\MediaInfoType');
А не как в мануале советуют,
> $conn->getDatabasePlatform()->registerDoctrineTypeMapping('db_mytype', 'mytype');
?
https://github.com/V3N0m21/Uppu3
Поправил несколько моментов, чуть не сломал мозг делая custom type в доктрине, но все-равно до конца не уверен что все правильно, как-то слишком мудрено получилось, ну и в моем случае не дает никаких плюсов, разве что в целях обучения и понимания.
>При ресайзе маленькие картинки не увеличиваются? ЧТо-то я не вижу проверки на это.
Там стоит проверка на размер, и если одна из сторон меньше заданного размера, задается размер самой картинки
https://github.com/V3N0m21/Uppu3/blob/master/app/Helper/Resize.php#L55
>Стоит сделать проверку на наличие apc и при отсуствии откатываться на файловый кеш
https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L9
Поправил, но не уверен что это правильное решение, я так и не нашел четкого мануала по этому поводу, походу все приходят к пониманию этого методом проб и ошибок.
> {{ app.request.getRootUri() }}../css/bootstrap.min.css
>Что-то это странно. Зачем тут две точки? Мне кажется сразу должен идти путь. Что у тебя выдает getRootUri() ?
Это то о чем я говорил, что $app->getRootUri() возвращает не то что мне нужно, он показывает путь до файла index.php, то есть в моем случае он возвращает "/"
Остальные замечания подправлю и сделаю древовидные комменты, а сейчас интересует вопрос правильно ли я сделал custom type в доктрине
Оставайся на связи, ебанашка в бамплимите.
______
Кто-нить знает, как скачать 1С битрикс? чот грузится долго.
Точно, об этом я не подумал. А какие вообще полезные скрипты со всем этим можно писать? Кроме авторизации и комментариев?
[function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in
Когда я работаю с определёнными и методами и не выскакивает никаких проблем когда работаю с другими методами из АПИ ВК? Код в этом случае выглядит следующим образом:
$uid = "555555555555"; //тут я заменил на случайный
$text = "Ты понимаешь что ты поехавший?";
$mes = file_get_contents('https://api.vk.com/method/messages.send?domain='.$uid.'&message='.$text);
$mes = json_decode($friends);
print_r($mes);
Uncaught exception 'Exception' with message 'cURL error 77: error setting certificate verify locations: CAfile: cacert.pem CApath: none
Как быть? В php классе cURL явно нигде не вызываю, curl.cainfo = 'cacert.pem'; подключил.
Как быть?
$lowercasedtext = str_replace(' ',$empty,$lowercasedtext);
Зачем так делать, когда есть trim.
Такое наследование классов допускается в php?
То есть после каждого действия перезагрузка сервера а не проблемы с яваскриптом и прочим подобным.
echo "Панель добавления материалов";
echo '<form enctype="multipart/form-data" method="post" action="work.php">
Документ:</br>
<input type="file" name="doc" /></br>
<input type="text" value="Название" name="name" /></br>
<select name="type">
<option value=1>Собственные материалы</option>
<option value=2>Дополнительные материалы</option>
</select></br>
<input type="text" value="Описание" name="descr" /></br>
<input type="submit" value="Загрузить" />
</form>';
Ну и обработчик work.php
$link = mysql_connect('localhost', 'dbroot', 'passwd');
mysql_select_db('database', $link) or die('Could not select database.');
if (!$link) {die('Ошибка соединения: ' . mysql_error());}
else {
\tif ( empty( $_FILES['doc']['name'] )) echo "ОШИБКА ЗАГРУЗКИ";
\tif ( $_FILES['doc']['error'] > 0 ) echo "ОШИБКА ЗАГРУЗКИ";
$doc = file_get_contents( $_FILES['doc']['name'] );
$doc = mysql_escape_string( $doc );
$query="INSERT INTO `data_storage` VALUES(NULL,'".$_POST['type']."', '".$doc."','".$_POST['descr']."')";
mysql_query( $query ) or die ('MysqlERRROR!');
echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
}
Результат на скрине. ЧЯДНТ?
echo "Панель добавления материалов";
echo '<form enctype="multipart/form-data" method="post" action="work.php">
Документ:</br>
<input type="file" name="doc" /></br>
<input type="text" value="Название" name="name" /></br>
<select name="type">
<option value=1>Собственные материалы</option>
<option value=2>Дополнительные материалы</option>
</select></br>
<input type="text" value="Описание" name="descr" /></br>
<input type="submit" value="Загрузить" />
</form>';
Ну и обработчик work.php
$link = mysql_connect('localhost', 'dbroot', 'passwd');
mysql_select_db('database', $link) or die('Could not select database.');
if (!$link) {die('Ошибка соединения: ' . mysql_error());}
else {
\tif ( empty( $_FILES['doc']['name'] )) echo "ОШИБКА ЗАГРУЗКИ";
\tif ( $_FILES['doc']['error'] > 0 ) echo "ОШИБКА ЗАГРУЗКИ";
$doc = file_get_contents( $_FILES['doc']['name'] );
$doc = mysql_escape_string( $doc );
$query="INSERT INTO `data_storage` VALUES(NULL,'".$_POST['type']."', '".$doc."','".$_POST['descr']."')";
mysql_query( $query ) or die ('MysqlERRROR!');
echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
}
Результат на скрине. ЧЯДНТ?
>$query="INSERT INTO `data_storage` VALUES(NULL,'".$_POST['type']."', '".$doc."','".$_POST['descr']."')";
Шёл 2015 год...
Да похуй мне на ваши инъекции. Я для себя делаю.
Надо будет выложить не долго будет засунуть туда реалэскейпстринг
нету такой директории - написано же. либо папки нет, либо файла, алсо не уверен, что расширение жпг можно доставать функцией файл гет контентс.
use Zend\View\Model\ViewModel;
перепечатываю туториал с оф. сайта фреймворка, но в библиотеке нет таких директив, значит ли это, что мне нужно обновить библиотеку?
Пхп для чайников.
Как часто в ПХП используется класс DOMDocument, он чаще используется для чтения? Или для создания тоже часто используется? Я сейчас начал его учить и в качестве обучения решил создать таблицу, довольно много времени заняло, кстати как добавить атрибуты таблицы border = 1 там например через класс DOMDocument
Недавно я беседовал со знакомым и заговорили про это вот дело.
Ну и он мне рассказывает о флешкуки, lso итд, т.е. о том, чего не было в учебниках и на разных сайтах.
Так к чему я это - где помимо собственно изучения можно следить за новинками и вообще тенденциями что ли? Чтобы не вышло, что я изучил то, что уже давным-давно устарело.
Значит я по месту попал, но если пхп такой востребованный, то почему его все хуесосят?
С чего посоветуешь учить? Какие основы я должен знать, пока только знаю связь между субд, сервером и пользователем. С полного нуля начинаю.
>если пхп такой востребованный, то почему его все хуесосят?
Простота, как следствие низкий порог вхождения, как следствие много идиотов в области, как следствие много говнокода. Но в умелых руках...
Я вот, например, часто сталкиваюсь с ситуацией, когда хуесосят убунту, советуя переходить на другие дистрибутивы линукса. Только вот всего парочка вопросов выводит этих высокомерных малограмотных далбаёбов на чистую воду, во всей красе демонстрируя их невежественность и неосведомлённость. Некоторые и не знают про mini iso, судят по Desktop Environment обо всём дистрибутиве, увидивляются, когда я им показываю, что "так", оказывается можно и на убунте.
Поэтому можешь стать джедаем PHP, чтобы потом уверенно ссать ливнем аргументов на ёбла хейтеров.
Почитать не знаю что тебе посоветовать, я так и не понял, что ты знаешь, а что нет.
Конечно не к месту, но разве разные дистры линя это не просто одно и то же ядро, но с разными драйверами и софтом идущими изначально (а, ну и граф.оболочкой конечно)?
Есть различия в установке софта, расположении конфигурационных файлов. Но в целом да, популярные дистрибутивы сейчас толком ничем друг от друга не отличаются.
Предположим, что я нихуя не знаю, конечно в моём техновузе немного рассказывали про базы данных, я ставил сайт на хостинг и регистрировал домен. Очень смкьно понимаю как это работает, может даже ошибочно.
Я вот представляют себе так.
Есть хостинг, место на чьём то компе куда ты загружаешь все нужные файлы для своего сайта. Там находятся файлы с хтмл кодом возможно и цсс, но я не видел почему-то
Когда юзер заходит на сайт то у него открывается хтмл код и браузер преобразует его в веб страничку. Юзер лазит по сайту и по сути тут везде хтмл. Юзер региструется на сайте и его данные попадают в базу данных которая предоставляется хостингом как эта база данных работает я вообще не ебу. Жаваскрипт отвечает за анимашки и эффекты всякие.
Я правильно мыслю?
В каком месте работает пхп и какую функцию во всем этом он выполняет ? Я этого не понимаю, вроде хочу учить язык, а толком понять как он используется понять не могу.
Можешь подсказать литературу которая позволит для начала понять КАК ЭТО РАБОТАЕТ.
А то вот все пишут код и все такое, а вот куда они его засовывает я понять не могу.
>Я правильно мыслю?
В общих чертах - да.
Советую "Изучаем PHP и MySQL" Мишель Е. Дэвис, Джон А. Филлипс.
Так объясни вкратце в каком промежутке принимает участие пхп и что он делает своими словами?
http://archive-ipq-co.narod.ru/
проскроль до "А как PHP используется на сайтах?" ленивая макака
Сажи лже-треду.
Нет.
Можно:
- class B extends A
- class C extends A
- class D extends B
- class F extends D
Нельзя:
- class C extends A, B
Скажите вот третий пик - говнокод? Нужно делать как написано на первом пике? Так правильней? Или похуй?
Как решить ту задачку по способу автора?
>быстрофикс
Да, проебал в конце второго пика двойную кавычку, ну то похуй.
Если справить, то ошибку не выдает, но вот рандомное число все равно не выводит, вместо $random - пустота
а все разобрался, оказывается еще не работало потому что в скобках в mt_rand была точка, хотя на втором пике стоит запятая хз как она изменилась на точку.
Кароч все работает
хорошо, ток подскажи, почему постоянно выполняется первое условие, хотя оно нихуя не выполняется так как $random1 не равен $random2.
написал эту задачку не смотря на то, что писал автор, просто подсмотрел как правильно исопльзовать условие действие, интересно так
а все, сам разобрался, надо ставить двойное равно, сорян, что тут так насрал, больше не буду
Знаете, что я заметил. Никогда не учитесь по русскоязычным туториалам. Пытался ТРИ раза создать MVC по русскоязычному видео с юутуба - ни разу не вышло, сейчас делаю по англоязычному - все получается и все понятно разъяснено. Русня сосет.
Знак равенства == должен быть. Слушай, нахуя тебе эти задачки обоссанные от обосанного пидораса-анимешника, если ты нихуя не знаешь - пиздуй по самоучителю все делай.
Да что блять учить то. Вот я потихоньку познакомился с переменными, циклами и прочей, уже написал пару задачек интересно и то, что нужно. Что не так то?
Вот это вот работает корректно, но я чисто теоретически не могу понять, как можно разбить строку по разделителю, предварительно убрав разделитель rtrim??
я отличаю, я сделал ту задачу не читая пояснений автора, хотел сам, без помощи, потом почти сразу же нашел ошибку и тоже сам
И ещё один вопрос, есть несколько прог которые автоматически регистрируют в каталогах, собственно интересно как это у них получается? Каталогов сайтов очень большое количество и все они по разному сделаны, не писать же парсер для каждого? Или все они по одинаковому сделаны и есть какие-то общие АПИ в которые можно закинуть адрес сайта, выбрать категорию, ключевые слова и всё остальное в автоматическом режиме?
Если у них есть АПИ, то есть смысл попробовать написать скрипт который будет проверять насколько живой тот или иной каталог сайтов. То есть загружаешь файл со списком (урлами) каталогов, проверяешь каждый и возвращаешь уже файл только с теми которые реально работают.
>>517102
да не слушай никого. твоя ошибка - дело привычки. Могу посоветовать при проверке равенства писать сначала не имя переменной, а её значение. Т.е if('znachenie==$peremennaya') ,а не if($peremennaya=='znachenie'). В этом случае,если перепутаешь знаки, скрипт выдаст ошибку и проще будет исправить.
> «Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок:
>В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).
Не понимаю, как можно оформить последний пункт с выводом куска текста. Помогите, кто знает, пожалуйста
echo "Число a равно {$a} и оно {$aValue}";
Иглавный вопрос. Почему на оп-пике кот?
модель только возвращает массив с данными, а в контроллере можешь делать все что угодно с этими данными. Если так не выходит, значит, что у тебя неправильная модель хотя, я новичек
Модель нужна ТОЛЬКО для работы с БД/тем местом где у тебя данные. Также в ней могут быть правила ввода данных(name не более 255 символов, например). Естественно что ты должен получать удобные для последующих операций данные, так что если там есть например json, то имеет смысл его декодировать.
После, в контроллере ты с этими данными оперируешь как тебе хочется и высераешь их на вьюху. Во вьюхе логики быть не должно.
Такие дела.
ОП, будь человеком, в следующий раз в заголовке/в первой строке треда пиши слово PHP, чтобы господа юзающие "Избранное" на харкаче и/или юзающие куклу, могли без боли понять че это за тред в списке
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>510035
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
продолжение этой захватывающей пасты в ОП-посте
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Тред создал не ОП а какой-то торопыга.
>>517582
Если вывести как JSON то должен быть метод в контроллере или вью вроде sendJsonResponse(array $data)
>>517588
Мне слово «массив» тут не нравится. Это может быть и объект, например функция
$studentMapper->getStudentById($id);
вернет объект-студента.
>>517514
Тред создал не ОП
> Зачем вокруг переменной фигурные скобки?
Можно и без них, но если надо отделить переменную от текста то они нужны:
{$x}kg
Также для сложных выражений с массивами они нужны, мануал: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
>>517481
Тебе надо сначала изучить CSS. У нас есть задачки на HTML/CSS и в них ссылки на сайты с туториалами.
>>517490
Хватит и CSS
>>517452
Ну например выводить можно так:
Ошибки:
- не простой а золотой
- жызнь
- жыр
Или так:
[жы]знь [жы]р не простой[ a] золотой
Тред создал не ОП а какой-то торопыга.
>>517582
Если вывести как JSON то должен быть метод в контроллере или вью вроде sendJsonResponse(array $data)
>>517588
Мне слово «массив» тут не нравится. Это может быть и объект, например функция
$studentMapper->getStudentById($id);
вернет объект-студента.
>>517514
Тред создал не ОП
> Зачем вокруг переменной фигурные скобки?
Можно и без них, но если надо отделить переменную от текста то они нужны:
{$x}kg
Также для сложных выражений с массивами они нужны, мануал: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
>>517481
Тебе надо сначала изучить CSS. У нас есть задачки на HTML/CSS и в них ссылки на сайты с туториалами.
>>517490
Хватит и CSS
>>517452
Ну например выводить можно так:
Ошибки:
- не простой а золотой
- жызнь
- жыр
Или так:
[жы]знь [жы]р не простой[ a] золотой
> - мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Ненавижу, блядь, таких даунов.
Кому-то удобнее отступ в 2 пробела, кому-то в 8, зачем навязывать свое оформление? Табуляция позволяет выглядеть коду так, как программист привык.
А еще стирать такие отступы заебешься. С табуляцией - нажал Backspace один раз, и все, а тут надо держать эту клавишу и следить, чтобы выравнивание не поехало.
А все таки, каким способом мне достать кусок текста? Какую функцию использовать?
запости код и напиши на чем остановился. Может быть подскажем тогда что делать дальше.
>>517102
Не беда, начинающие часто путают = и ==. Ну теперь-то ты вряд ли их перепутаешь.
>>517051
rtrim убирает разделитель только с правого края а не из всей строки:
rtrim("/a/c/c///") => /a/c/c
Ну и это:
> FILTER_SANITIZE_URL
мне не нравится. Зачем это? Ты можешь объяснить как и от чего оно защищает?
>>517028
Все нормально, не слушай троллей.
>>517017
Надо понимать что ты пишешь а не бездумно переписывать. Если ты понимаешь то ты легко сможешь исправить опечатку/ошибку.
Мне тут пришла мысль что надо всегда давать примеры с ошибками и опечаткми (и предупреждать об этом), чтобы люди хоть немного думали своей головой.
>>516900
Он не то что вопросы, он тред игнорировал пока старый не закончился.
>>516878
HTML файлы используются в статических сайтах, то есть сайтах содержимое которых создает вебмастер и сохраняет на диск в виде файлов.
PHP используется в динамических сайтах, в которых HTML код геенрируется скриптами на PHP. Как правило PHP скрипт берет данные из базы (например список комментариев) и вставляет в заранее заголовтенный шаблон, получая на выходе динамиечски сгенерированную HTML страничку которую он отдает пользователю.
Статиеские сайты обновляет только вебмастер, руками. Динамические сайты позволяют обновлять содержимое в базе (например добавлять комментарии или редактировать статьи) автоматически, без участия вебмастера.
запости код и напиши на чем остановился. Может быть подскажем тогда что делать дальше.
>>517102
Не беда, начинающие часто путают = и ==. Ну теперь-то ты вряд ли их перепутаешь.
>>517051
rtrim убирает разделитель только с правого края а не из всей строки:
rtrim("/a/c/c///") => /a/c/c
Ну и это:
> FILTER_SANITIZE_URL
мне не нравится. Зачем это? Ты можешь объяснить как и от чего оно защищает?
>>517028
Все нормально, не слушай троллей.
>>517017
Надо понимать что ты пишешь а не бездумно переписывать. Если ты понимаешь то ты легко сможешь исправить опечатку/ошибку.
Мне тут пришла мысль что надо всегда давать примеры с ошибками и опечаткми (и предупреждать об этом), чтобы люди хоть немного думали своей головой.
>>516900
Он не то что вопросы, он тред игнорировал пока старый не закончился.
>>516878
HTML файлы используются в статических сайтах, то есть сайтах содержимое которых создает вебмастер и сохраняет на диск в виде файлов.
PHP используется в динамических сайтах, в которых HTML код геенрируется скриптами на PHP. Как правило PHP скрипт берет данные из базы (например список комментариев) и вставляет в заранее заголовтенный шаблон, получая на выходе динамиечски сгенерированную HTML страничку которую он отдает пользователю.
Статиеские сайты обновляет только вебмастер, руками. Динамические сайты позволяют обновлять содержимое в базе (например добавлять комментарии или редактировать статьи) автоматически, без участия вебмастера.
>Кому-то удобнее отступ в 2 пробела, кому-то в 8, зачем навязывать свое оформление?
Причин куча, гугли.
>С табуляцией - нажал Backspace один раз, и все, а тут надо держать эту клавишу и следить, чтобы выравнивание не поехало.
Установи нормальный редактор.
> А то вот все пишут код и все такое, а вот куда они его засовывает я понять не могу.
Прежде чем писать сайты на PHP, надо выучить сам язык. Потмоу мы начинаем с задачек а потом переходим к приложениям которые работают в браузере: список студентов, файлообменник.
> Юзер региструется на сайте и его данные попадают в базу данных которая предоставляется хостингом
Для регистрации как раз нужен PHP скрипт который примет, проверит данные и внесет их в базу. Обычный HTML ничего на сервере сделать не может, он для статических, неизменных сайтов.
>>516873
Ядро одно и то же, но например пакетный менеджер разный (apt vs yum).
>>516868
Завидуют успеху или может их на собеседовании прокатили.
>>516868
Начинай с учебника из ОП-поста (он для полных нубов), затем переходи к задачам на студентов и файлообменник.
>>516865
Проще может wget взять?
А так, гугли HTTP-клиенты, например buzz, guzzle и библиотеки разбора HTML вроде phpquery.
>>516854
Флеш умирает (последние лет 5, но никак не умрет) так что думаю тебе это не очень актуально. Но если надо, можно взять учебник/мануал по нему и почитать.
> где помимо собственно изучения можно следить за новинками и вообще тенденциями что ли?
Хабр читай для начала.
>>516849
HTML/CSS/SQL/JS/PHP
>>516814
Синтаксическая ошибка, там написано в каком файле и какой строке. Апач и htaccess тут не при чем.
>>516782
Чаще для чтения наверно, но и для создания можно тоже использовать.
Для вывода HTML страницы обычно используют шаблоны (пример http://www.phpinfo.su/articles/practice/shablony_v_php.html ) а не генерирутют дерево DOM. DOM больше для работы с XML.
> А то вот все пишут код и все такое, а вот куда они его засовывает я понять не могу.
Прежде чем писать сайты на PHP, надо выучить сам язык. Потмоу мы начинаем с задачек а потом переходим к приложениям которые работают в браузере: список студентов, файлообменник.
> Юзер региструется на сайте и его данные попадают в базу данных которая предоставляется хостингом
Для регистрации как раз нужен PHP скрипт который примет, проверит данные и внесет их в базу. Обычный HTML ничего на сервере сделать не может, он для статических, неизменных сайтов.
>>516873
Ядро одно и то же, но например пакетный менеджер разный (apt vs yum).
>>516868
Завидуют успеху или может их на собеседовании прокатили.
>>516868
Начинай с учебника из ОП-поста (он для полных нубов), затем переходи к задачам на студентов и файлообменник.
>>516865
Проще может wget взять?
А так, гугли HTTP-клиенты, например buzz, guzzle и библиотеки разбора HTML вроде phpquery.
>>516854
Флеш умирает (последние лет 5, но никак не умрет) так что думаю тебе это не очень актуально. Но если надо, можно взять учебник/мануал по нему и почитать.
> где помимо собственно изучения можно следить за новинками и вообще тенденциями что ли?
Хабр читай для начала.
>>516849
HTML/CSS/SQL/JS/PHP
>>516814
Синтаксическая ошибка, там написано в каком файле и какой строке. Апач и htaccess тут не при чем.
>>516782
Чаще для чтения наверно, но и для создания можно тоже использовать.
Для вывода HTML страницы обычно используют шаблоны (пример http://www.phpinfo.su/articles/practice/shablony_v_php.html ) а не генерирутют дерево DOM. DOM больше для работы с XML.
> Причин куча, гугли.
Хоть одну?
> Установи нормальный редактор.
В нормальном редакторе надо нажимать Shift-Tab. А при использовании табуляции - просто Backspace. Одну клавишу нажимать гораздо быстрее.
Тут http://php.net/manual/ru/pdo.connections.php есть способ но он как я понимаю без четких гарантий (так как не факт что ты можешь найти и уничтожить все ссылки в большой программе). Фактически получается, что в большой программе никак. В маленькой — как описано в документации.
С другой стороны при завершении скрипта объект все таки будет уничтожен (как и все остальные переменные) и соединение закроется.
>>516657
Я не понимаю, что значит « в библиотеке нет таких директив»? Где ты смотришь какие «директивы» есть а какие нет?
И что у тебя за библиоека, какой версии? Не ZF1 случайно?
>>516628
твоя манера общения поиску ответа не способствует. То, что тебе написали про mysql_query, правильно написали, так код писать вообще нельзя, ты плохой учбеник взял.
расширение mysql устарело (открой мануал по mysql_query и посмотри сам), вставлять POSt-переменные прямо в запрос это SQL инъекция. Надо использовать плейсхролдеры.
Я не знаю что за учебник ты читал но советую его выкинуть так как его автор сам полный ноль и ничему научить не сможет.
>>516617
Надо делать либо правильно либо не делать вообще.
Вот почитай про PDO например: http://habrahabr.ru/post/137664/
Не любишь PDO, читай про mysqli но там после каждого вызова надо if с проверкой на ошибки писать: http://habrahabr.ru/post/141127/
> Надо будет выложить не долго будет засунуть туда реалэскейпстринг
Что тебе мешает сразу писать правильно? Дай угадаю, неохота писать длинное название mysql_real_escape? Ну так сделал бы функцию которая получает данные и экранирует перед вставкой в запрос. А еще лучше возьми PDO где это уже встроено.
>>516599
Он же пишет, файл не найден. Проверь какой файл он ищет и какая текущая директория (echo getcwd(); ).
Алсо
> $doc = file_get_contents( $_FILES['doc']['name'] );
name это имя файла на компьютере пользователя а не на сервере. Почитай мануал по загрузке файлов: http://php.net/manual/ru/features.file-upload.post-method.php
Вообще, у тебя пока маловато знаний чтобы писать «панель добавления материалов». Сначала надо изучить работу с формами и базой. Я советую пройти наши задачки на список студентов и файлообменник, и тогда ты сможешь свою задачу решить с легкостью. Там правда ООП надо знать, но по ООП у меня есть глава в учебнике.
Тут http://php.net/manual/ru/pdo.connections.php есть способ но он как я понимаю без четких гарантий (так как не факт что ты можешь найти и уничтожить все ссылки в большой программе). Фактически получается, что в большой программе никак. В маленькой — как описано в документации.
С другой стороны при завершении скрипта объект все таки будет уничтожен (как и все остальные переменные) и соединение закроется.
>>516657
Я не понимаю, что значит « в библиотеке нет таких директив»? Где ты смотришь какие «директивы» есть а какие нет?
И что у тебя за библиоека, какой версии? Не ZF1 случайно?
>>516628
твоя манера общения поиску ответа не способствует. То, что тебе написали про mysql_query, правильно написали, так код писать вообще нельзя, ты плохой учбеник взял.
расширение mysql устарело (открой мануал по mysql_query и посмотри сам), вставлять POSt-переменные прямо в запрос это SQL инъекция. Надо использовать плейсхролдеры.
Я не знаю что за учебник ты читал но советую его выкинуть так как его автор сам полный ноль и ничему научить не сможет.
>>516617
Надо делать либо правильно либо не делать вообще.
Вот почитай про PDO например: http://habrahabr.ru/post/137664/
Не любишь PDO, читай про mysqli но там после каждого вызова надо if с проверкой на ошибки писать: http://habrahabr.ru/post/141127/
> Надо будет выложить не долго будет засунуть туда реалэскейпстринг
Что тебе мешает сразу писать правильно? Дай угадаю, неохота писать длинное название mysql_real_escape? Ну так сделал бы функцию которая получает данные и экранирует перед вставкой в запрос. А еще лучше возьми PDO где это уже встроено.
>>516599
Он же пишет, файл не найден. Проверь какой файл он ищет и какая текущая директория (echo getcwd(); ).
Алсо
> $doc = file_get_contents( $_FILES['doc']['name'] );
name это имя файла на компьютере пользователя а не на сервере. Почитай мануал по загрузке файлов: http://php.net/manual/ru/features.file-upload.post-method.php
Вообще, у тебя пока маловато знаний чтобы писать «панель добавления материалов». Сначала надо изучить работу с формами и базой. Я советую пройти наши задачки на список студентов и файлообменник, и тогда ты сможешь свою задачу решить с легкостью. Там правда ООП надо знать, но по ООП у меня есть глава в учебнике.
ой смотрите, кто это у нас собственной персоной заявился.
Ну и я не знаю, планируешь ты работать программистом или иможет у тебя это просто хобби. Но в программисты, если ты будешь учиться по устаревшим учебникам и писать такой код, тебя не возьмут, а если ты пишешь для себя то наверняка ты хочешь писать хороший современный понятный код, а не какой попало. Потому советую выкинуть старый учебник и учиться в нашем треде.
>>516404
Для начала пойдет. Но JS/DOM не такие и сверхсложные вещи, а их знание даст тебе плюсы на собеседовании (если ты хочешь работать программистом) и даст тебе новые возможности по оформлению интерфейса страниц (если ты делаешь проекты для себя).
>>516393
В первую очередь для XML, но умеет читать и генерировать HTML тоже.
> Как через ПХП залезть в HTML DOM,
Создай объект и сделай в нем loadHTML, как в мануале: http://php.net/manual/ru/class.domdocument.php
>>516260
Во-первых, код можно запускать в консоли (на винде в консоли не будет русских букв). ВО-вторых, в некоторых IDE можно запускать код не выходя их них, в встроенной консоли (с русскими буквами в том числе).
Далее, htaccess для задач из учебника не требуется. Но если он и требуется, то на своем локалхосте ты точно можешь его включить.
Как ты пробуешь запускать код?
Как запустить код в консои описано тут в конце: https://gist.github.com/codedokode/7054af4a03865c4cc863
Тебе может быть проще запустить код через браузер под апачом.
>>516241
Так не заливай чужие работы.
>>516237
Без текста ошибок ссылки на статью и тд. мы помочь вряд ли можем. Текст ошибки, если не выовдится, ищи в логе ошибок (он доступен либо по FTP либо в панели управления).
>>516052
да
>>516011
Тупые обезьяны и любители так обзываться идут в другие треды.
>>516009
trim удаляет символы только с краев, а str_replace везде.
>>516008
Тупые обезьяны и любители так обзываться идут в другие треды.
>>516005
Ты вряд ли так научишься, только нахватаешься поверхностных знаний и умения копипастить код.
>>515905
> Как быть? В php классе cURL явно нигде не вызываю, curl.cainfo = 'cacert.pem'; подключил.
А файл cacert.pem в какой папке лежит? Надо наверно полный путь писать. Он еще какой-то CAPath упоминает, может надо его задать?
В мануале написано:
http://php.net/manual/ru/curl.configuration.php
> Значение по умолчанию для директивы CURLOPT_CAINFO. Данное значение должно быть указано в виде абсолютного пути
Анон, ну ты бы хоть мануал нагуглил для начала.
>>515817
При вставке данных в URL они кодируются процентным кодированием. Если ты это не знаешь то стоит начать с изучения HTTP (урок по нему я пока не написал, так что гугли) и того, как формируются URL.
Также код у тебя конечно ужасный, без проверки на ошибки. хотя как минимум 2 функции (file_get_contetnts и json_decode) могут их выдать.
Алсо отправка сообщений требует авторизации, почитай документацию по API.
>>515641
Спамерам тут не рады, катись в другой тред. Спамом рекламируют только дрянные продукты и услуги которые никто покупать не станет даже под дулом пистолета.
>>515620
В старом треде ответил.
>>515447
Молодец, все верно
>>514943
Ты не ОП
Ну и я не знаю, планируешь ты работать программистом или иможет у тебя это просто хобби. Но в программисты, если ты будешь учиться по устаревшим учебникам и писать такой код, тебя не возьмут, а если ты пишешь для себя то наверняка ты хочешь писать хороший современный понятный код, а не какой попало. Потому советую выкинуть старый учебник и учиться в нашем треде.
>>516404
Для начала пойдет. Но JS/DOM не такие и сверхсложные вещи, а их знание даст тебе плюсы на собеседовании (если ты хочешь работать программистом) и даст тебе новые возможности по оформлению интерфейса страниц (если ты делаешь проекты для себя).
>>516393
В первую очередь для XML, но умеет читать и генерировать HTML тоже.
> Как через ПХП залезть в HTML DOM,
Создай объект и сделай в нем loadHTML, как в мануале: http://php.net/manual/ru/class.domdocument.php
>>516260
Во-первых, код можно запускать в консоли (на винде в консоли не будет русских букв). ВО-вторых, в некоторых IDE можно запускать код не выходя их них, в встроенной консоли (с русскими буквами в том числе).
Далее, htaccess для задач из учебника не требуется. Но если он и требуется, то на своем локалхосте ты точно можешь его включить.
Как ты пробуешь запускать код?
Как запустить код в консои описано тут в конце: https://gist.github.com/codedokode/7054af4a03865c4cc863
Тебе может быть проще запустить код через браузер под апачом.
>>516241
Так не заливай чужие работы.
>>516237
Без текста ошибок ссылки на статью и тд. мы помочь вряд ли можем. Текст ошибки, если не выовдится, ищи в логе ошибок (он доступен либо по FTP либо в панели управления).
>>516052
да
>>516011
Тупые обезьяны и любители так обзываться идут в другие треды.
>>516009
trim удаляет символы только с краев, а str_replace везде.
>>516008
Тупые обезьяны и любители так обзываться идут в другие треды.
>>516005
Ты вряд ли так научишься, только нахватаешься поверхностных знаний и умения копипастить код.
>>515905
> Как быть? В php классе cURL явно нигде не вызываю, curl.cainfo = 'cacert.pem'; подключил.
А файл cacert.pem в какой папке лежит? Надо наверно полный путь писать. Он еще какой-то CAPath упоминает, может надо его задать?
В мануале написано:
http://php.net/manual/ru/curl.configuration.php
> Значение по умолчанию для директивы CURLOPT_CAINFO. Данное значение должно быть указано в виде абсолютного пути
Анон, ну ты бы хоть мануал нагуглил для начала.
>>515817
При вставке данных в URL они кодируются процентным кодированием. Если ты это не знаешь то стоит начать с изучения HTTP (урок по нему я пока не написал, так что гугли) и того, как формируются URL.
Также код у тебя конечно ужасный, без проверки на ошибки. хотя как минимум 2 функции (file_get_contetnts и json_decode) могут их выдать.
Алсо отправка сообщений требует авторизации, почитай документацию по API.
>>515641
Спамерам тут не рады, катись в другой тред. Спамом рекламируют только дрянные продукты и услуги которые никто покупать не станет даже под дулом пистолета.
>>515620
В старом треде ответил.
>>515447
Молодец, все верно
>>514943
Ты не ОП
В PSR так написано.
Табы отвратительно смотрятся на гитхабе, в консоли, в браузере, большинство людй смешивает их с пробелами и код вообще разваливается.
Алсо чтобы настраивать размер отступа тебе не нужны табы, достаточно дописать несколько строчек в своем виме или емаксе, а не навязывать другим символы-пережитки из 80-х. К счастью разработчики стандарта оформления кода разумные люди и не стали ради пары лентяев, коорым лень настроить редактор, усложнять жизнь нормальным людям.
> С табуляцией - нажал Backspace один раз, и все, а тут надо держать эту клавишу и следить, чтобы выравнивание не поехало.
Возьми нормальный редактор вместо блокнота, дурачок.
> Ненавижу, блядь, таких даунов.
Даун тут ты потому что не можешь настроить свой редактор чтобы он отображал код как тебе нравится. Какие же вы убогие табодауны, который год ноют что им не разрешают настраивать отступы и ни один не может дописать пару строчек в конфиге своего редактора.
Так как ввести данные массивом в модель, чтобы потом их соперировать в контроллере и выложить на вью?
Создай ф-ю в модели, которая будет вытаскивать все необходимые данные из БД в массив. После возвращай массив в контроллер с помощью return
Откуда достать? Из HTML? Я же тебе написал, есть библиотеки вроде phpquery. Я дал название (самое важное), твое дело прочесть документацию и разрбраться как она работает. Я за тебя делать твое домашнее задание не планирую.
>>517692
Таб неотличим от пробела и вызывает путаницу. Таб выглядит криво во многих местах, наша цель чтобы код выглядел так как его пишет автор. Таб пережиток прошлого, который в наше время не нужен.
> В нормальном редакторе надо нажимать Shift-Tab.
Это неправда. Редакторы прекрасно умеют удалять группы пробелов одним нажатием. Мой саблайм например по бекспейсу все прекрасно удаляет.
Только из-за того что ты не можешь установить и настроить нормальный редактор никто стандарты менять не станет.
Я в emacs нажимаю tab один раз и он автоидентит все с учетом текущей расстановки фигурных скобок.
По поводу причин - не всегда индентация равна кратному числу пробелов. Иногда мы переносим строки на новую строку в случае табов возникает трэш. Вот тут мы хотим сдвинуть под открывающуюся скобку, однако имя функции занимает 9 символов, поэтому нужен лишний пробел:
foo_baarr(bla, bla bla
--->--->-bla, bla, bla) {
В случае другой настройки размера таба, все поедет. В случае пробелов, будет отображаться везде одинаково.
Нет не из html. Есть переменная $text, усть регулярка на проверку ошибок. Ошибку в тексте я могу найти с помощью if(preg_match). Вот, а после того как нашел требуется еще вывести на экран кусок текста
> Таб неотличим от пробела и вызывает путаницу
Какая путаница? В начале строки использовать табы, в середине - пробелы.
> Мой саблайм например по бекспейсу все прекрасно удаляет.
Говно же. Переходи на PhpSorm.
Тебе шашечки или ехать? Я просто пишу:
foo_baarr(bla, bla bla
--->bla, bla, bla) {
А художества в стиле ASCII Art в коде не нужны. Таб означает просто отступ внутри блока.
> Иногда нужно и гитхаб заюзать, ideone, или вообще pastebin.
Если иногда - то можно конвертировать и в пробелы.
Попробуй посмотреть уроки по YII . После просмотра пары уроков, все стало понятно с MVC.
А, понял. У preg_match есть третий параметр, массив, в которой она кладет найденный регуляркой и круглыми скобками в ней текст.
Но тебе нужен не preg_macth, который ищет только первое совпадение, а preg_match_all, который ищет все совпадения, он описан ниже в уроке.
Выделить ощибки можно так же с помощью preg-replace.
>>517731
Визуально неотличим
>>517733
А можно с самого начала конвертрровать все в пробелы и не мучаться с выбором.
>>517737
Есть паста:
https://github.com/codedokode/pasta/blob/master/student-list.md#mvc
А как быть если preg_match находит вхождение, но не помещает его в массив . Вот пиример http://ideone.com/H2Qni1 . Или есть какая-то неучтенная мной особенность ф-и, которую я не знаюю
Спасибо за помощь, забыло что-то эрор репортинг прописать
Но к сожалению теперь появилась другая проблема. http://ideone.com/PM7MFc . Условие проходит как истинное, но не выводится ничего, даже слово Yes. А вот если условие будет ложным то, No выводится нормально
Точно же, еще раз спасибо за помощь.
Хотел скачать ее, но в электронных форматах еще не появилась. :(
ОП, посоветуй что почитать, методики, подходы. С документацией я ознакомился, с синтаксисом, но теперь вопрос как все это применить и чтобы это было правильно.
ахуеть какой подробный манул. ну кароч вот тут кантролеры, вот тут мадель, тут вью)) все панятна дети?)) плиз, если тебе нечего ответить на вопрос - не отвечай на него.
А я не пишу, emacs автоматом индентирует под скобку после нажатия Tab и это очень удобно. Я вообще не юзаю оформления, отличного от автоматического (и по этой причине ненавижу питон).
>Если иногда - то можно конвертировать и в пробелы.
Что значит - иногда? У меня все проекты так или иначе лежат в облаке - будь то опенсорсный гитхаб или закрытые гитлаб и битбакет. И это нормально для 21 века. А ты предлагаешь хранить в табах ради... чего? Неумения настроить редактор, чтобы backspace стирал индентационные пробелы (т.е. с начала строки) как табы, по 4 сразу?
все еще недостаточно подробно.
var diff = $(old_array).not(new_array).get();
В итоге получаем массив с элементами old_array, которых нет в new_array.
http://api.jquery.com/not/
https://api.jquery.com/get/
.not() убирает элементы из первого массива, которые есть во втором
.get() без параметра возвращает просто все оставшиеся
Если папку заархивируешь, ее придется на серваке и распаковывать. Доступ к unzip на бесплатных не везде есть.
Хостингов бесплатных тут гора
http://www.free-webhosts.com/power-search.php
>Проще может wget взять?
У меня с ним получилось только превьюшки скачивать, то есть картинки были не в полном размере.
>А так, гугли HTTP-клиенты, например buzz, guzzle и библиотеки разбора HTML вроде phpquery.
Спасибо, начал читать.
Вот только теперь у меня возник вопрос как эти комменты правильно рендерить. Если не трудно, направь меня в правильном направлении, и если можешь посмотри мой бутстрап
https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php
и таблицу с комментами
https://github.com/V3N0m21/Uppu3/blob/master/comments.sql
Я не уверен, там должен быть внутренний foreign key между parent и child?
> Я не уверен, там должен быть внутренний foreign key между parent и child?
Да, это же связь, пусть и с самой собой.
> `path` varchar(60)
Этого хватит ли? Не забудь сделать проверку на допустимую глубину при постинге.
> `comment` varchar(255)
Этот хватит? У varchar кстати ограничение 65535, но размер строки тоже должен быть не большее 65535 байт и реально можно указать около 20 000 символов.
> `fileId` int(11) DEFAULT NULL,
Нужен foreign key
> ADD CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`children`) REFERENCES `comments` (`parent`)
Что в children хранится? Добавь-ка COMMENT к этому полю.
И добавь-ка уникальный индекс по (fileId, path). Во-первых, это логично, во-вторых, это оптимизирует выборку
WHERE fileId = ? ORDER BY path
Вообще, ты должен продумывать возможные ограничения и ставить уникальные и внешние ключи. Этим ты и от ошибок защищаешься, и понять что как связано, легче. База это ядро твоего приложения и надо максимально внимательно относиться к ее проверктированию (кстати в ОП-посте есть неплохие задачки на SQL если ты чувствуешь пробелы в знаниях по этой теме).
> `posted` datetime DEFAULT NULL,
Можно писать DEFAULT CURRENT_TIMESTAMP
Также, у тебя там много DEFAULT NULL. Это все необязательные для заполнения поля? Разберись-ка где NULL а где NOT NULL. Для level например можно выставить NOT NULL DEAFULT 0 или NOT NULL DEFAULT 1 в зависимости от того как помечается верхний уровень.
Смотря какие и для чего. В CMS есть готовый код и админка, а фреймворк дает гибкость и нестандартные возможности. Но блог например логично делать на вордпрессе.
>>517799
По SQL есть задачки в ОП посте и там ссылки на какие-то туториалы.
По PHP есть задачки на студентов и файлообменник в ОП-посте.
Ну и 2 неплохих книги по PHP тоже в ОП-посте, правда они не на полного нуба рассчитаны а на того кто знает синтаксис.
>>517802
какой ты дерзкий
>>517837
Это нестандартное использование jQuery. Вообще jQuery это библиотека для работы с массивом DOM объектов. Если ты читал мануалы по jQuery (я надеюсь что читал) то должен знать что объект jQuery имитирует read-only массив — у него есть свойство length и свойства 0, 1, 2 ...
Так-то в этом массиве должны храниться DOM элементы, но jQuery принимает массив чего угодно и этим пользуются, например так:
$([1, 2, 3]).each(...);
То есть как заменой для underscore/lodash (в которой гораздо больше методов работы с массивами).
Это больше напоминает хак, это не очевидно, и им лучше не злоупотреблять, так как в новых версиях это может и сломаться.
>>517844
По FTP или SFTP. В качестве программы можно взять например WinSCP или (под командуную строку линукса по SFTP) написать bash-скрипт с использованием rsync.
Мне нравится вариант с bash-скриптом так как с ним не надо жать никакие кнопки, но для его написания требуется иметь определенные навыки. Может впрочем можно какую-то GUI программу настроить чтобы синхронизация делалась одной кнопкой.
Не сохраняй пароль от FTP на компьютере, их воруют трояны и заражают потом сайт.
Смотря какие и для чего. В CMS есть готовый код и админка, а фреймворк дает гибкость и нестандартные возможности. Но блог например логично делать на вордпрессе.
>>517799
По SQL есть задачки в ОП посте и там ссылки на какие-то туториалы.
По PHP есть задачки на студентов и файлообменник в ОП-посте.
Ну и 2 неплохих книги по PHP тоже в ОП-посте, правда они не на полного нуба рассчитаны а на того кто знает синтаксис.
>>517802
какой ты дерзкий
>>517837
Это нестандартное использование jQuery. Вообще jQuery это библиотека для работы с массивом DOM объектов. Если ты читал мануалы по jQuery (я надеюсь что читал) то должен знать что объект jQuery имитирует read-only массив — у него есть свойство length и свойства 0, 1, 2 ...
Так-то в этом массиве должны храниться DOM элементы, но jQuery принимает массив чего угодно и этим пользуются, например так:
$([1, 2, 3]).each(...);
То есть как заменой для underscore/lodash (в которой гораздо больше методов работы с массивами).
Это больше напоминает хак, это не очевидно, и им лучше не злоупотреблять, так как в новых версиях это может и сломаться.
>>517844
По FTP или SFTP. В качестве программы можно взять например WinSCP или (под командуную строку линукса по SFTP) написать bash-скрипт с использованием rsync.
Мне нравится вариант с bash-скриптом так как с ним не надо жать никакие кнопки, но для его написания требуется иметь определенные навыки. Может впрочем можно какую-то GUI программу настроить чтобы синхронизация делалась одной кнопкой.
Не сохраняй пароль от FTP на компьютере, их воруют трояны и заражают потом сайт.
> как эти комменты правильно рендерить.
Выбираешь комменты отсортированные по path, они будут идти в нужном порядке. Отступы можно делать одним из 2 способов:
- просто делать отступ слева например $level × 15px
- заморочиться с иерархической структурой, например используя ul/li для списка комментов и вкладывая список дочерних комментов в блок с родительским. Плюс — в такой схеме проще скрывать/раскрыват ветки так как иерархия тегов соответствует иерархии комментов.
Посоны, начинайте писать на Питоне для начала, или на крестах, синтаксис пыха тяжёлой для понимания, stdlib скомкана в одно пространство имён.
Да, ны пыхе можно фрилансить, а на Питоне с фласком - нет.
Но питон ламповый, для души.
> там все просто жуть как мутно, и что удивительно нигде нет четкого объяснения как правильно делать
Ну есть код всегда как последняя мера. Мне тоже иногда приходится в него лезть и смотреть как там что устроено.
> и если можешь посмотри мой бутстрап
Вот этот вот кусок: https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L36
> $config = new Doctrine\ORM\Configuration;
> $config->setProxyDir(sys_get_temp_dir());
Подозрительно напоминает содержимое метода
Doctrine\ORM\Tools\Setup::createConfiguration()
Если так, то нельзя ли копипасту заменить на вызов этого метода? Глянь-ка его, реально ли его использовать?
Более того, выше у тебя уже есть вызов
> $config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/Resource"), $isDevMode);
Это как-то нелогично, 2 раза создавать конфиг. Попробуй разобраться как это отрефакторить.
Найди мне в Брянске хоть одну вакансию где нужен питон. Я только рад буду на него свалить, я на нем диплом писал.
Только вот нет таких вакансий, и я более чем уверен, что и в других регионах таких вакансий нет (или появляются раз в год).
А души не существует. А вот голод вполне реален, я проверял.
Ищи удаленку.
Решаю задачку ОПа, а там нужно узнать сколько чисел в массиве больше определенного числа, а потом эти числа подсчитать.
Я блять перепробовал дохуя разных вариаций, гуглил, даже был близок к решению, но оно оказалось ложным.
Помогите блять, посмотрите на пик и скажите как сравнить числа в массиве $height с числом в переменной $anonHeight и занести результат в $answer и так, чтобы $answer стал массивом с числами которые больше того с каким я сравнивал.
Неужели я такой даун,ч то сам не могу осилить? Даже гугл и мануалы не помогли
вообще нихуя не понятно, что за $count++. Я это еще не учил. Можешь обьяснить, что происходит если предположим это ввести?
>>518001
Попытался так сделать и в результате выдает пустоту.
Как это понять? Если рост одноклассника анона больше роста самого анона, то мы увеличиваем количество одноклассников аноны которые его выше на один?
заовдишь переменную, кладешь в нее ноль, затем каждый раз когда видишь высокого одноклассника увеличиваешь на один.
Там же написано в уроке
$x ++; это то же самое что $x = $x + 1;
$x += $a; то же самое что $x = $x + $a;
Просто более короткий синтаксис для часто встречающихся операций.
Это я знаю, у меня просто хуево с логикой и я хотел сравнить массив с переменной, потом то что подходит под мое условие занести в другой массив, потом подсчитать количество значений в массиве когда можно было просто при нужном ответе увелчивать количество одноклассников на 1 и все.
Смотря чем ты хочешь заниматься. Если тебя устроит клепать интернет-магазины (это очень скучная и однообразная работа) можешь изучать CMS (opencart, magneto). Стоит отметить, не знаю как magneto, но opencart может научить начинающего человека очень хуевым практикам от которых потом будет сложно избавиться. Говеная структура (на словах MVC, а на деле лишь жалкое подобие), повторяющийся код, идиотский метод работы с базой данных, много их.
Если хочешь стать нормальным разработчиком нужно изучать фреймворки (yii, symfony). Даже если на первых парах работы джуном ты не будешь их использовать, знания полученные при изучении дадут очень хорошую базу, которая убережет от написания говнокода. Плюс в тех же CMS после фремворка будет разобраться гораздо легче.
Начинать лучше с yii, потому что понять symfony, если в глаза не видел ни одного фреймворка будет очень сложно.
Ошибки исправлены.
Только с неймспейсами и PSR-4 не разобрался ещё. Можешь привести пример, как правильно раскидать классы по неймспейсам?
Изучить фреймворк пхп и все что он за собой тянет, или изучить питон?
По пхп знаний побольше будет, чем по питону, хотя с синтаксисом обоих знаком. Применяться будет для веба. Очень сильно не бейте.
Не ОП.
Антоша, а как твой сайт открыть?
Склонировал репозиторий, скинул в папку со своими сайтами на локалхосте, он старые видит, а твой нет. В httpd.conf добавил index.php в строку с DirectoryIndex, с правами доступа всё ок, выставил drwxrwxrwx. В первый раз пытаюсь чей-то сайт открыть.
Удалось получить выхлоп. Всё, я просто MySQL не учил ещё, только установил.
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory' in /srv/http/hui/app/classes/Container.php:13 Stack trace: #0 /srv/http/hui/app/classes/Container.php(13): PDO->__construct('mysql:host=loca...', 'root', 'ghbdtndfcz', Array) #1 /srv/http/hui/app/bootstrap.php(19): Container->getPDO('mysql:host=loca...', 'root', 'ghbdtndfcz', Array) #2 /srv/http/hui/index.php(2): require('/srv/http/hui/a...') #3 {main} thrown in /srv/http/hui/app/classes/Container.php on line 13
PHP (вместе с Pascal) — самые низкооплачиваемые языки программирования. Сколько бы книг ты ни прочитал, сколько бы мегабайт кода ни написал, ты никогда не будешь получать больше, чем Java-быдлокодер средней криворукости. «На Яве пишут Корпорации», а на Пыхе…
Порог выхода такой же низкий, как и порог входа: если у программиста на полноценных языках с возрастом есть шанс стать ценным высокооплачиваемым специалистом, то у похапе-олдфага такой возможности нет просто ввиду убогости и примитивности решаемых задач, его спокойно можно выгнать на улицу, взяв взамен школьника, который обучится всем премудростям похапе-быдлокоддинга за пару месяцев, потребляя при этом в три раза меньше доширака.
Возможно, сейчас тебе кажется, что делать сайты — достойное и интересное занятие, но если ты хоть немного программист, через пару лет такой работы ты просто завоешь от того, насколько это унылая и далекая от программирования деятельность.
Большинство проектов кроме того, что по сути своей убоги, представляют из себя чудовищный говнокод на кривых самодельных говнофреймворках и говноCMS (потому как сам язык не только не заставляет писать правильно, но и фактически подталкивает к производству быдловелосипедов). Как следствие такой работы — необратимое поражение мозга и окончательная потеря квалификации. Чему также способствует работа в коллективе невероятно тупых похапешников, постоянные оскорбления и обвинения (просто потому, что умный человек PHP не выберет).
Некоторые начинают работать на PHP с надеждой потом перейти на что-нибудь другое. Но это тоже большая ошибка: во-первых, теряется драгоценное время для старта (наверное, самое важное и ценное в и без того короткой профессиональной жизни программиста), а во-вторых, PHP-опыт никому не нужен и нормальные программисты справедливо смотрят на него как на говно. «PHP» — клеймо быдлокодера на лбу и крест на карьере профессионального программиста, если ты пошёл по этому пути, назад дороги уже не будет. Единственное исключение — устроится похапешником на многопрофильную фирму, где тебя каким-то чудом заметят и предложат перейти на полноценную технологию, но это невероятная удача.
Чуть более, чем вся относительно хорошо оплачиваемая работа для похапешников состоит из поддержки ботнетов, порносайтов, говносайтов с вирусами и прочего подобного дерьма. Подумай, хочешь ли ты потратить свою жизнь на засирание интернетов.
PHP погубил очень много потенциально хороших программистов просто благодаря легкости изучения на начальных этапах. Он затягивает как наркотик, с ним очень легко и приятно начать, вот только когда приходит понимание принципиальных недостатков как самого языка, как и (что гораздо более важно) его убогой ниши — часто оказывается уже слишком поздно что-то менять. Так что учись программировать, думай о будущем и обходи PHP стороной. Потому что с PHP у тебя нет будущего — это путь в никуда.
PHP (вместе с Pascal) — самые низкооплачиваемые языки программирования. Сколько бы книг ты ни прочитал, сколько бы мегабайт кода ни написал, ты никогда не будешь получать больше, чем Java-быдлокодер средней криворукости. «На Яве пишут Корпорации», а на Пыхе…
Порог выхода такой же низкий, как и порог входа: если у программиста на полноценных языках с возрастом есть шанс стать ценным высокооплачиваемым специалистом, то у похапе-олдфага такой возможности нет просто ввиду убогости и примитивности решаемых задач, его спокойно можно выгнать на улицу, взяв взамен школьника, который обучится всем премудростям похапе-быдлокоддинга за пару месяцев, потребляя при этом в три раза меньше доширака.
Возможно, сейчас тебе кажется, что делать сайты — достойное и интересное занятие, но если ты хоть немного программист, через пару лет такой работы ты просто завоешь от того, насколько это унылая и далекая от программирования деятельность.
Большинство проектов кроме того, что по сути своей убоги, представляют из себя чудовищный говнокод на кривых самодельных говнофреймворках и говноCMS (потому как сам язык не только не заставляет писать правильно, но и фактически подталкивает к производству быдловелосипедов). Как следствие такой работы — необратимое поражение мозга и окончательная потеря квалификации. Чему также способствует работа в коллективе невероятно тупых похапешников, постоянные оскорбления и обвинения (просто потому, что умный человек PHP не выберет).
Некоторые начинают работать на PHP с надеждой потом перейти на что-нибудь другое. Но это тоже большая ошибка: во-первых, теряется драгоценное время для старта (наверное, самое важное и ценное в и без того короткой профессиональной жизни программиста), а во-вторых, PHP-опыт никому не нужен и нормальные программисты справедливо смотрят на него как на говно. «PHP» — клеймо быдлокодера на лбу и крест на карьере профессионального программиста, если ты пошёл по этому пути, назад дороги уже не будет. Единственное исключение — устроится похапешником на многопрофильную фирму, где тебя каким-то чудом заметят и предложат перейти на полноценную технологию, но это невероятная удача.
Чуть более, чем вся относительно хорошо оплачиваемая работа для похапешников состоит из поддержки ботнетов, порносайтов, говносайтов с вирусами и прочего подобного дерьма. Подумай, хочешь ли ты потратить свою жизнь на засирание интернетов.
PHP погубил очень много потенциально хороших программистов просто благодаря легкости изучения на начальных этапах. Он затягивает как наркотик, с ним очень легко и приятно начать, вот только когда приходит понимание принципиальных недостатков как самого языка, как и (что гораздо более важно) его убогой ниши — часто оказывается уже слишком поздно что-то менять. Так что учись программировать, думай о будущем и обходи PHP стороной. Потому что с PHP у тебя нет будущего — это путь в никуда.
помогите советом
у меня есть несколько блоков, в которых есть изображения, эти блоки формируются на основе данных из бд.
Так вот, мне хотелось бы иметь возможность посчитать количество изображений в каждом из блоков и в зависимости от этого менять их размер.
$('.изображение').length показывает количество всех изображений, но как найти конкретно в каждом из блоков?
Ну и что посоветуешь? Я сам на второй курс перевёлся, на первом был С++, вроде нормально зашёл, но вакансий я по нему в нашем городе не видел. Летом начал учить PHP, чтобы уже следующим летом мог зарабатывать, рассказал об этом своему дяде-железячнику (C+asm, но зарабатывает благодаря знаниям в електронике), он меня засмеял и сказал "бросай эту хуйню, это не программирование". Вкатываться к дяде и в настолько низкий уровень я не хочу. Куда податься?
Хз бро. По мне так пхп переживает второе рождение. С ООП и фреймоворками. Осенью уже 7 версия должна выйти. Да и посмотри рынок вакансий не только в своем городе. В представлении можно годика 3 в бэкенде поработать. Потом на Java переехать. А там уже ентерпрайз кодить.
>php
>размять мозги
>Да и посмотри рынок вакансий не только в своем городе.
Да, я просто охуеваю, глядя на вакансии. Поэтому и выбрал PHP.
Есть вакансии, на которые я уже по скиллам могу за еду устраиваться, судя по требованиям. А я готов и не против.
Шоб работало, тебе надо создать виртуальный хост "site.local" и в dbconfig.php своего юзера, название БД и пасс поставить. Ну и таблицу abiturients создать не забудь (её дамп есть в репозитории).
Пароль к твоей бд.
Изучить фреймворк пхп и все что он за собой тянет, или изучить питон?
По пхп знаний побольше будет, чем по питону, хотя с синтаксисом обоих знаком. Применяться будет для веба. Очень сильно не бейте.
>Также когда ты хочешь найти знак доллара, придется наставить бекслешей. По правилам регулярок ты должен вписать \$ но с учетом обработки строк PHP придется написать "\\\$" для строки в двойных кавычках и '\\$' для строки в одинарных.
Получается, и двойные, и одинарные кавычки конвертируют "\\" в "\"?
Как-то нелогично сделано. В мануале сказано, что экранирование работает только для двойных кавычек, а на деле выходит не совсем так.
Я имел в виду, что экранировать символы возможно только внутри двойных кавычек. Так сказано в мануале.
А на деле echo '\\s' выводит \s.
Я к тому, что экранирование бекслеша срабатывает и в одинарных кавычках, не только в двойных.
Список всех escape-последовательностей есть в мануале, почитай его: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.single
> Чтобы использовать одинарную кавычку внутри строки, проэкранируйте ее обратной косой чертой (\). Если необходимо написать саму обратную косую черту, продублируйте ее (\\). Все остальные случаи применения обратной косой черты будут интерпретированы как обычные символы: это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как \r или \n, они будут выведены как есть вместо какого-либо особого поведения
В одиночных кавычках escape-последовательностей меньше (всего две), но они есть.
<select>
<option name="doc1" value="fr">Док1</option>
<option name="doc1" value="bs">Док2</option>
<option name="doc1" value="mel">Док3</option>
<option name="doc1" value="gl">Док4</option>
</select>
И если пользователь выберет, например, Док2, то на след. странице было бы написано doc1, bs. Если кто подскажет как такое сделать, было бы здорово.
Спасибо большое заранее.
Посмотри в правильном ли я направлении решаю задачу про котов и мышей.
https://github.com/Integer64/myTestSite.dev/tree/master/CatMouse
Можешь попинать.
Прежде чем писать свой шабонизатор стоит изучить существующие, например шаблоны на чистом PHP и twig. Иначе с большой вероятностью у тебя получится очень низкокачественный результат (откуда я знаю? я видел велосипеды написанные другими людьми).
Для изучения MVC ты можешь попробовать сделать задачу на список студентов из ОП-поста.
ой, не знаю, я наверное сделаю свой динамичный сайт, может еще какой фреймворк освою и перекачусь в шарписты. Требования к вебпрогерам какие-то запредельные, нужно быть человком-оркестром, знать ВСЕ цмс, битриксы, вордпрессы, фронтенд, кучу фреймворков, а еще логиниться во всяких яндексаналитиках. я уж не говорю про опыт работы. не, не мое это по ход.
ну так я с шаблонами-то и делаю. я наверное не то слово употребил
для того, чтобы сделать задачу про студентов, я сначала должен понять, как мвк работает, классы энти.
Если для тебя требования к PHP/веб-разработчику запредельные то какими же тебе покажутся требования к разработичикам других языков? На собеседовании по Java тебя попросят как минимум написать сортировку, а может даже алгоритм балансировки бинарного дерева, и поверь, ты его замучаешься писать.
Сдается мне у тебя пока нет ни опыта работы ни хождения по собеседованиям судя по тому, что ты такой разборчивый.
>>518556
Классы изучаются в моем учебнике, если ты его прошел то должен знать ООП. MVC можно изучать по ходу дела, это всего лишь раделение кода на 3 части и ничего там особого нет.
>сортировку, а может даже алгоритм балансировки бинарного дерева, и поверь, ты его замучаешься писать.
Знаешь, вот это вот все хотя бы входит в область чистого программирования, а ТЗ уровня ОЙ ПОДПРАВЬТЕ ТУТ КОД на какой-то цмски, которую я в глаза не видел, или необходимость качать платный битрикс, а фреймворков-то больше, чем пальцев на моих руках и каждую неделю выходит новый, в шарпе один .NET.
Как раз говорю тебе об опыте вирт. собеседований.
ну вот я и буду разделять на три части и писать контроллеры КАК МНЕ УГОДНО. ОПП знаю на уровне синтаксиса.
Вопросы:
1. Не уебищный ли случаем у меня код? Можно ли его как-то уменьшить и сделать более лаконичным?
2. Где ошибка? Почему вот когда вывожу переменные, то некоторые из них проебываются и каждый раз разные.
Само задание:
На картинке — часть программы, создающая философское настроение. Принцип работы таков: есть 5 наборов слов, из которых случайно выбираются слова, образуя такую структуру:
> слово1 слово2 слово3
> слово1 слово2 слово3
> Я слово4 слово5
Гениально. Я думал я видел всё, код на пастэбине и тому подобное, но код на лоурезных скриншотах еще никто не выкладывал.
Ну блять, иначе код бы не влез, я мог бы скопировать в ворд, но тогда он бы похожу проебал подсветку и прочие плюшки.
Поэтому я уменьшил масштаб, но код между прочим вполне читабельный если приблизить.
Ну да, есть такая фигня, что в вебе нужно быть постоянно в курсе дела, особенно это касается фронтэнда. Во всяких C++ или прочих подобных языках порог вхождения пусть и выше, но зато там по сути выучил что-то и в идеале и все, кодишь на этом до усрачки.
Не перестаю проигрывать, продолжай.
Я выкладывал. Правда они были не лоурезные. И скринил я текст из редактора десктопного.
Сидеть в уютном болоте?
>>518592
В массиве индексы начинаются не с 1 а с нуля. Также, есть функция array_rand выбирвающая случайный индекс, может с ней получится покороче.
>>518596
У скриншотов преимущество что не надо никуда переходить, а у ссылки на ideone что можно копировать код, править и перезапускать.
И списывать со скриншота другим анона сложнее (это плюс).
http://ideone.com/V5qQTE код таким образом стал еще больше, но зато теперь все нормально работает и генерирует слова, правда интересно почему в том случае не работало, вродь все правильно же было.
Спасибо в общем
Что значит всё правильно было? Тебе же сказали: индексы в массивах с нуля начинаются, а значит у тебя в коде могло быть обращение к несуществующему элементу массива.
ну смотри, там было так
$name1 = $word1[mt_rand(1,count($word1))];
Получается, что мы заносили в перменную рандомное слово из массива с индексом рандомного числа от 1 до максимального количества чисел в массиве.
Ведь не обязательно выбрать рандомное число от 0 до максимальных чисел массива, я ведь могу например взять рандомное число от 3 до 6?
Посмотри какое число возвращает функция count с твоим массивом, затем какой последний индекс в этом массиве.
так вот в чем ошибка то была, count указывала индекс 4, когда в массиве было [0, 1, 2, 3]
все равно проблема была не в том, что я 1 вместо нуля,а в том, что count не совсем дает то, что нужно
блин, мне нравится программирование, сидишь тут задачки решаешь, находишь ошибки, чувство прям как будто что-то важное делаю
>все равно проблема была не в том
а нет, ты мне все это время обьяснял, только я только что допер, сорян
ну вот вообще когда код, допустим на работе пишешь во сколько раз он больше этой задачки и сложнее?
И мне.
Оп ты посмотришь чего я наворотил?
Охуеть, как представлю, что мне до 21 года ещё туева хуча времени, так сразу радостно на душе становится. Столько времени для изучения.
ну ну. Жизнь тока начинается. До 30 успеешь. бла бла бла. Начинай ебашить с сегодня, даже лучше сейчас.
Та же хуйня когда читаю про всяких 26+ кунов, но уже хуево конечно, что 21, столько всего упустил, ну и похуй, ничего уже не вернёшь, поэтому остаётся только наверстывать
кун-21
Сходил на собеседование, спрашивали по очереди mysql, ооп, магические методы, git, трейты, новые фичи в пхп, отличие интерфейса от абстрактного класса и прочее в таком духе. Завалился на mysql, спрашивали про разные движки mysql кроме innodb и myisam, транзакции, ну я это и не знал. Еще спросили, что такое динамический вебсайт, а я и не в курсе, думал это сайт с javascriptом.
Кстати практически все изучается в нашем треде.
Если тебе интересны двидки в MySQL: https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html
Из сколько-нибудь полезных там движок MEMORY который хранит данные в памяти (например для временных данных или для тестов).
> Теперь-то понятно что в html вообще не должно быть php-кода, а сама html-страница лишь принимает результат, который вернул php с помощью AJAX (в XML) и js это дело интерпретирует.
Это переусложнение в большинстве случаев. Рендеринг на клиенте нужен только для веб-приложений (и это требует не только переноса шаблонизатора на клиент, но и моделей с логикой), а в большинстве слуаев выгоднее рендерить страницы на сервере.
По ООП есть глава в учебнике из Оп поста, там вроде все просто объясняется.
На джуна, ДС.
>>518783
Спасибо, потренируюсь. Ну я хоть теперь представляю, о чем на собеседованиях вообще спрашивают. Еще спрашивали, как сайт заливать на сервак, я сказал по FTP, но они сказали что устарело давно и теперь там какая то бодяга, которая сама из git все вытаскивает, запускает тесты, проверяет и формирует архив сайта, а он потом на сеть серваков заливается хз чем и разворачивается там. Ну я про это вообще не в курсах был. Еще сказали весь сайт поделен на домены по набору фич/классам, у каждого домена своя команда и репозиторий. И когда они эти домены между собой связать пытаются, вечно глюки возникают, которые год уже пилят толпой.
>Еще спросили, что такое динамический вебсайт, а я и не в курсе, думал это сайт с javascriptом.
ахаха блять.
В первой (users) у меня поля id, name. Во второй (likes) -- лайкер и лйкнутый, оба ссылаются как внешние ключи на users.id. В правильном направлении мыслю?
> Рендеринг на клиенте нужен только для веб-приложений
Я так и хочу. Веб-приложения, Site as Service (или как оно там правильно). Статейники и магазины можно и мышкой с помощью друпала наклацать. Да там и до мобильных приложений, чую, рукой подать.
А какие требования в ней были можешь рассказать? И что сам вообще умеешь, какие задачи из оп-поста решал?
Ну и удачи тебе.
«тот чувак» немного переусложнил код и попытался там чуть ли не Юи написать.
Проще сделать так:
- контроллер = скрипт в корневой папке, например index.php или profile.php
- модель — класс Студент + data mapper для загрухзки/сохранения его в БД + класс для валидации
- вью = шаблоны
> Вот по мануалу могу сделать, а если начинаю свой массив разбивать, то все нахуй, только первая переменная выводится.
Не копируй код. Ты должен написать его сам от начала до конца. Да и там приложение простейшее.
Я подскажу, если ты зайдешь в тупик, но только если ты пишешь код сам. Если ты копируешь код то вопросы надо задавать не мне, а его автору.
Также почитай комментарии к заданию. Там очень много полезного написано.
Если ты хочешь разобраться почему твой код не работает, натыкай там var_dump и посмотри что в разных переменных.
Также, включи отображение ошибок (display_errors = 1) на своем компьютере или смотри лог ошибок — наверняка там есть ошибки которые ты не видишь.
>>518817
Норм
>>518821
> Site as Service (или как оно там правильно).
SaaS значит Software as a Service и ты по моему что-то путаешь.
Клиентские веб-приложения это хорошо но сначала стоит изучить более базовые вещи вроде ООП, MVC, работы с формами и тд если ты их не знаешь.
> Да там и до мобильных приложений, чую, рукой подать.
Их пишут на Java/Obj-C/Swift и там своя атмосфера.
«тот чувак» немного переусложнил код и попытался там чуть ли не Юи написать.
Проще сделать так:
- контроллер = скрипт в корневой папке, например index.php или profile.php
- модель — класс Студент + data mapper для загрухзки/сохранения его в БД + класс для валидации
- вью = шаблоны
> Вот по мануалу могу сделать, а если начинаю свой массив разбивать, то все нахуй, только первая переменная выводится.
Не копируй код. Ты должен написать его сам от начала до конца. Да и там приложение простейшее.
Я подскажу, если ты зайдешь в тупик, но только если ты пишешь код сам. Если ты копируешь код то вопросы надо задавать не мне, а его автору.
Также почитай комментарии к заданию. Там очень много полезного написано.
Если ты хочешь разобраться почему твой код не работает, натыкай там var_dump и посмотри что в разных переменных.
Также, включи отображение ошибок (display_errors = 1) на своем компьютере или смотри лог ошибок — наверняка там есть ошибки которые ты не видишь.
>>518817
Норм
>>518821
> Site as Service (или как оно там правильно).
SaaS значит Software as a Service и ты по моему что-то путаешь.
Клиентские веб-приложения это хорошо но сначала стоит изучить более базовые вещи вроде ООП, MVC, работы с формами и тд если ты их не знаешь.
> Да там и до мобильных приложений, чую, рукой подать.
Их пишут на Java/Obj-C/Swift и там своя атмосфера.
В требованиях были опыт высоконагруженных вебсайтов, memcached (про нее тоже на собеседовании спрашивали подробно), ООП, бэкенд и фронтенд. По фронтенду спрашивали как jquery работает, зачем там селекторы, что делают, что вообще она делает, по ооп много вопросов было, которые в мануале с php.net в разделе ООП все есть, еще интересовались умею ли в elastic search, я про это тоже хз. Сказали, что часто к ним приходит народ с институтов и находит у них в коде паттерны и даже называют их по именам, а их программеры под 40 и не знали, что это паттерны, сами удивляются, а потом уходят, ибо кодить с институтов никто толком не могет.
Как отловить ошибку?
require_once('cat1/lol.class.php');
require_once('cat2\cat3\NextClass.php');
Включить отображение ошибок (если дело на твоем компьютере, display_errors = 1) или смотреть логи ошиьок (если дело на сервере).
Если конечно в коде не стоит error_reporting(0) (игнорировать любые ошибки), тогда надо заменить там 0 на E_ALL.
Судя по твоим ответам, у тебя нет нужного опыта (хотя может им он и не очень требуется). Опыт в хайлоаде подразумевает хорошее знание особенностей mysql, индексы, explain и оптимизацию запросов, кеши/nosql хранилища, понимание сетевых технологий, знакомтсво с nginx, понимание как работает масштабирование, ну и знание самого PHP должно быть на высоком уровне.
Так что если тебя возьмут то сможешь многому научиться.
Изучить фреймворк пхп и все что он за собой тянет, или изучить питон?
По пхп знаний побольше будет, чем по питону, хотя с синтаксисом обоих знаком. Применяться будет для веба. Очень сильно не бейте.
А на Питоне без фреймворков и библиотек (и разумеется SQL/HTML/JS/CSS) что-нибудь пишут? Скрипты для переименования файлов разве что.
Я не вижу в каком месте изучение Питона проще. Более того требования к Питон разработчикам выше, а вакансий меньше (а также за них могут меньше платить потому что они более «интересные», не с каким-нибудь пхп возиться).
Ну да, я в mysql плавал вообще, я дальше joinов и where/having его не проходил же, только по ООП и фронтенду все норм ответил, по сетевым технологиям не спрашивали, сказали у них админы этим занимаются. Еще сказали нужно линукс на уровне пользователя знать, заебало их всех приходящих линуксу обучать.
Паша раньше стал же. И зачем приводить единичные случае, я говорю об обстановке в целом.
Паша не миллиардер. И никогда им не был. Рублёвым разве что только.
C SQL/HTML/JS/CSS в разной степени годдности знаком.
Читал статейку про создание простого приложения на джанге(гостевая), другой уровень разработки, генерация админки. Ну у Laravel примерно такой же уровень, хороший фреймворк, но путаницы больше.
По линуксу конечно хорошо бы сделать «Путь линукса», из задач. Хотя конечно аноны что-то не рвутся проходить путь HTML/CSS, но пусть хотя бы те кто хочет, получить возможность научиться командной строке.
C Yii вообще нечего сравнивать, хотя и про уии говорят что не очень сложен в освоении, по уровню ниже чем ларавел к примеру, намного.
Ну имеется в виду ответ на такой вопрос: допустим у тебя есть посещаемый сервис, нагрузка растет и на единственном сервере загрузка 100% на всех ядрах, приложение начинает медленно работать, а то и падать, что делать, как масштабирвать его на несколько серверов, как этим всем управлять.
Почитать можно например на хайлоаде: http://ruhighload.com/scale
Это скорее обзорные статьи, чтобы знать что вообще бывает. Хорошо бы это дополнить практикой, если у тебя есть желание, мы можем какую-нибудь распределенную борду или анонимный твиттер запилить, с кешами и шардингом. А потом нагрузочными тестами помучать (хотя конечно для этого надо бы несколько серверов иметь). Чтобы делать задание разумеется надо хорошее знание SQL и индексов. Задание долгое, месяца на 2-3 легко может затянуться пока ты со всем будешь разбираться.
>>518862
В Сифмони тоже есть Соната для создания админки, причем нормально, без кодогенерации.
Да тоже склоняюсь к РНР, знаний побольше о нем, питон еще думаю потом успею освоить.
Было бы интересно. Я пока статьи по оптимизации sql запросов осваиваю, какие в прошлом треде были.
Ну да, но опыт эникейства в другой шараге есть.
1. У тебя условие цикла ($i==$halfLength). Это значит, что цикл выполнится только когда $i = полудлинне строки. То есть всего 1 раз.
2. Чтобы выбрать последний символ в строке, в mb_substr() надо передать следующие аргументы: mb_substr($text, -1, 0). Отсчёт с конца начинается с единицы. Ты же, приравнивая $o к $i, передаёшь туда -0, который становится нулём и указывает на первый символ строки. А дальше у тебя будет сравниваться второй с последним, третий с предпоследним и т. д.
3. Также, в теле цикла у тебя неверное условие определения палиндрома. По такой логике получается, что если одна пара букв с противоположными индексами совпадает, то слово -- палиндром.
>надо передать следующие аргументы: mb_substr($text, -1, 0)
Вернее, mb_substr($text, -1, 1).
самопочин
Да я так заебался с этой задачей, блять, это вообще нормально, что я ее так долго решаю?
Вот взгляни, вроде как по идее все правильно сделано. Беру по символу с конца и начала, если они одинаковы, то добавляю к $word1 начальный символ и к word2 - конечный, если нет, то выдать "Не палиндром". И так по кругу. В итоге если $word1==$word2, то выдать результат.
https://ideone.com/oU9vfw
Но мне какого-то хуя выдает всегда "Палиндром". Оказывается потому что если я хочу вывести $comparison1 и $comparison2, то выводит пустоту, поэтому наверное сравнивает пустоту с пустотой, то и выдает.
Но какого хуя то блять пустота, я же сказал выводить по ходу выполнения цикла эти переменные, а он мне ничего не выдает.
Вот пример кода без всяких дальнейших сравнений, просто взять первую и последнюю букву и вывести, но почему не воводит то??
https://ideone.com/Z5E4eX
Потому-что у тебя условие какое-то дурацкое. $i == $halfLength ты понимаешь, что твой код в скобках не будет выполняться, потому-что в условии стоит проверка на равенство между счетчиком и половиной длинны?
А вот так не надо делать. Сейчас он бы ебался с этой задачей весь день, но зато понял бы как её решать. Теперь он просто посмотрит готовое решение.
Оно плохое, можно сделать лучше.
>>519041
на задачку я одним глазом взглянул, но быстренько закрыл.
Не знал конечно, что в цикле for можно указывтаь всего одно действие, а не два, по ссылке из оп поста говорится, что в for должно быть две точки с запятой, не больше, не меньше пик2
>>519037
>Потому-что у тебя условие какое-то дурацкое. $i == $halfLength
пик1
>Вот пример кода без всяких дальнейших сравнений, просто взять первую и последнюю букву и вывести, но почему не воводит то??
Каждая итерация цикла выполняется только после проверки условия на истинность. Если оно не истинно, цикл прерывается. Посмотри теперь на своё условие.
И что пик1? На пике 1 нормальное условие, у тебя нет.
а действительно, на пике укзаано <=
но почему по логике же, если $i не равно $halfLength, то увеличиваем на 1, а $halfLength у нас равно 9, то есть цикл должен выполниться 9 раз
Увеличение счётчика на 1 происходит после выполнения тела цикла. Выполнение тела цикла происходит после проверки условия, в случае, если оно истинно. Твоё условие: $i == $halfLength. $i в начале равно 0. То есть, $i != $halfLength, и цикл сразу прервётся.
Первые два пика -- мои таблицы.
Когда считаю, сколько лайков пользователь поставил/получил, проблем не возникает (3-й пик с запросом).
Когда пытаюсь прицепить подсчёт взимных лайков (4-й пик), результаты подсчёта с 3-го пика портятся. Число взаимных лайков, при этом, считается верно.
Что делаю не так? Что стоит изучить из SQL конкретно для этой задачи?
Сразу же совет: структуру таблиц надо постить не скриншотом пхпмайадмина а SQL кодом. Потому что я например не понимаю разрешен ли NULL, какие значения по умолчанию, как именно выглядят индексы и тд (и ты скорее всего тоже). А SQL код это универальная вещь кторую все понимают (ну ии должны понимать) и которая документирована.
Удобно постить код на sqlfiddle где его сразу можно посмотреть и запустить.
Далее, у тебя странный код. Объясни-ка как работает
COUNT(CASE WHEN .. THEN .. END)
Ибо это можно написать короче.
2 джойна лучше чем джойн с OR так как они могут использовать индексы (хтя ты их наверно пока не изучал) и работают быстрее.
Ошибка и в 3-м и в 4-м скриншоте в том что ты используешь не тот тип джойна. Также в 4-м скриншоте по моему неправильные условия джойнов. Ты можешь объяснить как они должны работать и что ты должен получить по задумке (что приджойнится к одной строчке с каким-то пользователем)?
> Что стоит изучить из SQL конкретно для этой задачи?
Типы джойнов и особенности COUNT: http://www.mysql.ru/docs/man/Group_by_functions.html
SQL код таблицы можно увидеть сдеаав SHOW CREATE TABLE x (а лучше конечно создавать таблицы написав его вручную).
Никак не могу решить задачу с процентами, посмотрел ответ и все равно не понял, бросать нахуй PHP?
>Далее, у тебя странный код. Объясни-ка как работает
Я толком не уверен как что работает. Только догадываюсь.
Ладно, покурю теорию по ссылке, что-нибудь рожу и снова дам тебе на растерзание.
А в пехапе есть анонимные функции. И если бы вы знали более одного языка, то обрадовались. Но куда там. Сидите, ковыряетесь в хуйне какой-то три года. ОП, ну чому ты такой дегенерат, который не удосужился за три года сбацать свой законченный инфопродукт экспериментируя над нуфагами ИТТ от А до Я. М?
Перестаньте уже читать биографию Масков/Цукербергов/Джобсов(вот этот вообще ТП с хуем, умер, а эппл живет дальше, ибо пиздобольствовать умеют многие и на этом поприще всегда найдется подмена), это результат типичной предпринимательской деятельности(хотя Рыжий хуй и Джобс - это просто удача, парни изобрели штуку, а нам быдлу она внезапно понравилась) + внезапный спрос на это дерьмо, который нельзя было спрогнозировать(вообще никак), тобишь по сути это новый рынок, на котором у вас все шансы стать монополистом, ведь вы и есть этот рынок. Году в 2010 хабрапомойка была переполнена статьями в духе - "Зацените мой никому не нужный сервис по поиску друга для вашей мамки", миллионы их было, такое называют "Пузырь".
Пфф, вот эти железячники же все как правило сидят на одном месте, в какой-нибудь конторке. Небось какой-нибудь АСУ'шник или около этого. И, нет, ебать байтики - не более интеллектуальная деятельность, чем веб-погроммирование.
Но он по ходу устарел.
Вот тут проблема: http://phpclub.ru/mysql/doc/loading-tables.html
Создаю файлик со значения полей, чтобы не вбивать ручками(у меня в качестве разделителя ";"). Чтобы подставить NULL в поле death, пишу \n в нужных местах. Получается такой файл.
Fluffy;Harold;cat;f;1993-02-04;\N
Claws;Gwen;cat;m;1994-03-17;\N
Buffy;Harold;dog;f;1989-05-13;N
Fang;Benny;dog;m;1990-08-27;\N
Bowser;Diane;dog;m;1998-08-31;1995-07-29
Chirpy;Gwen;bird;f;1998-09-11;\N
Whistler;Gwen;bird;\N;1997-12-09;\N
Slim;Benny;snake;m;1996-04-29;\N
У автора все получилось, и заместо \N вставилось NULL, у меня и других парней с форума, на котором я искал решение другой проблемы с этим примером тоже самое(последний пост, там в конце почемуто NULL присутствует): http://sqlinfo.ru/forum/viewtopic.php?id=4087
То есть вместо NULL значение становится 0000-00-00, через select NULL вставляется. Я хз, что тут делать. Нет я могу забить все руками и пойти по мануалу дальше(так и сделаю пока), но хочу разобраться.
> странный код
Нормальный это код. Count подсчитывает кол-во неNULLевых результатов внутреннего выражения.
Убери GROUP BY, посмотри на результат, подумай.
Только что сделал, мозг кипит, глаза болят. Но все-таки удалось ее решить самому, прям горжусь за себя.
Рейтани мое решение http://ideone.com/zQGppR
А что мне с ним делать потом с этим отзывом? Это если бы я с нуля его делал тогда может быть, а так это же цмс с натянутой темой.
Надпись MH SQUARED LITE BY MH THEMES убери и можешь смело 1к брать.
function fn_ct_getLists(){
$tmp = new Fc(Registry::get('zzzzzzz));
$retval= $tmp->request('lists', [
\t'fields' => 'lists.name'
\t]);
var_dump($retval->take(1));
\treturn $retval['lists.name'];
}
И мне приходить ответ
object(Illuminate\Support\Collection)#76 (1) { ["items":protected]=> array(1) { [0]=> object(stdClass)#71 (1) { ["name"]=> string(10) "ApiCreated" } } }
А хочу я собственно, прлучать название листа через $retval->function(name);
или что-то вроде того. Листов у меня много.
> Сегодня на продакшене было обнаружено гениальное выражение в одном из запросов.
> (ss_1<>'SS0001' or ss_1<>'SS0002' or ss_1<>'SS0010')
Так как посетители того сайта примерно та же аудитория что и посетители двачей (то есть школьники и аутисты), разумеется, в комментариях написан либо бред не по теме, либо заведомо неверные утвеждения:
> inkanus-gray 01.07.2015 12:15 # +4
> А ничего страшного, что результат всегда TRUE?
Комментатор наверно хотел показать какой он умный, но он сам сел в лужу, потому что он не прав. Это выражение не всегда равно TRUE (точнее 1 так как в MySQL нет TRUE/FALSE, а используется 1/0).
Но аудитория нашего треда конечно же гораздо умнее и легко решит задание:
- определите в каких слуаях результат выражения не равен 1 и чему он равен в этих случаях
- упростите это выражение, записав его в более понятном и коротком виде
То есть если вы верите комментатору и счиатете что условие всегда истинно, разумеется его можно заменить на цифру 1 (но это не так).
Считайте это проверкой вашей эрудиции и знания SQL. Если вы честно ломали голову и так и не нашли ответ, напишите ход своих мыслей и я дам подсказку.
> Только с неймспейсами и PSR-4 не разобрался ещё. Можешь привести пример, как правильно раскидать классы по неймспейсам?
PSR-4 задает соответствие между полным именем класса и путем к файлу, то есть как должен называться файл с тем или иным классом.
В твоем случае логично разбить классы на неймспейсы:
Controller\... (контроллеры)
Model\... (модель абитуриента)
Service\... (сюда кидаем мапперы, сервисы, валидаторы, контейнер, при желании можно раскидать их по вложенным неймспейсам, но их немного так что не стоит заморачиваться)
Util\ (сюда кидаем хелперы, пагинатор)
Также в PSR-4 рекоментуется в качестве корневого неймспейса делать имя приложения. Ну например ты бы мог сделать корневым неймспейсом AbiturientList или AL. Но это не обязательно.
В соотвествии с PSR-4 классы в разных неймспейсах будут также лежать в разных папках, например:
Controller\Front -> app/Controller/Front.php
или
AL\Controller\Front -> app/Controller/Front.php
(папку classes можно выпилить за ненадобностью).
После этого надо будет чуть подправить автозагрузчик. Вот образцы:
https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-4-autoloader-examples.md
Когда ты в следующем задании изучишь composer, ты узнаеь что в него встроен автозагрузчик PSR-4 и свой тебе больше писать не требуется, достаточно лишь в конфиге композера указать корневой неймспейс и папку с классами.
> Только с неймспейсами и PSR-4 не разобрался ещё. Можешь привести пример, как правильно раскидать классы по неймспейсам?
PSR-4 задает соответствие между полным именем класса и путем к файлу, то есть как должен называться файл с тем или иным классом.
В твоем случае логично разбить классы на неймспейсы:
Controller\... (контроллеры)
Model\... (модель абитуриента)
Service\... (сюда кидаем мапперы, сервисы, валидаторы, контейнер, при желании можно раскидать их по вложенным неймспейсам, но их немного так что не стоит заморачиваться)
Util\ (сюда кидаем хелперы, пагинатор)
Также в PSR-4 рекоментуется в качестве корневого неймспейса делать имя приложения. Ну например ты бы мог сделать корневым неймспейсом AbiturientList или AL. Но это не обязательно.
В соотвествии с PSR-4 классы в разных неймспейсах будут также лежать в разных папках, например:
Controller\Front -> app/Controller/Front.php
или
AL\Controller\Front -> app/Controller/Front.php
(папку classes можно выпилить за ненадобностью).
После этого надо будет чуть подправить автозагрузчик. Вот образцы:
https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-4-autoloader-examples.md
Когда ты в следующем задании изучишь composer, ты узнаеь что в него встроен автозагрузчик PSR-4 и свой тебе больше писать не требуется, достаточно лишь в конфиге композера указать корневой неймспейс и папку с классами.
Интересно, мой редактор пишет что тут 13000 символов, но двач не дает их отправить одним постом. Эта зараза считает байты почему-то.
> https://github.com/blackberryJam/abiturients/blob/master/app/bootstrap.php#L10
> require __DIR__ . '/exceptionHandler.php';
> set_exception_handler('exceptionHandler');
Зачем это? PHP и так сам логгирует информацию об исключениях и (если включен display_errors) выводит ее на экран. Свой обработчик тебе нужен только если ты хочешь при исключении например выводить страницу-заглушку с кодом 503.
Причем PHP логгирует подробную информацию, с именем файла и стектрейсом а ты только огрызок:
> error_log($exception->getMessage());
То есть ты зачем-то сделал фиксацию информации об исключениях менее подробной.
Если ты не видишь информации об исключениях на экране то надо просто включить display_errors (на локалхосте) или смотреть логи (на хостинге) а не изобретать странные вещи.
Надо либо удалить этот код либо сделать чтобы в нем был смысл и он давал какие-то дополнительные преимущества.
> error_reporting(-1);
> mb_internal_encoding('utf-8');
Это надо перенести в bootstrap
> define("SITE_ROOT", "/var/www/site.local");
Это неправильно, так как у меня например путь будет другой. И что мне делать, править код? Нет, так не пойдет. Надо определять путь автоматически например через dirname(_ _ DIR _ _ )
> define("ROOT_URI", $_SERVER['HTTP_HOST']);
Это тоже неправильно. Зачем тебе имя хоста в URL? Это надо вынести в конфиг, чтобы если сайт установлен в папке типа /al можно было заменить в конфиге
$rootUri = '/';
на
$rootUri = '/al/';
И все работало. Тебе не нужно имя хоста, ссылка вида
<a href="/asdasd/asdad">
И так использует текущее имя хоста.
Также, мне не нраится использование тут константы. Что это за константа которая может меняться? Замени-ка это на функцию getRootUri().
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Abiturient.php#L23
> foreach ($this as $property => $value) {
То, что PHP такое позволяет это не значит что можно этим пользоваться. Объект это не массив, чтобы его перебирать. Сделай вместо этого цикл по массиву разрешенных свойств.
> if (isset($values[$property])
Если значение в массиве === null то isset вернет false. Надо использовать array_key_exists в таких случаях.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientService.php#L34
> for ($i = 0; $i < 5; $i++) {
> elseif ($i == 4) {
У тебя идет дублирование числа попыток, а дублирование параметров это плохо. Код лучше переписать так:
for (...) {
если сгенерировался хороший код, выходми из функции;
}
выбрасваем исключение;
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L103
> public function getAbiturients($parameters, $page, $perPage)
Я не понимаю, какая выгода от замены простого и понятного кода:
getAbiturients($orderBy, $orderDir, $page, $perPage)
на код где у нас передается массив неизвестной структуры. Зачем тут массив? Он только ухудшает понимание кода.
> $offset = ($page - 1) $perPage;
Лучше сразу передавать offset и limit. А высчитывать offset можно в контроллере или пагинаторе.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L116
> protected function inspectParameters($parameters)
Тут слишком сложный код. На мой взгляд проще сделать массив разрешенных значений и проверять по нему чем городить свич на 30 строк.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L169
> $words = preg_split('/\\s/ui', $string);
Что если строка $string содержит пробелы с краев? В $words тогда будет что-то вроде
['', 'text', '']
И ты будешь искать по пустой строке. Это плохая идея, надо игнорировать пустые строки.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L184
> foreach ($tokens as $key => $token) {
> ...
> $searchResult[] = $this->getByToken($token);
Это очень плохо и неэффективно, делать запросы в цикле. Вместо этого ты должен делать запрос с использованием IN, например
SELECT .. WHERE id IN (1, 2, 3, 6) ORDER BY ...
Значения для IN не получится вставить через плейсхолдеры (это ограничение PDO), так что придется формировать строку с id вручную. Да, вместо token удобнее использовать id так как это числа и они короче.
Также, если поиск хотя бы по одному слову не дал результатов, можно прекращать его досрочно.
Также, я тут подумал, не проще ли генерировать условие вида:
SELECT ...
WHERE (field1 LIKE '%word1%' OR field2 LIKE '%word1%' ... ) AND (.... LIKE '%word2%') AND (.... LIKE '%word3%') ?
ORDER BY ... LIMIT ...
И пусть база объединяет результаты.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L26
> public function save(Abiturient $abiturient)
> {
> if ($this->isTokenReserved($abiturient->token)) {
Вместо того чтобы делать SQL запрос можно просто проверить проставлен ли id в абитуриенте.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L54
> if ($this->isTokenReserved($token)) {
> $stmt = $this->pdo->prepare("SELECT FROM abiturients WHERE token =
:token");
Незачем тут делать 2 SQL запроса когда можно сразу делать SELECT а уже потом проверять вернул он что-нибудь или нет.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L97
> public function getNumberOfPages($perPage)
> $offset = ($page - 1) × $perPage;
Ты размазываешь пагинацию по всему коду: в контроллер чуть-чуть заснунул, в маппер. Так не пойдет, унеси все это в пагинатор или контроллер. Маппер вернет число записей, а пагинатор или контроллер может преобразовать его в число страниц.
> " LIMIT " . $perPage . " OFFSET " . $offset;
Числа прекрасно передаются через плейсхолдеры, не надо их вставлять напрямую.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L108
Тут слишком длинный SQL запрос, разбей его на несклоько строк чтобы он помещался в 80 символов по ширине.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Container.php#L10
> public function getPDO($dsn, $username, $password, $options)
Это неправильно, полуается чтобы получить где-то в коде PDO мы должны знать параметры соединения? а зачем они нужны если объект pdo уже есть в контейнере?
Надо сделать чтобы контейнер либо содержал в себе эти параметры (их можно передать через конструктор или метод типа setParameters и бросать исключение если их нету), либо чтобы контейнеру передавалось в конструкторе имя конфига, а он сам загружал этот конфиг в методе getPdo.
Кстати, если тебе интересно, можешь почитать как сделан DI Container в симфони (он может использоваться и без симфони как отдельный компонент):
(англ) http://symfony.com/doc/current/components/dependency_injection/introduction.html
(рус) http://symfony-gu.ru/documentation/ru/html/book/service_container.html
Как ты видишь, там сервисы можно опиывать в yml-конфиге примерно так:
abiturient_service:
class: AbiturientService
arguments: [@abiturient_mapper, @abiturient_validator]
И исплоьзовать так:
$service = $container->get('abiturient_service');
Да, эти 4 строчки кода это все, что требуется чтобы добавить в симфониевский контейнер одну службу. Это быстрее чем писать свой контейнер.
Также, симфониемвский контейнер умеет читать, хранить и выдавать данные из конфигов. Вот как выглядит описание сервиса PDO которому передаются параметры из конфига:
pdo:
class: PDO
arguments: [%db.dsn%, %db.user%, %db.pass%, %db.options%]
Я не знаю, видишь ли ты это или нет, но при правильном DI твои классы не привязаны к конкретной реализации контейнера. То есть если твой AbiturientMapper и AbiturientService написаны правильно то ты можешь использовать их с любым другим контейнером, не меняя эти классы (в твоем случае это так, потому что ты следуешь принципам DI, и это хорошо).
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L15
> } catch (Exception $e) {
> $errors['tokenGenerateError'] = $e->getMessage() . " Обновите страницу.";
Тут ты ловишь вообще любые исключения. Это неправильно, так как они могут возникнуть не только из-за того что не удалось сгенерировать токен (а например PDO может выкинуть исключение). Да и обновлять страницу нет смысла, там вероятность что с 5 попыток токен не сгенерируется, ничтожна и если это произошло то скорее всего ошибка в коде и ничего не поможет.
Если ты хочешь ловить исключение, сделай свой класс исключений для этой цели. Но лучше вообще тут убрать try/catch.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L22
> if ($token) {
> $abiturient = $mapper->getByToken($token);
А что если по каким-то причинам (ошибка в куке, удален из базы) такой абитуриент не найден?
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L36
> header("Location: {$_SERVER['HTTP_REFERER']}");
Согласно стандарту браузеры не обязаны передавать реферер. Более того, его может не быть если мы перешли из закладок или ввели адрес руками. Его может вырезать прокси или антивирус.
Короче вот этот код:
> header("Location: {$_SERVER['HTTP_REFERER']}");
100% неправильный. Указывай явный адрес для редиректа.
Интересно, мой редактор пишет что тут 13000 символов, но двач не дает их отправить одним постом. Эта зараза считает байты почему-то.
> https://github.com/blackberryJam/abiturients/blob/master/app/bootstrap.php#L10
> require __DIR__ . '/exceptionHandler.php';
> set_exception_handler('exceptionHandler');
Зачем это? PHP и так сам логгирует информацию об исключениях и (если включен display_errors) выводит ее на экран. Свой обработчик тебе нужен только если ты хочешь при исключении например выводить страницу-заглушку с кодом 503.
Причем PHP логгирует подробную информацию, с именем файла и стектрейсом а ты только огрызок:
> error_log($exception->getMessage());
То есть ты зачем-то сделал фиксацию информации об исключениях менее подробной.
Если ты не видишь информации об исключениях на экране то надо просто включить display_errors (на локалхосте) или смотреть логи (на хостинге) а не изобретать странные вещи.
Надо либо удалить этот код либо сделать чтобы в нем был смысл и он давал какие-то дополнительные преимущества.
> error_reporting(-1);
> mb_internal_encoding('utf-8');
Это надо перенести в bootstrap
> define("SITE_ROOT", "/var/www/site.local");
Это неправильно, так как у меня например путь будет другой. И что мне делать, править код? Нет, так не пойдет. Надо определять путь автоматически например через dirname(_ _ DIR _ _ )
> define("ROOT_URI", $_SERVER['HTTP_HOST']);
Это тоже неправильно. Зачем тебе имя хоста в URL? Это надо вынести в конфиг, чтобы если сайт установлен в папке типа /al можно было заменить в конфиге
$rootUri = '/';
на
$rootUri = '/al/';
И все работало. Тебе не нужно имя хоста, ссылка вида
<a href="/asdasd/asdad">
И так использует текущее имя хоста.
Также, мне не нраится использование тут константы. Что это за константа которая может меняться? Замени-ка это на функцию getRootUri().
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Abiturient.php#L23
> foreach ($this as $property => $value) {
То, что PHP такое позволяет это не значит что можно этим пользоваться. Объект это не массив, чтобы его перебирать. Сделай вместо этого цикл по массиву разрешенных свойств.
> if (isset($values[$property])
Если значение в массиве === null то isset вернет false. Надо использовать array_key_exists в таких случаях.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientService.php#L34
> for ($i = 0; $i < 5; $i++) {
> elseif ($i == 4) {
У тебя идет дублирование числа попыток, а дублирование параметров это плохо. Код лучше переписать так:
for (...) {
если сгенерировался хороший код, выходми из функции;
}
выбрасваем исключение;
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L103
> public function getAbiturients($parameters, $page, $perPage)
Я не понимаю, какая выгода от замены простого и понятного кода:
getAbiturients($orderBy, $orderDir, $page, $perPage)
на код где у нас передается массив неизвестной структуры. Зачем тут массив? Он только ухудшает понимание кода.
> $offset = ($page - 1) $perPage;
Лучше сразу передавать offset и limit. А высчитывать offset можно в контроллере или пагинаторе.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L116
> protected function inspectParameters($parameters)
Тут слишком сложный код. На мой взгляд проще сделать массив разрешенных значений и проверять по нему чем городить свич на 30 строк.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L169
> $words = preg_split('/\\s/ui', $string);
Что если строка $string содержит пробелы с краев? В $words тогда будет что-то вроде
['', 'text', '']
И ты будешь искать по пустой строке. Это плохая идея, надо игнорировать пустые строки.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L184
> foreach ($tokens as $key => $token) {
> ...
> $searchResult[] = $this->getByToken($token);
Это очень плохо и неэффективно, делать запросы в цикле. Вместо этого ты должен делать запрос с использованием IN, например
SELECT .. WHERE id IN (1, 2, 3, 6) ORDER BY ...
Значения для IN не получится вставить через плейсхолдеры (это ограничение PDO), так что придется формировать строку с id вручную. Да, вместо token удобнее использовать id так как это числа и они короче.
Также, если поиск хотя бы по одному слову не дал результатов, можно прекращать его досрочно.
Также, я тут подумал, не проще ли генерировать условие вида:
SELECT ...
WHERE (field1 LIKE '%word1%' OR field2 LIKE '%word1%' ... ) AND (.... LIKE '%word2%') AND (.... LIKE '%word3%') ?
ORDER BY ... LIMIT ...
И пусть база объединяет результаты.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L26
> public function save(Abiturient $abiturient)
> {
> if ($this->isTokenReserved($abiturient->token)) {
Вместо того чтобы делать SQL запрос можно просто проверить проставлен ли id в абитуриенте.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L54
> if ($this->isTokenReserved($token)) {
> $stmt = $this->pdo->prepare("SELECT FROM abiturients WHERE token =
:token");
Незачем тут делать 2 SQL запроса когда можно сразу делать SELECT а уже потом проверять вернул он что-нибудь или нет.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L97
> public function getNumberOfPages($perPage)
> $offset = ($page - 1) × $perPage;
Ты размазываешь пагинацию по всему коду: в контроллер чуть-чуть заснунул, в маппер. Так не пойдет, унеси все это в пагинатор или контроллер. Маппер вернет число записей, а пагинатор или контроллер может преобразовать его в число страниц.
> " LIMIT " . $perPage . " OFFSET " . $offset;
Числа прекрасно передаются через плейсхолдеры, не надо их вставлять напрямую.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L108
Тут слишком длинный SQL запрос, разбей его на несклоько строк чтобы он помещался в 80 символов по ширине.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Container.php#L10
> public function getPDO($dsn, $username, $password, $options)
Это неправильно, полуается чтобы получить где-то в коде PDO мы должны знать параметры соединения? а зачем они нужны если объект pdo уже есть в контейнере?
Надо сделать чтобы контейнер либо содержал в себе эти параметры (их можно передать через конструктор или метод типа setParameters и бросать исключение если их нету), либо чтобы контейнеру передавалось в конструкторе имя конфига, а он сам загружал этот конфиг в методе getPdo.
Кстати, если тебе интересно, можешь почитать как сделан DI Container в симфони (он может использоваться и без симфони как отдельный компонент):
(англ) http://symfony.com/doc/current/components/dependency_injection/introduction.html
(рус) http://symfony-gu.ru/documentation/ru/html/book/service_container.html
Как ты видишь, там сервисы можно опиывать в yml-конфиге примерно так:
abiturient_service:
class: AbiturientService
arguments: [@abiturient_mapper, @abiturient_validator]
И исплоьзовать так:
$service = $container->get('abiturient_service');
Да, эти 4 строчки кода это все, что требуется чтобы добавить в симфониевский контейнер одну службу. Это быстрее чем писать свой контейнер.
Также, симфониемвский контейнер умеет читать, хранить и выдавать данные из конфигов. Вот как выглядит описание сервиса PDO которому передаются параметры из конфига:
pdo:
class: PDO
arguments: [%db.dsn%, %db.user%, %db.pass%, %db.options%]
Я не знаю, видишь ли ты это или нет, но при правильном DI твои классы не привязаны к конкретной реализации контейнера. То есть если твой AbiturientMapper и AbiturientService написаны правильно то ты можешь использовать их с любым другим контейнером, не меняя эти классы (в твоем случае это так, потому что ты следуешь принципам DI, и это хорошо).
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L15
> } catch (Exception $e) {
> $errors['tokenGenerateError'] = $e->getMessage() . " Обновите страницу.";
Тут ты ловишь вообще любые исключения. Это неправильно, так как они могут возникнуть не только из-за того что не удалось сгенерировать токен (а например PDO может выкинуть исключение). Да и обновлять страницу нет смысла, там вероятность что с 5 попыток токен не сгенерируется, ничтожна и если это произошло то скорее всего ошибка в коде и ничего не поможет.
Если ты хочешь ловить исключение, сделай свой класс исключений для этой цели. Но лучше вообще тут убрать try/catch.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L22
> if ($token) {
> $abiturient = $mapper->getByToken($token);
А что если по каким-то причинам (ошибка в куке, удален из базы) такой абитуриент не найден?
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L36
> header("Location: {$_SERVER['HTTP_REFERER']}");
Согласно стандарту браузеры не обязаны передавать реферер. Более того, его может не быть если мы перешли из закладок или ввели адрес руками. Его может вырезать прокси или антивирус.
Короче вот этот код:
> header("Location: {$_SERVER['HTTP_REFERER']}");
100% неправильный. Указывай явный адрес для редиректа.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L44
> protected function isPost()
> protected function isCookieSet($cookieKey)
Это по логике должно быть в базовом контроллере так как это нужно всем, а не только UserpageController. В фреймворках обычно делают объект Request хранящий куки, параметры запроса и соответственно эти методы делают в нем:
http://symfony-gu.ru/documentation/ru/html/book/http_fundamentals.html
http://symfony.com/doc/current/book/http_fundamentals.html
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/MainPageController.php#L48
> $queryTemplate = Util::buildQueryTemplate('page');
зачем строить URL из текущего запроса? Это не очень надежно и трудно для чтения. Лучше явно сформировать и передать массив параметров. Ты ведь знаешь какая сортировка, какое поисковое слово и тд. Сделай массив параметров и передавай его в шаблон. А потом этот массив можно передавать во всякие функции, которые удаляют из него или заменяют некоторые параметры и формируют ссылку.
Наример функция генерирующая ссылку на сортировку, удаляет номер страницы и заменяет параметры отвечающие за сортировку.
С массивом работать просто и логично. А ты переусложняешь систему: возьмем текущий URL, распарсим его, понадеемся что все правильно, и тд.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Validator.php#L49
> $regexp = '/^19[0-9]{2}$/';
Почему год рождения не может начинаться с 20? Не забудь обновить регулярку в шаблоне.
> https://github.com/blackberryJam/abiturients/blob/master/templates/404.html.php#L11
> <a href="http://site.local" class="btn btn-primary btn-lg"><span class="glyphicon glyphicon-home"></span> На главную </a>
Тут имя сайта захардкожено, а не берется из конфига. Это плохо, так как у любого сайта обычно есть несклоько серверов:
- продакшен (который видят пользователи)
- тестовый сервер (на который можно выгрузить код и показать кому-то)
- сервер на локалхосте у разработчиков
У этих серверов разные адреса, потому имя хоста надо хранить в конфиге (или брать HTTP_HOST) а не прописывать жестко, так как это доставит потом множество неудобств.
Также, у тебя там жестко прописан домен в установке кук. Из-за этого у меня на другом домене они не ставятся и не работает ни регистрация ни flash сообщения.
------
При поиске надо выводить в поле поиска текущий поисковый запрос. Также, стоит писать
«Показаны только результаты поиска по словам xxxx. Показать всех абитуриентов».
> https://github.com/blackberryJam/abiturients/blob/master/templates/form.html.php#L20
> required pattern="[-`а-яА-ЯёЁ\\s]{2,40}" autofocus>
Тут ошибочка, в HTML не надо удваивать бекслеш и надо просто писать \s. А то, что у тебя интепретируется как «бекслеш или буква s». Удваиваем мы в PHP-строках так как они воспринимают 2 бекслеша как один (мануал: http://php.net/manual/ru/language.types.string.php )
Кстати, я тут почитал MDN, оказывается ^ и $ в pattern можно не писать, браузер это как-то сам проверяет.
Также я прочел еще одну интересную фишку. Если ты укажешь для input атрибут title, например «Имя может содержать ....» то браузер включит его в сообщение об ошибке заполнения (а также покажет при наведении на инпут). Давай-ка, чтобы ты это запомнил, напиши title хотя бы для нескольких инпутов, а то иногда непонятно что именно я заполнил не так.
Также, слишком длинные строчки в HTML, которые не влезают в ширину гитхаба, надо бы перенести.
Для года наверно стоит использовать input type="number" и указать для него min/max (max стоит указать лет на 100 в будущее чтобы оно было актуально). На мобильных устройствах это приведет к тому, что клавиатура будет содержать только цифры, и у input появятся стрелочки увеличения/уменьшения. Увы, специально для года поля ввода нет (а вот для года + месяца например есть).
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L44
> protected function isPost()
> protected function isCookieSet($cookieKey)
Это по логике должно быть в базовом контроллере так как это нужно всем, а не только UserpageController. В фреймворках обычно делают объект Request хранящий куки, параметры запроса и соответственно эти методы делают в нем:
http://symfony-gu.ru/documentation/ru/html/book/http_fundamentals.html
http://symfony.com/doc/current/book/http_fundamentals.html
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/MainPageController.php#L48
> $queryTemplate = Util::buildQueryTemplate('page');
зачем строить URL из текущего запроса? Это не очень надежно и трудно для чтения. Лучше явно сформировать и передать массив параметров. Ты ведь знаешь какая сортировка, какое поисковое слово и тд. Сделай массив параметров и передавай его в шаблон. А потом этот массив можно передавать во всякие функции, которые удаляют из него или заменяют некоторые параметры и формируют ссылку.
Наример функция генерирующая ссылку на сортировку, удаляет номер страницы и заменяет параметры отвечающие за сортировку.
С массивом работать просто и логично. А ты переусложняешь систему: возьмем текущий URL, распарсим его, понадеемся что все правильно, и тд.
> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Validator.php#L49
> $regexp = '/^19[0-9]{2}$/';
Почему год рождения не может начинаться с 20? Не забудь обновить регулярку в шаблоне.
> https://github.com/blackberryJam/abiturients/blob/master/templates/404.html.php#L11
> <a href="http://site.local" class="btn btn-primary btn-lg"><span class="glyphicon glyphicon-home"></span> На главную </a>
Тут имя сайта захардкожено, а не берется из конфига. Это плохо, так как у любого сайта обычно есть несклоько серверов:
- продакшен (который видят пользователи)
- тестовый сервер (на который можно выгрузить код и показать кому-то)
- сервер на локалхосте у разработчиков
У этих серверов разные адреса, потому имя хоста надо хранить в конфиге (или брать HTTP_HOST) а не прописывать жестко, так как это доставит потом множество неудобств.
Также, у тебя там жестко прописан домен в установке кук. Из-за этого у меня на другом домене они не ставятся и не работает ни регистрация ни flash сообщения.
------
При поиске надо выводить в поле поиска текущий поисковый запрос. Также, стоит писать
«Показаны только результаты поиска по словам xxxx. Показать всех абитуриентов».
> https://github.com/blackberryJam/abiturients/blob/master/templates/form.html.php#L20
> required pattern="[-`а-яА-ЯёЁ\\s]{2,40}" autofocus>
Тут ошибочка, в HTML не надо удваивать бекслеш и надо просто писать \s. А то, что у тебя интепретируется как «бекслеш или буква s». Удваиваем мы в PHP-строках так как они воспринимают 2 бекслеша как один (мануал: http://php.net/manual/ru/language.types.string.php )
Кстати, я тут почитал MDN, оказывается ^ и $ в pattern можно не писать, браузер это как-то сам проверяет.
Также я прочел еще одну интересную фишку. Если ты укажешь для input атрибут title, например «Имя может содержать ....» то браузер включит его в сообщение об ошибке заполнения (а также покажет при наведении на инпут). Давай-ка, чтобы ты это запомнил, напиши title хотя бы для нескольких инпутов, а то иногда непонятно что именно я заполнил не так.
Также, слишком длинные строчки в HTML, которые не влезают в ширину гитхаба, надо бы перенести.
Для года наверно стоит использовать input type="number" и указать для него min/max (max стоит указать лет на 100 в будущее чтобы оно было актуально). На мобильных устройствах это приведет к тому, что клавиатура будет содержать только цифры, и у input появятся стрелочки увеличения/уменьшения. Увы, специально для года поля ввода нет (а вот для года + месяца например есть).
Если можно то лучше не делать.
>>518192
Драйвер pdo mysql установил? Базу создал? Дамп залил? В конфиг прописал?
>>518200
Изучи CSS селекторы и jQuery чтобы узнать ответ на этот вопрос. ТЫ не можешь пользоваться библиотекой если не изучил ее как следует.
>>518469
Нужен — напиши. Мы тут только можем посоветовать пройти учебник, а домашние задания не решаем.
Вот мануал например (это если ты уже знаешь сам PHP): http://php.net/manual/ru/tutorial.forms.php
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L5
> \Application\CatMouse\models\Mouse;
По PSR-4 надо называть неймспейсы как и классы, с большой буквы:
CatMouse\Model\Mouse
(Application можно выкинуть так как оно тут смысла не добавляет).
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L19
> $mouse1 = new Mouse(9, 1, "Mouse1", $fieldSize);
А зачем мыши знать размер поля? Я думаю, ей нужна только ссылка на объект-карту которую она может получить автоматически при добавлении на карту (и которую у нее отберут при снятии).
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L34
> $mouse1->setLocation(["x" => $x, "y" => $y]);
Зачем тут массив? Не проще ли сделать 2 аргумента x и y? А то в твоем массиве можно не указать поле или наоборот опечататься и это ведь никто не проверяет.
Вместо копипасты кода расстановки лучше сделать метод setRandomLocation, и пусть заодно он проверяет не занята ли клетка.
> spl_autoload_extensions('.php');
Это задает настройки встроенного в PHP автозугручзика (spl_autoload) и тут ничего не делает.
Animal это тоже модель и должна лежать в том же неймспейсе.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L8
Тут слишком много свойств. Большинство из них ( private $seeAnimals;private $hashOfAnimal; ) устаревают на следующем ходе и их не имеет смысла вообще хранить.
> private $location = ["x" => 0, "y" => 0];
По моему удобнее и надежнее иметь свойства x и y чем мучаться с массивом. зачем тут этот массив? и почему массив а не например объект?
> private $fieldSize;
Это свойство карты, а не свойство кошки. Незачем дублировать информацию.
> public function __construct($fieldOfVision, $cruisingRange, $name, $fieldSize)
Так как поле зрения и скорость хода определяется типом животного то наверно не надо его передавать в конструктор.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L23
> $this->hashOfAnimal = spl_object_hash($this);
А зачем это? Если ты хочешь сравнить объекты на совпадение достаточно использовать $a === $b: http://php.net/manual/ru/language.oop5.object-comparison.php
> public function setFieldOfVision($fieldOfVision)
Так как по условиям задачи поле зрения не меняется, то наверно не стоит делать сеттер.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L72
> public function lookAround(SplObjectStorage $listOfAnimals)
Этот метод должен быть у объекта-карты. Это не задача животного хранить список всех других животных (и какой смысл хранить этот список в куче экземпляров?)
Алгоритм выбора хода лучше сделать универсальным:
- генерируем список всех разрешенных ходов, включая «стоять на месте» (запрещенные ходы на занятую клетку отсеиваем). Для каждого хода подсчитываем число очков
- выбираем ход с наибольшим числом очков
- делаем ход если он есть
Заметь что здесь есть как общие для всех животных части, так и места где они ведут себя по-разному. Грамотно разбив алгоритм на функции, ты сможешь избежать дублирования.
Подсчет очков для хода зависит от животного. Мышка оценивает безопасность клетки (чем ближе кошка, тем меньше баллов; чем меньше из клетки выходов, тем меньше баллов; чем больше видно кошек рядом с клеткой, тем меньше баллов), кошка — возможность поживиться (ну например чем ближе к клетке мышка тем больше баллов).
Ты должен грамотно подобрать веса для разных факторов, чтобы животные выбирали ход оптимально. Если учитывать много факторов, логика поведения животного может быть очень хитрой.
Заметь что этот алгоритм позволяет и делать случайные ходы например если есть несколько равноценных вариантов.
Твой алгоритм: https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/models/Cat.php#L20 очень неуниверсален, громоздок, не позволяет делать ход в зависимости от нескоьких факторов (например идти в сторону большего скопления мышей).
> echo "Can't see where is Mouse\n";
Тут стоит писать имя животного а то потом не разберешь кто что сказал.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L5
> \Application\CatMouse\models\Mouse;
По PSR-4 надо называть неймспейсы как и классы, с большой буквы:
CatMouse\Model\Mouse
(Application можно выкинуть так как оно тут смысла не добавляет).
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L19
> $mouse1 = new Mouse(9, 1, "Mouse1", $fieldSize);
А зачем мыши знать размер поля? Я думаю, ей нужна только ссылка на объект-карту которую она может получить автоматически при добавлении на карту (и которую у нее отберут при снятии).
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L34
> $mouse1->setLocation(["x" => $x, "y" => $y]);
Зачем тут массив? Не проще ли сделать 2 аргумента x и y? А то в твоем массиве можно не указать поле или наоборот опечататься и это ведь никто не проверяет.
Вместо копипасты кода расстановки лучше сделать метод setRandomLocation, и пусть заодно он проверяет не занята ли клетка.
> spl_autoload_extensions('.php');
Это задает настройки встроенного в PHP автозугручзика (spl_autoload) и тут ничего не делает.
Animal это тоже модель и должна лежать в том же неймспейсе.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L8
Тут слишком много свойств. Большинство из них ( private $seeAnimals;private $hashOfAnimal; ) устаревают на следующем ходе и их не имеет смысла вообще хранить.
> private $location = ["x" => 0, "y" => 0];
По моему удобнее и надежнее иметь свойства x и y чем мучаться с массивом. зачем тут этот массив? и почему массив а не например объект?
> private $fieldSize;
Это свойство карты, а не свойство кошки. Незачем дублировать информацию.
> public function __construct($fieldOfVision, $cruisingRange, $name, $fieldSize)
Так как поле зрения и скорость хода определяется типом животного то наверно не надо его передавать в конструктор.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L23
> $this->hashOfAnimal = spl_object_hash($this);
А зачем это? Если ты хочешь сравнить объекты на совпадение достаточно использовать $a === $b: http://php.net/manual/ru/language.oop5.object-comparison.php
> public function setFieldOfVision($fieldOfVision)
Так как по условиям задачи поле зрения не меняется, то наверно не стоит делать сеттер.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L72
> public function lookAround(SplObjectStorage $listOfAnimals)
Этот метод должен быть у объекта-карты. Это не задача животного хранить список всех других животных (и какой смысл хранить этот список в куче экземпляров?)
Алгоритм выбора хода лучше сделать универсальным:
- генерируем список всех разрешенных ходов, включая «стоять на месте» (запрещенные ходы на занятую клетку отсеиваем). Для каждого хода подсчитываем число очков
- выбираем ход с наибольшим числом очков
- делаем ход если он есть
Заметь что здесь есть как общие для всех животных части, так и места где они ведут себя по-разному. Грамотно разбив алгоритм на функции, ты сможешь избежать дублирования.
Подсчет очков для хода зависит от животного. Мышка оценивает безопасность клетки (чем ближе кошка, тем меньше баллов; чем меньше из клетки выходов, тем меньше баллов; чем больше видно кошек рядом с клеткой, тем меньше баллов), кошка — возможность поживиться (ну например чем ближе к клетке мышка тем больше баллов).
Ты должен грамотно подобрать веса для разных факторов, чтобы животные выбирали ход оптимально. Если учитывать много факторов, логика поведения животного может быть очень хитрой.
Заметь что этот алгоритм позволяет и делать случайные ходы например если есть несколько равноценных вариантов.
Твой алгоритм: https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/models/Cat.php#L20 очень неуниверсален, громоздок, не позволяет делать ход в зависимости от нескоьких факторов (например идти в сторону большего скопления мышей).
> echo "Can't see where is Mouse\n";
Тут стоит писать имя животного а то потом не разберешь кто что сказал.
>>518556
Вопросы бы задавал, что именно непонятно. MVC это не ракетостроение, чтобы его не понять.
>>518590
Да это не так сложно, чем больше ты знаешь концепций тем проще понять новй фреймворк. Да и я бы не сказал что их много, симфони 2 да Yii2 уж который год юзаем (а раньше был ZF1).
С CMS можно разобраться по докуиентации или по коду, если ты хорошо знаешь PHP то это не проблема.
>>518591
Пиши, сдавай на проверку, я скажу если что не так.
>>519014
Изучай jquery/css селекторы.
Я даже ссылочек могу дать:
CSS селекторы http://htmlbook.ru/test/selektory-css
Соответственно смотри как найти нужный блок. Также, можно использлвать у jquery метод find для поиска изображений только в одном блоке.
>>519036
Это нормально.
> for ($i=0; $i==$halfLength; $i++) {
Смотри, у тебя в начале
$i = 0;
$halfLength допустим равно 8
Он смотрит, что условие $i==$halfLength не выполняется и цикл заканчивается ни разу не выполнившись. Надо заменить == на <=. Это не условие завершения цикла, а условие «выполнять пока условие верно».
>>519047
> по ссылке из оп поста говорится, что в for должно быть две точки с запятой, не больше, не меньше пик2
Верно. Точки с запятой должно быть всегда две, но самое первое действие и последнее действие могут быть пустыми (то условие что посередине тоже - тогда цикл будет выполняться вечно). Это все правильные конструкции:
for (; $i < 10; ) { ... } - равносильно while ($i < 10) { .. }
for ($i = 0; $i < 10; ) ...
for ($i = 0, $k = 0; $i < 10; $i++, $k++ ) ...
Мануал http://php.net/manual/ru/control-structures.for.php
>>519051
Это условие выполнения цикла, а не условие останова. Цикл выполняется только пока оно истинно.
>>518556
Вопросы бы задавал, что именно непонятно. MVC это не ракетостроение, чтобы его не понять.
>>518590
Да это не так сложно, чем больше ты знаешь концепций тем проще понять новй фреймворк. Да и я бы не сказал что их много, симфони 2 да Yii2 уж который год юзаем (а раньше был ZF1).
С CMS можно разобраться по докуиентации или по коду, если ты хорошо знаешь PHP то это не проблема.
>>518591
Пиши, сдавай на проверку, я скажу если что не так.
>>519014
Изучай jquery/css селекторы.
Я даже ссылочек могу дать:
CSS селекторы http://htmlbook.ru/test/selektory-css
Соответственно смотри как найти нужный блок. Также, можно использлвать у jquery метод find для поиска изображений только в одном блоке.
>>519036
Это нормально.
> for ($i=0; $i==$halfLength; $i++) {
Смотри, у тебя в начале
$i = 0;
$halfLength допустим равно 8
Он смотрит, что условие $i==$halfLength не выполняется и цикл заканчивается ни разу не выполнившись. Надо заменить == на <=. Это не условие завершения цикла, а условие «выполнять пока условие верно».
>>519047
> по ссылке из оп поста говорится, что в for должно быть две точки с запятой, не больше, не меньше пик2
Верно. Точки с запятой должно быть всегда две, но самое первое действие и последнее действие могут быть пустыми (то условие что посередине тоже - тогда цикл будет выполняться вечно). Это все правильные конструкции:
for (; $i < 10; ) { ... } - равносильно while ($i < 10) { .. }
for ($i = 0; $i < 10; ) ...
for ($i = 0, $k = 0; $i < 10; $i++, $k++ ) ...
Мануал http://php.net/manual/ru/control-structures.for.php
>>519051
Это условие выполнения цикла, а не условие останова. Цикл выполняется только пока оно истинно.
Можешь бросать, но другие тоже тут по несколько днйе мучались.
> посмотрел ответ
Что такое? Где это ответы лежат? Придется менять условия задачек видимо.
Тут надо написать внутри цикла примерно такой код (а то что сейчас стереть так как оно неприавльное):
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>519201
Так не пойдет. Ты должен понимать каждую строчку, либо хотя бы попробовать объяснить как тебе кажется , он работает.
COUNT подсчитывает число не равных NULL значений в группе.
CASE очевидно возвращает NULL если не выполнено ни одно условие WHEN и не NULL если выполнено.
Это можно записать лучше и короче.
>>519274
напиши. Там анонимные функции не нужны, а вот нужен RecurisveDirectoryIterator.
>>519299
Нужно уметь искать ниши и возможности. Ну и у Джобса не так все просто было, почитай хотя бы в википедии, его компания должго была нишевой, были убытки, были непроданные продукты, его увольняли из совета директоров. Большой успех началася только с выхода айпода (плеера с колесиком), а до этого почти 20 лет все было очень шатко.
> Году в 2010 хабрапомойка была переполнена статьями в духе - "Зацените мой никому не нужный сервис по поиску друга для вашей мамки", миллионы их было,
Потому что разработчики реализуют не потребности рынка, а свои фантазии.
>>519301
Более того, качество кода там как правило днище, тестов нет и тд.
>>519306
Ты что-то напутал. Может у тебя колонки в другом порядке идут? Сделай-ка
DESCRIBE pet;
И покажи что он выведет. Также попробуй после LOAD INFILE сделать команду
SHOW WARNINGS;
И напиши что она выведет.
На форуме
> Варианты с подстановкой вместо /N, //N и NULL приводили к аналогичным результатам.
Там перепутали прямой и обратный cлеш. Надо писать \N иначе MySQL понимает это как строку "/N" и при попытке вставить вместо даты всталвяются нули.
Если ты перед вставкой сделаешь команду
SET sql_mode = 'STRICT_ALL_TABLES';
То MySQL не позволиит остатся ошибке незамеченной и громко сообщит о ней.
>>519333
Ну так а у нас цель считать лайки а не число не-NULL результатов. Код должен быть логичным а не запутанным.
Можешь бросать, но другие тоже тут по несколько днйе мучались.
> посмотрел ответ
Что такое? Где это ответы лежат? Придется менять условия задачек видимо.
Тут надо написать внутри цикла примерно такой код (а то что сейчас стереть так как оно неприавльное):
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>519201
Так не пойдет. Ты должен понимать каждую строчку, либо хотя бы попробовать объяснить как тебе кажется , он работает.
COUNT подсчитывает число не равных NULL значений в группе.
CASE очевидно возвращает NULL если не выполнено ни одно условие WHEN и не NULL если выполнено.
Это можно записать лучше и короче.
>>519274
напиши. Там анонимные функции не нужны, а вот нужен RecurisveDirectoryIterator.
>>519299
Нужно уметь искать ниши и возможности. Ну и у Джобса не так все просто было, почитай хотя бы в википедии, его компания должго была нишевой, были убытки, были непроданные продукты, его увольняли из совета директоров. Большой успех началася только с выхода айпода (плеера с колесиком), а до этого почти 20 лет все было очень шатко.
> Году в 2010 хабрапомойка была переполнена статьями в духе - "Зацените мой никому не нужный сервис по поиску друга для вашей мамки", миллионы их было,
Потому что разработчики реализуют не потребности рынка, а свои фантазии.
>>519301
Более того, качество кода там как правило днище, тестов нет и тд.
>>519306
Ты что-то напутал. Может у тебя колонки в другом порядке идут? Сделай-ка
DESCRIBE pet;
И покажи что он выведет. Также попробуй после LOAD INFILE сделать команду
SHOW WARNINGS;
И напиши что она выведет.
На форуме
> Варианты с подстановкой вместо /N, //N и NULL приводили к аналогичным результатам.
Там перепутали прямой и обратный cлеш. Надо писать \N иначе MySQL понимает это как строку "/N" и при попытке вставить вместо даты всталвяются нули.
Если ты перед вставкой сделаешь команду
SET sql_mode = 'STRICT_ALL_TABLES';
То MySQL не позволиит остатся ошибке незамеченной и громко сообщит о ней.
>>519333
Ну так а у нас цель считать лайки а не число не-NULL результатов. Код должен быть логичным а не запутанным.
Если ты афйон в кредит верно решил то айпад решается за 5 минут.
Решение должно писать сколько всего денег выполчено. Твоя программа не пишет. Ответ во втором банке должен быть около 61270.
Так что пока гордиться рано.
И я не понимаю, откуда взялась цифра 11? А если я сумму кредита поменяю, добрый волшебник придет и за меня поменяет эту цифру?
А ты учел время на поиск заказчика, переговоры с ним? На исправление замечаний? 1к рублей в час ты получаешь если при работе по 8 часов в день ты за месяц набираешь 160К. Сомневаюсь, что у тебя уже есть список из 160 аналогичных заказов. Так что реальная почасовая оплата наверно меньше выходит.
Ну и нет такого понятия как «справедливая» цена. Это как? Если я бы был заказчиком то для меня «справедливая» цена это ноль рублей + может быть отзыв (хотя не, сорри, мне некогда ставить отзывы, надо задачки проверить анонам).
Есть та, которую готов заплатить за работу заказчик, и та, за которую готов работать исполнитель. Если они сходятся, это и есть рыночная цена. Раз заказчик заплатил тебе такую сумму, значит он считает что твоя работа стоит больше чем эти деньги и твое предложение выгоднее других исполнителей.
Ты же не возмущаешься в магазине что хлеб дорогой? Ты либо его покупаешь либо покупаешь что-нибудь другое либо идешь выращивать сам.
Вот тут есть статья, она не совсем про фриланс, но про формирование цен, от Джоэла Спольски, он раньше работал в майкрософт (над экселем) и очень умный (хотя вы молодежь наверно про него не слышали, но он кроме автора блога еще и сооснователь StackOverflow): http://russian.joelonsoftware.com/Articles/CamelsandRubberDuckies.html
> Кто делал сайты-визитки, что там должно быть обязательно?
То, что хочет видеть заказчик.
А, еще кое-что. Если у тебя хорошее настроение и ты думаешь что провернул выгодную сделку, не спеши радоваться. Может быть заказ отдал тебе посредник который взял с заказчика допустим 5 или 10К.
>>519349
Распечатать, на стенку повесить и смотреть на него когда кушать захочется.
говорит, что есть метод toArray(), однако когда я его выполняю ничего не меняется. И у меня все равно объект.
Печаль какая -то, не знаю как поступить.
Unknown, если ss_1 is null. Так как обычно Unknown считается также как false в логических выражениях, то достаточно заменить на ss_1 is not null, но тут на код надо смотреть.
И да анон, все же не могу удержаться. Тени у тебя ужасные. У меня от них глаза вытекают, когда я на них смотрю.
Fc это класс какого-то апи? Почитай доки по нему и изучи его исходный код.
У Illuminate\Support\Collection наверняка не только toArray есть, посомтри внимаительно.
В твоём sql может быть и нет, а в нормальном - троичная логика с true, false и null unknown. И в том же нормальном sql твоё выражение всегда будет равняться unknown.
Cравнение с NULL возвращает NULL (а не UNKNOWN), по крайней мере в MySQL.
Вики показывает что во многих БД с ним тоже все не просто: https://en.wikipedia.org/wiki/Null_(SQL)#Data_typing_of_Null_and_Unknown
Что-то у меня ощущение что это только в стандарте работает а не на практике.
В Postgres тоже NULL: http://sqlfiddle.com/#!15/3d4f6/4
И мне тут еще одна мысль в голову пришла (по поводу ценообразования). Иногда я вижу акции типа «2 по цене одной». Если магазин может позволить себе продавать 2 вещи по цене одной значит он накручивает на цену закупки не менее 100%!
Также, я допустим видел вещь которая продается со скидкой (за 1300) при том что старая цена была 2400. То есть они продают вещь со скидкой и остаются в плюсе, а сколько же они накрчивали когда цена была без скидки?
Дык товар залеживается и чтобы хоть какие-то деньги получить они продают его со скидкой, т.к. иначе они вообще никакие деньги не получат.
Тем не менее в убыток они продавать не будут, мне кажется. Особенно если речь об одежде, которая не портится и которую можно в случае неудач продать в магазин распродаж.
Ну там убыток в случае какого-то определенного товара не так критичен. Обычно он включен в расчеты. Да и скидки зачастую делают фиктивными, т.е. цену оставляют прежнюю, но пишут, мол скидка 50%. Чистая игра на психологии, чтобы людям казалось, что они выгодно очень что-то покупают.
Ну в условии задачи сказано "определить каким банком выгоднее пользоваться".
Я посчитал и вышла, что выгоднее всего третьим банком, так как за 11 месяцев школьник уже ничего не должен банку, 11 месяцев я сам написал. Условие просто не понятное то ли я должен к сумме кредита прибавлять процент и комиссию и вычитать ежемесячную оплату анона, то ли что, хрен пойми
Каждый месяц ты прибавляешь к долгу процент от него и комиссию. Затем анон платит сколько может. И так пока долг больше нуля.
В db2 unknown, в оракле на работе проверю. Но вообще iunknown это тако аналог null для sql boolean
Ну так? Долг 40 000 + процент + комиссия - оплата анона.
Выходит та формула, что у меня в коде.
Да, кстати, я не совсем понимаю как сумма кредита может почти вверх, если школьник отдаёт больше чем ему начисляет банк
Я хотел на sqlfiddle проверить но не смог составить запрос (с ораклом особо не работал, а гугл не помог): http://sqlfiddle.com/#!4/9eecb7d/2177
> SELECT NULL <> 1 FROM dual;
> ORA-00923: FROM keyword not found where expected
Что ему не нравится?
>>519457
Там не должно быть заложенной цифры 11, программа должна сама вычислять сколько месяцев надо. Если я впишу другую сумму кредита, как я угадаю сколько надо месяцев выплачивать? Это должно все считаться автоматически.
>>519466
Она и не растет вверх.
И вообще, у оракла такие информативные сообщение об ошибках! Он пишет только ошибку но не пишет где она произошла и когда у тебя огромный запрос это совсем не весело.
Проверил, у оракла нет unknown. У него вообще нет boolean для sql, лол, есть только в pl/sql.
>>519470
Там невозможно просто так вывести значение булеана в запросе. Булеан в оракле есть только в pl/sql, в sql-запросе надо пользоваться case-when/decode или условиями в where.
И вывод строчки с ошибкой тоже только в pl/sql, но даже там, если ошибка в запросе, то он укажет только в каком запросе. Но обычно простые ошибки ещё sqldeveloper показывает, а сложные более-менее из текста ошибки понятны(если это только не ora-600)
Забыл сказать, вместо unknown в хоракле null.
блять, я что-то нихуя не понимаю
определи наиболее выгодный кредит. Платить школьник, как и прежде, может не более 5000 р. в месяц. Сначала начисляются проценты и комиссия, а только потом происходит выплата.
Единственное, что мне приходит на ум, так это взять определенный промежуток времени и определить кому из банков за этот определенный промежуток времени школьник будет меньше всего должен и исходя из моего решения самый лучший вариант - третий.
как исходя из этого задания могло получиться во втором ответе 62к, если кредит гасится, а не увеличивается, почему именно 62к, что бля в тот момент произошло, что перестало увеличиваться дальше.
Можешь хотя бы примерно намекнуть, что я должен сделать?
Я вот в душе не ебу как эту задачу с первого раза можно решить за 5 минут.
61270 это общая сумма выплат по кредиту. КАк могло получиться? 39999 + проценты + комиссии за время выплаты.
> динственное, что мне приходит на ум, так это взять определенный промежуток времени и определить кому из банков за этот определенный промежуток времени школьник будет меньше всего должен
Посчитать общую сумму выплат по кредиту и посмотреть где меньше.
> вот у меня есть статический сайт на компе с чего начать и что нужно сделать чтобы залить его?
Сайт на хостинг в самом простом случае заливают по протоколу FTP или SFTP значит тебе нужна программа-клиент, например WinSCP. Вводишь туда данные соединения и заказчиваешь файлы.
Это для простых случаев, более сложный способ это например написать bash-скрипт на основе rsync, но для этого нажо хорошо разбираться в командной строке.
>>519121
Все правильно
Верно решено.
Верно, но эти повторяющиеся строки стоит вынести за пределы ифа:
>\t$creditBalance = $creditBalance - $monthlyPayment;
> $paymentTotal = $paymentTotal + $monthlyPayment;
> echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {
Тут все правильно.
> я должен гсч задать число от 100000 до 999999 а затем делить его на 10 и в итоге получиться последняя цифра поста, то есть нужно задать что выводить при получении чисел от 0 до 9 так?
Да, надо поставить например блок if/elseif/else который для разных цифр выводит разные тексты.
> А для задания с кубиками код так должен выглядеть конечный в итоге или можно лучше было?
Если это твой код http://ideone.com/yddJ6y то все верно
>>519153
Да, верно.
>Также, я тут подумал, не проще ли генерировать условие вида:
>
>SELECT ...
>WHERE (field1 LIKE '%word1%' OR field2 LIKE '%word1%' ... ) AND (.... LIKE '%word2%') AND (.... LIKE '%word3%') ?
>ORDER BY ... LIMIT ...
>
>И пусть база объединяет результаты.
Наверное так и сделаю. Странно, что это сразу мне в голову не пришло.
>Кстати, если тебе интересно, можешь почитать как сделан DI Container в симфони (он может использоваться и без симфони как отдельный компонент):
>(англ) http://symfony.com/doc/current/components/dependency_injection/introduction.html
Вообще, мне нравится, как эта штука реализована в Symfony. Даже без yaml-конфига всё кратко, читаемо и понятно. Алсо, не знал, что в PHP можно вызвать несколько методов объекта, написав его ссылку-переменную всего один раз.
>Я не знаю, видишь ли ты это или нет, но при правильном DI твои классы не привязаны к конкретной реализации контейнера. То есть если твой AbiturientMapper и AbiturientService написаны правильно то ты можешь использовать их с любым другим контейнером, не меняя эти классы (в твоем случае это так, потому что ты следуешь принципам DI, и это хорошо).
Уже ощутил это, когда игрался с контейнером.
>> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L22
>> if ($token) {
>> $abiturient = $mapper->getByToken($token);
>А что если по каким-то причинам (ошибка в куке, удален из базы) такой абитуриент не найден?
Предлагаешь перенести проверку наличия токена в базе из getByToken() в контроллер? Так-то сейчас маппер, если не находит токен, то возвращает объект Abiturient с пустыми полями.
С остальными замечаниями всё понятно, спасибо, исправлю.
>>519402
Зачем удерживаться, лол? Буду рад, если укажешь на все ошибки, даже те, которые не касаются основного кода. Всё равно, как подучу HTML/CSS, планирую все шаблоны переделать.
А в каком смысле "ужасные"? Они тут не уместны? Мне просто белые бутстраповские таблички на белом фоне показались скучными. Или тени как-то неправильно сделаны?
>Также, я тут подумал, не проще ли генерировать условие вида:
>
>SELECT ...
>WHERE (field1 LIKE '%word1%' OR field2 LIKE '%word1%' ... ) AND (.... LIKE '%word2%') AND (.... LIKE '%word3%') ?
>ORDER BY ... LIMIT ...
>
>И пусть база объединяет результаты.
Наверное так и сделаю. Странно, что это сразу мне в голову не пришло.
>Кстати, если тебе интересно, можешь почитать как сделан DI Container в симфони (он может использоваться и без симфони как отдельный компонент):
>(англ) http://symfony.com/doc/current/components/dependency_injection/introduction.html
Вообще, мне нравится, как эта штука реализована в Symfony. Даже без yaml-конфига всё кратко, читаемо и понятно. Алсо, не знал, что в PHP можно вызвать несколько методов объекта, написав его ссылку-переменную всего один раз.
>Я не знаю, видишь ли ты это или нет, но при правильном DI твои классы не привязаны к конкретной реализации контейнера. То есть если твой AbiturientMapper и AbiturientService написаны правильно то ты можешь использовать их с любым другим контейнером, не меняя эти классы (в твоем случае это так, потому что ты следуешь принципам DI, и это хорошо).
Уже ощутил это, когда игрался с контейнером.
>> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L22
>> if ($token) {
>> $abiturient = $mapper->getByToken($token);
>А что если по каким-то причинам (ошибка в куке, удален из базы) такой абитуриент не найден?
Предлагаешь перенести проверку наличия токена в базе из getByToken() в контроллер? Так-то сейчас маппер, если не находит токен, то возвращает объект Abiturient с пустыми полями.
С остальными замечаниями всё понятно, спасибо, исправлю.
>>519402
Зачем удерживаться, лол? Буду рад, если укажешь на все ошибки, даже те, которые не касаются основного кода. Всё равно, как подучу HTML/CSS, планирую все шаблоны переделать.
А в каком смысле "ужасные"? Они тут не уместны? Мне просто белые бутстраповские таблички на белом фоне показались скучными. Или тени как-то неправильно сделаны?
В общем а теперь к делу. Работаю я можно сказать джуном, пилим 1 проект для внутреннего использования. Там есть свой поиск, всякие сортировки, постраничка и прочая годнота. Суть в том, что сначала там было все просто со url
Например сначала были только ссылки типа:
базовый_урл/контроллер/метод/тип
например:
host.ru/admin/user/add
или
host.ru/admin/event/add
Но потом добавились всякие сортировки и поиск, и вскоре ссылка стала выглядеть уже так:
host.ru/account/index?sort=user_name&order=asc
А с прикрученным поиском и
host.ru/account/index?sort=status&order=asc&find=test
Сегодня после длительного перерыва, так сказать, надо было прикрутить еще одну функцию к этому делу. Скажем так, скрытие выполненных задач по желанию юзера.
Но глянув во вьюху, где отрисоввываются ссылки, я охуел от того сколько говна там накручено и от того сколько надо будет еще наворотить, если и это сделать через get
Поэтому было принято решение сделать это дело через сессию.
То есть в сессию кидать простую переменную $hideStuff, и соответственно, если юзер нажимает кнопочку спрятать, то значение меняется на true, и взависимости от неё контроллер передает модели доп аргумент и всё сейчас вообще выглядит просто прекрасно.
Объясните мне почему это может быть ошибочным вариантом? У меня вообще идея перенести туда и сортировку и поиск, что бы избавиться от get - мишуры в url и кучи условий при отрисовки ссылок во вьюхе. Такие дела.
Сам задетектил только 1 подводный камень: что сессия сохраняется если закрыть вкладку и снова открыть. Но думаю это легко решается, впиливанем на уровне входа в систему через сессию можно принудительно это дело сбрасывать.
Буду рад ответам.
В общем а теперь к делу. Работаю я можно сказать джуном, пилим 1 проект для внутреннего использования. Там есть свой поиск, всякие сортировки, постраничка и прочая годнота. Суть в том, что сначала там было все просто со url
Например сначала были только ссылки типа:
базовый_урл/контроллер/метод/тип
например:
host.ru/admin/user/add
или
host.ru/admin/event/add
Но потом добавились всякие сортировки и поиск, и вскоре ссылка стала выглядеть уже так:
host.ru/account/index?sort=user_name&order=asc
А с прикрученным поиском и
host.ru/account/index?sort=status&order=asc&find=test
Сегодня после длительного перерыва, так сказать, надо было прикрутить еще одну функцию к этому делу. Скажем так, скрытие выполненных задач по желанию юзера.
Но глянув во вьюху, где отрисоввываются ссылки, я охуел от того сколько говна там накручено и от того сколько надо будет еще наворотить, если и это сделать через get
Поэтому было принято решение сделать это дело через сессию.
То есть в сессию кидать простую переменную $hideStuff, и соответственно, если юзер нажимает кнопочку спрятать, то значение меняется на true, и взависимости от неё контроллер передает модели доп аргумент и всё сейчас вообще выглядит просто прекрасно.
Объясните мне почему это может быть ошибочным вариантом? У меня вообще идея перенести туда и сортировку и поиск, что бы избавиться от get - мишуры в url и кучи условий при отрисовки ссылок во вьюхе. Такие дела.
Сам задетектил только 1 подводный камень: что сессия сохраняется если закрыть вкладку и снова открыть. Но думаю это легко решается, впиливанем на уровне входа в систему через сессию можно принудительно это дело сбрасывать.
Буду рад ответам.
Дошел до 5й. Решил ее. Но вот одно но. На пикче которую дал автор, текст окрашен в фоновый цвет, а это означает, что полупрозрачный фон находится поверх текста. Как это было сделано? Я потратил пару часов на поиск решения, да так и не нашел.
Если у тебя ушло на поиск пару часов и ты так и не нашел ответа, у меня для тебя плохие новости. Потому-что в подсказке к задачке все доходчиво написано.
Дохуя. Поэтому в офис и идут на пару лет, если хотят на апворках работать. В офисе проще всю эту гору фреймворков, библиотек и сопутствующих технологий освоить.
Задание №1: https://jsfiddle.net/medq405y/
Задание №2: https://jsfiddle.net/xuof3v2n/
>>519386
ну вот так я не понимаю, как выводится массив данных в мвк - вон вверху скрин приведен. единственный гайд, по которому смогу сделать - английские, все остальные русские говно с хабра, у меня даже не получается переделать (потому что там непонятно какие-то скрины что куда втыкатеся нихуя не понятно) даже распаковать готовый пример и установить не поулчается. переделал только одни английский гайд с ютуба ну так там только дна переменая выводится а массив нихуя. так что да мвк - это ракета хуй пойми как работает.
Массив выводится классом view, которую создает controller, сам массив вытаскивается контроллером из модели, которую тоже создает контроллер. Еще контроллер проверяет все инпуты. Так же и со всеми остальными данными.
http://ideone.com/oLTBYc
> Даже без yaml-конфига всё кратко, читаемо и понятно.
А с конфигом компактнее и быстрее писать. В симфони вообще интересная архитектура. Приложение там состоит из бандлов — например, может быть бандл с твоим кодом + бандлы сторонних библиотек. И каждый бандл может доьавлять в контейнер свои сервисы, свои правила роутинга в роутер и тд.
В общем, надеюсь, ты когда-нибудь доберешься и до изучения симфони. Там для многих вещей есть готовые решения.
> Алсо, не знал, что в PHP можно вызвать несколько методов объекта, написав его ссылку-переменную всего один раз.
Это назвается method chaining, и для этого надо делать чтобы в конце метода стояла return $this; Мне кстати это не особо нравится, так как надо всюду пихать этот return $this. Да и на практике не так уж часто оно нужно.
> Так-то сейчас маппер, если не находит токен, то возвращает объект Abiturient с пустыми полями.
Лучше наверно перенести это в контроллер так как традиционно методы вроде getById врозвращают null если объект не найден (я читая код подумал именно так). Ну или назвать метод getAbiturientOrCreateNew чтобы название соответствовало тому что он делает.
> А в каком смысле "ужасные"? Они тут не уместны? Мне просто белые бутстраповские таблички на белом фоне показались скучными. Или тени как-то неправильно сделаны?
Может это субъективно, но они во-первых слишком резкие (ну то есть слишком черные, можно было бы побледнее сделать), во-вторых не вписываются в стиль бутстрапа, у него все относительно плоское и без теней.
Также, в желтом заголовке не хватает вертикального паддинга, тексту там тесно.
Отступы и поля тоже важны при оформлении страницы.
Вот пикрелейтед, я тут решил поиграть с цветами/шрифтами.
Ты решаешь не ту проблему. В чем проблема что в ссылке будет не 3, а 4 параметра? Query string как раз и предназначена для их передачи. Тебе место в адресной строке жалко что ли?
Твоя проблема — плохой код в вью, если я правильно тебя понял:
> Но глянув во вьюху, где отрисоввываются ссылки, я охуел от того сколько говна там накручено и от того сколько надо будет еще наворотить, если и это сделать через get
Ну так и решай ее — вынеси код генерации ссылки в функцию или объект, чтобы во вью ты только указывал параметры которые надо поменять.
Идея использовать сессии, в общем плохая. Сессия общая для всех вкладок, сессия не передается если ты сохранишь ссылку в закладки/перешлешь кому-то, сессия не меняется если ты жмешь кнопку «назад» в браузере. То есть заменяя параметры в URL на сессию ты делаешь использование сайта менее удобным и ломаешь встроенные в браузер механизмы.
Ну и это не соответствует принципам REST.
Однако в некоторых случаях сессии/куки удобнее чем сылки. Они нужны для постоянных настроек которые оченб редко меняются и которые не надо передавать вместе со ссылкой. Например, громкость на ютубе: куки — идеальное место для нее, в то время как допсиывать ее в каждый URL неудобно и бессмысленно (так как когда ты отпрваляешь ссылку на видео, пользователю не интересно на какой громкости ты его смотришь).
Аналогично, выбор языка интерфейса — это тоже удобнее хранить в куках.
Заметь, я пишу куки, а не сессия. Сессия это временное хранилище и она умировает через 20 минут неактивности и мы не хотим терять настройки языка или громкости так быстро.
Для сортировки разумеется сессия и куки не подходят, если только нет надобности навсегда сохранять эту настройку. То есть надо смотреть на сценарий использования сайта.
> что сессия сохраняется если закрыть вкладку и снова открыть. Но думаю это легко решается, впиливанем на уровне входа в систему через сессию можно принудительно это дело сбрасывать.
Ты решаешь не ту проблему, городишь костыли и при этом все равно получаешь менее удобное решение.
Ты решаешь не ту проблему. В чем проблема что в ссылке будет не 3, а 4 параметра? Query string как раз и предназначена для их передачи. Тебе место в адресной строке жалко что ли?
Твоя проблема — плохой код в вью, если я правильно тебя понял:
> Но глянув во вьюху, где отрисоввываются ссылки, я охуел от того сколько говна там накручено и от того сколько надо будет еще наворотить, если и это сделать через get
Ну так и решай ее — вынеси код генерации ссылки в функцию или объект, чтобы во вью ты только указывал параметры которые надо поменять.
Идея использовать сессии, в общем плохая. Сессия общая для всех вкладок, сессия не передается если ты сохранишь ссылку в закладки/перешлешь кому-то, сессия не меняется если ты жмешь кнопку «назад» в браузере. То есть заменяя параметры в URL на сессию ты делаешь использование сайта менее удобным и ломаешь встроенные в браузер механизмы.
Ну и это не соответствует принципам REST.
Однако в некоторых случаях сессии/куки удобнее чем сылки. Они нужны для постоянных настроек которые оченб редко меняются и которые не надо передавать вместе со ссылкой. Например, громкость на ютубе: куки — идеальное место для нее, в то время как допсиывать ее в каждый URL неудобно и бессмысленно (так как когда ты отпрваляешь ссылку на видео, пользователю не интересно на какой громкости ты его смотришь).
Аналогично, выбор языка интерфейса — это тоже удобнее хранить в куках.
Заметь, я пишу куки, а не сессия. Сессия это временное хранилище и она умировает через 20 минут неактивности и мы не хотим терять настройки языка или громкости так быстро.
Для сортировки разумеется сессия и куки не подходят, если только нет надобности навсегда сохранять эту настройку. То есть надо смотреть на сценарий использования сайта.
> что сессия сохраняется если закрыть вкладку и снова открыть. Но думаю это легко решается, впиливанем на уровне входа в систему через сессию можно принудительно это дело сбрасывать.
Ты решаешь не ту проблему, городишь костыли и при этом все равно получаешь менее удобное решение.
И я тут подумал, некоторые настройки типа языка правильнее сохранять не в куки, а в аккаунт. Ведь человек может заходить в систему с нескольких устройств и он разумеется хочет везде видеть одинаковый язык.
А вот громкость надо хранить в куках так как на разных устройствах разные звуковые карты и устройства вопросзведения звука.
То есть выбирать способ хранения параметра надо исходя из сценария использования и целей, но уж точно не потому что кто-то набыдлокодил в шаблоне.
Ну а сессия по моему самый бесполезный и неудобный способ, она только для каких-то временных вещей.
Подсказка: используй свойство color (как альтернатива ты можешь сделать текст прозрачным укзав rgba-цвет или opacity, но по моему проще пипеткой померять цвет и задать его).
>>519762
Он начинающий, все нормально.
>>519813
Это нужно для того чтобы освоить какие-то технологии. Если не хочешь, можешь не учить, но кем ты будешь работать? Верстальщиком? Поддерживать сайты с кучей быдлокода? Тебе быстро надоест.
>>519826
Просто передеаешь свой массив в шаблон и все. Допустим ты подключаешь шаблон через require:
$users = []; // пример массива
$users[] = new User('Иван', 1980);
$users[] = new User('Вася', 1970);
// подключаем шаблон, передавая массив
require _ _ DIR _ _ . '/templates/users.phtml';
В шаблоне соответсвнно выводим их через foreach.
> единственный гайд, по которому смогу сделать - английские, все остальные русские говно с хабра, у меня даже не получается переделать (
Давай поменьше негатива. Это пользы не даст ни тебе ни мне.
> даже распаковать готовый пример и установить не поулчается.
В чем проблема посмотреть почему не работает и исправить ошибки? Если ты это сделать не можешь то тебе рано браться за MVC и стоит вернуться к решению более простых задач на PHP для закрепления знаний.
Обычно люди сталкиваются с такими проблемами, как ты, это когда они пропускают темы, пытаясь сразу браться за сложное, не изучив более простые вещи. В моем учебнике например надо решить несколько задач средней сложности. в ходе решения которых в том числе приобретаются навыки отлаживания программы и поиска ошибок.
> ну вот так я не понимаю, как выводится массив данных в мвк - вон вверху скрин приведен.
Ты взял какой-то переусложненный пример и путаешься. Надо было писать самому, или найти простой пример.
Если у тебя что-то куда-то не передается, наставь var_dump и найди где именно значение теряется. Также, включи отображение ошибок либо смотри логи, может там ошибки есть в коде. Что ты беспомощный такой.
И переписывание/копирование кода пользы не дает. Польза будет если ты MVC приложения напишешь сам от начала и до конца.
Например, решая задачу про список студентов.
Подсказка: используй свойство color (как альтернатива ты можешь сделать текст прозрачным укзав rgba-цвет или opacity, но по моему проще пипеткой померять цвет и задать его).
>>519762
Он начинающий, все нормально.
>>519813
Это нужно для того чтобы освоить какие-то технологии. Если не хочешь, можешь не учить, но кем ты будешь работать? Верстальщиком? Поддерживать сайты с кучей быдлокода? Тебе быстро надоест.
>>519826
Просто передеаешь свой массив в шаблон и все. Допустим ты подключаешь шаблон через require:
$users = []; // пример массива
$users[] = new User('Иван', 1980);
$users[] = new User('Вася', 1970);
// подключаем шаблон, передавая массив
require _ _ DIR _ _ . '/templates/users.phtml';
В шаблоне соответсвнно выводим их через foreach.
> единственный гайд, по которому смогу сделать - английские, все остальные русские говно с хабра, у меня даже не получается переделать (
Давай поменьше негатива. Это пользы не даст ни тебе ни мне.
> даже распаковать готовый пример и установить не поулчается.
В чем проблема посмотреть почему не работает и исправить ошибки? Если ты это сделать не можешь то тебе рано браться за MVC и стоит вернуться к решению более простых задач на PHP для закрепления знаний.
Обычно люди сталкиваются с такими проблемами, как ты, это когда они пропускают темы, пытаясь сразу браться за сложное, не изучив более простые вещи. В моем учебнике например надо решить несколько задач средней сложности. в ходе решения которых в том числе приобретаются навыки отлаживания программы и поиска ошибок.
> ну вот так я не понимаю, как выводится массив данных в мвк - вон вверху скрин приведен.
Ты взял какой-то переусложненный пример и путаешься. Надо было писать самому, или найти простой пример.
Если у тебя что-то куда-то не передается, наставь var_dump и найди где именно значение теряется. Также, включи отображение ошибок либо смотри логи, может там ошибки есть в коде. Что ты беспомощный такой.
И переписывание/копирование кода пользы не дает. Польза будет если ты MVC приложения напишешь сам от начала и до конца.
Например, решая задачу про список студентов.
Можно я иногда буду кидать тебе контроллеры, модели и так далее чтобы ты сказал, что там не так? С фреймворками имею небольшой опыт, так что у меня всё получится, хотелось бы только сделать всё по канонам. Поможешь советами?
Пыхопе говно, лучше Golang!
https://github.com/DmitryMachavariani/micro
И более того, нахуй код? Ты для начала апи своего фреймворка покажи, чтобы вообще понимать, нужно ли это писать.
>>519828
> Задание №1
Ок, хорошо, хоть ты и не сделал там бордер, но в общем сделано правильно.
> Задание №2:
Слишком много дивов и max-width, попробуй обойтись одним.
>>519874
Ошибка в том что у тебя несколько переменных заведено для одного и того же, и данные в них изменяются непаврильно.
$i — это что? Из названия понять невозможно.
$credit — это что?
Причем увеличиваешь ты одну переменную, а уменьшаешь другую. Для обозначения текущего долга должна быть ровно одна переменная.
Также, это никуда не годится:
> if ($payment==7777) {
> ..
> $payment++;
Что за костыли? Почему увеличивается payment на один? Почему число 7777 написано в программе 2 раза, а не один? Что это за ерунда? Если тебе надо в первый месяц прибавить эту сумму то просто прибавь ее к долгу перед циклом.
Также, пропусти код через phpformatter.com
>>519828
> Задание №1
Ок, хорошо, хоть ты и не сделал там бордер, но в общем сделано правильно.
> Задание №2:
Слишком много дивов и max-width, попробуй обойтись одним.
>>519874
Ошибка в том что у тебя несколько переменных заведено для одного и того же, и данные в них изменяются непаврильно.
$i — это что? Из названия понять невозможно.
$credit — это что?
Причем увеличиваешь ты одну переменную, а уменьшаешь другую. Для обозначения текущего долга должна быть ровно одна переменная.
Также, это никуда не годится:
> if ($payment==7777) {
> ..
> $payment++;
Что за костыли? Почему увеличивается payment на один? Почему число 7777 написано в программе 2 раза, а не один? Что это за ерунда? Если тебе надо в первый месяц прибавить эту сумму то просто прибавь ее к долгу перед циклом.
Также, пропусти код через phpformatter.com
Считает правильно. Хотя по моему тут нет особого смысла разбивать параметры на передаваемые в конструктор и функцию, проще наверно все передавать сразу в функцию.
> if ($this->payout <= $creditSum)
> else // $this->payout > $creditSum
Можно бы заменить if/else на min или max.
> // endwhile
Эти комментарии не требуются если ты соблюдаешь выравнивание кода и не делаешь огромных функций.
> echo '<pre>';
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
>>520012
Конечно, скидывай.
>>520014
Zend по моему старый. Это фреймворки разного уровня:
Yii2, lavarel — среднего уровня
Zend (который по моему сдает по популярности Symfony 2) — навороченные
Считает правильно. Хотя по моему тут нет особого смысла разбивать параметры на передаваемые в конструктор и функцию, проще наверно все передавать сразу в функцию.
> if ($this->payout <= $creditSum)
> else // $this->payout > $creditSum
Можно бы заменить if/else на min или max.
> // endwhile
Эти комментарии не требуются если ты соблюдаешь выравнивание кода и не делаешь огромных функций.
> echo '<pre>';
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
>>520012
Конечно, скидывай.
>>520014
Zend по моему старый. Это фреймворки разного уровня:
Yii2, lavarel — среднего уровня
Zend (который по моему сдает по популярности Symfony 2) — навороченные
>но зачем?
Ради интереса и практики, что ты как маленький. Никогда не пробовал что-то своё писать?
>>520319
>нахуй код?
Чтобы вы могли склонировать репозиторий и запустить у себя.
>Ты для начала апи своего фреймворка покажи
Во-первых, приставку микро я добавил не просто так. Во-вторых, какое ещё API у фреймворка?
В html кажется нет регистрочувствительности, значит кэмел кейс не очень уместен.
class="container-narrow"
class="containerNarrow"
class="container_narrow"
Как лучше? (имею ввиду общепринятые практики)
>Ошибка в том что у тебя несколько переменных заведено для одного и того же, и данные в них изменяются непаврильно.
>Причем увеличиваешь ты одну переменную, а уменьшаешь другую. Для обозначения текущего долга должна быть ровно одна переменная.
Не совсем понял. Я как бы сделал так пока происходит выплата кредита я каждый раз беру текущую сумму кредита прибавляю и процент и комиссию и записываю в $total, а потом просто вывожу $total. Когда Кредит полностью выплачивается, то цикл останавливается и $total тоже перестает увеличиваться.
>$i — это что? Из названия понять невозможно.
$credit — это что?
там было написанно $i=$credit, а $credit это сумма которую осталось выплатить анону, с каждой итерацией она уменьшалась постепенно уменьшалась и когда становилось меньше 0, то цикл заканчивался.
> if ($payment==7777) {
> ..
> $payment++;
>Также, пропусти код через phpformatter.com
http://ideone.com/7NQzEP
В общем смотри, что получилось, во втором банке вышло конечно не 61270, а 61268. Почему, хер его знает.
Сравни ответы со своими, правильно решил?
Поясните, зачем вычитать единичку, сам синтаксис и работа функций мне понятна, а вот все эти даты и прочее я никогда не понимал, даже по порядку месяцы не смогу назвать на память, ибо не обращаю на это внимание в жизни.
Есть задание: запилить одностраничный сайт с опросом, после прохождения которого выводится статистика по все ответам на опрос. Как делать? Я только страницу написал, как данные передадются, обрабаываются и выводятся (не цифрами, а графиками) вообще понятия не имею.
А если найдётся кто-то, кто объяснит как дауну, скину почту и тонны нефти
Если одностраничный, то здесь даже сессии не нужны. Человек выставляет чекбоксы и отправляет форму.
Php выводит в ответ html и графики с результатами, а также выдернутую из базы данных статистику.
Это элементарно, если ты не понимаешь как это работает, то нужно сначала выучить основы php и sql.
Делать за тебя это конечно никто бесплатно не будет. Так что прикрепляй почту и пиши бюджет, может кто и согласится.
>>520558 https://git-scm.com/book/ru/v1
Платят за PHP меньше, чем за Java. Но работ больше. Умрет вряд ли, слишком популярный, легкий в освоении, тулзов кучи и сайтов на нем уже много написано.
Мне кажется, что наоборот, хотели сказать что PHP не умрет.
Кун, который задавал первым вопрос.
Почему еще не в котле, свынья?
ОП, как появишься, посоветуй как правильно стилизировать поле для загрузки файла. Я полистал какие-то левые статьи, там советую фигню. В одном месте говорят тянуть jquery, в другом какие-то дикие пляски с псевдоэлементами типа ::after и ::before
Может есть какой-то универсальный и "правильный", т.е. наиболее оптимальный способ?
Прежде всего камнем преткновения является невозможность отредактировать текст на кнопке загрузки (или я читал устаревшие материалы?).
Поэтому предлагают кнопку вообще нафиг убрать, и вместо нее присобачить какие-то костыли.
Короче, мне нужна тупо круглая кнопочка с плюсиком в центре, а название подгруженного файла должно отображаться где-то в другом месте, в списке ниже например.
Через дефис, маленькими буквами:
menu-header
menu-item-active
Также тебе стоит почитать про именование в БЭМ: https://ru.bem.info/articles/bem-for-small-projects/ (только про именование, остальное по моему дурь: блоки и виджеты прекрасно делаются на серверном языке программирования вроде PHP без всяких BEM tree которые только все усложняют. Хотя с другой строны блоки на клиентских технологиях не привязаны к языку на сервере. Но мне они все равно не нравятся, выглядит как костыль какой-то).
>>520504
Лучше, но пока не достаточно хорошо.
> $total = $total + $credit × $percent + $comission;
> $credit = $credit + $credit × $percent + $comission;
это выражение аж 4 раза повторяется. Избавься от копипасты.
Число 39999 повторяется 6 раз, надо вынести его в переменную чтобы было удобно менять.
> getBalanceInFuture(39999, 0.04, 500, 0, 5000, 39999);
Почему ты передаешь число 39999 2 раза? Передавай один раз.
Что хранится в переменной total? Если это сумма выплаченная школьником то почему ее начальне знаечние 39999? Что это значит? Школьник в первый месяц заплатил 39999 сразу?
> Сравни ответы со своими,
Совпадения ответа недостаточно. Код должен быть понятен и логичен. Очевидно что в самом начале полная сумма выплат равна нулю.
>>520540
Вася родился в 2001 году. Сейчас 2015. Сколько Васе лет? Можно ли ответить на этот вопрос не зная день и месяц рождения?
Вычитать или не вычитать единичку надо в зависимости от того, был уже у Васи в этом году день рождения или еще нет, так как от этого зависит его возраст.
> RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)
Это как раз и есть костыльный способ сравнить день/месяц рождения с текущими. даты в MySQL выглядят как 2015-07-25 потому последние 5 цифр хранят месяц и день.
Через дефис, маленькими буквами:
menu-header
menu-item-active
Также тебе стоит почитать про именование в БЭМ: https://ru.bem.info/articles/bem-for-small-projects/ (только про именование, остальное по моему дурь: блоки и виджеты прекрасно делаются на серверном языке программирования вроде PHP без всяких BEM tree которые только все усложняют. Хотя с другой строны блоки на клиентских технологиях не привязаны к языку на сервере. Но мне они все равно не нравятся, выглядит как костыль какой-то).
>>520504
Лучше, но пока не достаточно хорошо.
> $total = $total + $credit × $percent + $comission;
> $credit = $credit + $credit × $percent + $comission;
это выражение аж 4 раза повторяется. Избавься от копипасты.
Число 39999 повторяется 6 раз, надо вынести его в переменную чтобы было удобно менять.
> getBalanceInFuture(39999, 0.04, 500, 0, 5000, 39999);
Почему ты передаешь число 39999 2 раза? Передавай один раз.
Что хранится в переменной total? Если это сумма выплаченная школьником то почему ее начальне знаечние 39999? Что это значит? Школьник в первый месяц заплатил 39999 сразу?
> Сравни ответы со своими,
Совпадения ответа недостаточно. Код должен быть понятен и логичен. Очевидно что в самом начале полная сумма выплат равна нулю.
>>520540
Вася родился в 2001 году. Сейчас 2015. Сколько Васе лет? Можно ли ответить на этот вопрос не зная день и месяц рождения?
Вычитать или не вычитать единичку надо в зависимости от того, был уже у Васи в этом году день рождения или еще нет, так как от этого зависит его возраст.
> RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)
Это как раз и есть костыльный способ сравнить день/месяц рождения с текущими. даты в MySQL выглядят как 2015-07-25 потому последние 5 цифр хранят месяц и день.
В общем, из того что я прочитал, мне больше всего понравился следующий способ:
1. Кнопку загрузки сделать прозрачной (именно opacity, а не display:none или visibility), чтобы она по прежнему оставалась рабочей.
2. А "под ней" отпозиционировать пустышечку кнопки той самой формы, цвета и текста, что нам нужны.
Как идея? Ну я пока так делаю, потом может кто-нибудь опытный нарисуется, прокомментирует это дело.
Тестовое задание (если это оно) должно проверять твои знания, а не наши. Устройство на работу это не контрольная в школе и от того даже если ты спишешь, ты справляться с рабочими обязанностями не сможешь.
>>520571
О смерти PHP говорят уже лет 10.
>>520613
И смерти виндоуз.
>>520647
Делаем поле прозрачным на 100% и под ним выводим все что угодно. Также, придется добавить яваскрипта чтобы выводить имя выбранного файла (не забудь проверить на очень длинных именах). Также, проверь свой CSS чтобы во всех браузерах невидимое поле выводилось ровно над нарисованным.
> говорят тянуть jquery
Можно и без jQUery, это всего лишь обертка над DOM. Разумеется JS и DOM надо знать. Но без них ты и jQUery не выучишь.
> в другом какие-то дикие пляски с псевдоэлементами типа ::after и ::before
У input нет содержимого и потому нет псевдоэлементов.
> Может есть какой-то универсальный и "правильный", т.е. наиболее оптимальный способ?
Мое имхо лучше вообще не стилизовать. Или брать хороший готовый плагин.
А так это бессмысленная трата времени + вреднестатистический «фронтенд специалист» это быдлокодер учившийся по видеокурсам и гарантированно в половине браузеров его виджет работать не будет.
Вот например статья: http://habrahabr.ru/post/189570/
Имей в виду что это:
> Поместить прозрачный input[type=file] внутрь элемента label,
> Использовать имитацию клика по скрытому input[type=file] средствами JavaScript.
Работает не везде и мне потому не нравится.
И вообще я не понимаю, зачем его стилизовать?
> Ключевой задачей было поставлено создание «резинового» input[type=file]
Резиновость создается средствами CSS
Код разумеется копипастить из статьи не стоит. И код и верстку лучше сделать самому, чтобы добавиться более стабильной работы и большей кроссбраузерности. Также, мне кажется, стоит предусмотреть что-нибудь на случай отсустсвия яваскрипта.
Тестовое задание (если это оно) должно проверять твои знания, а не наши. Устройство на работу это не контрольная в школе и от того даже если ты спишешь, ты справляться с рабочими обязанностями не сможешь.
>>520571
О смерти PHP говорят уже лет 10.
>>520613
И смерти виндоуз.
>>520647
Делаем поле прозрачным на 100% и под ним выводим все что угодно. Также, придется добавить яваскрипта чтобы выводить имя выбранного файла (не забудь проверить на очень длинных именах). Также, проверь свой CSS чтобы во всех браузерах невидимое поле выводилось ровно над нарисованным.
> говорят тянуть jquery
Можно и без jQUery, это всего лишь обертка над DOM. Разумеется JS и DOM надо знать. Но без них ты и jQUery не выучишь.
> в другом какие-то дикие пляски с псевдоэлементами типа ::after и ::before
У input нет содержимого и потому нет псевдоэлементов.
> Может есть какой-то универсальный и "правильный", т.е. наиболее оптимальный способ?
Мое имхо лучше вообще не стилизовать. Или брать хороший готовый плагин.
А так это бессмысленная трата времени + вреднестатистический «фронтенд специалист» это быдлокодер учившийся по видеокурсам и гарантированно в половине браузеров его виджет работать не будет.
Вот например статья: http://habrahabr.ru/post/189570/
Имей в виду что это:
> Поместить прозрачный input[type=file] внутрь элемента label,
> Использовать имитацию клика по скрытому input[type=file] средствами JavaScript.
Работает не везде и мне потому не нравится.
И вообще я не понимаю, зачем его стилизовать?
> Ключевой задачей было поставлено создание «резинового» input[type=file]
Резиновость создается средствами CSS
Код разумеется копипастить из статьи не стоит. И код и верстку лучше сделать самому, чтобы добавиться более стабильной работы и большей кроссбраузерности. Также, мне кажется, стоит предусмотреть что-нибудь на случай отсустсвия яваскрипта.
То есть при хорошем самообучении (у меня действительно есть большое желание PHP изучать и мне это нравится) я могу в будущем рассчитывать на то, что найду заработок на этом или постоянную работу в офисе? Если взять хотя бы ближайшие лет 10.
И по какой причине?
>У input нет содержимого и потому нет псевдоэлементов.
А?
http://habrahabr.ru/post/255919/
>И вообще я не понимаю, зачем его стилизовать?
Ну блин дизайн такой нужен. Пикрелейтед.
Ну хорошо, я понял. Нужно только разобраться, как вывести название подгружаемого файла, желательно без js.
Найдешь, но платят PHPшникам стабильно меньше остальных языков. Гляди графики на пикрелейтед, по всем странам PHP программеры самые нищенки из всех.
В деньгах потеря не в разы. Зато нравится. По-моему это неплохо.
Ты в скольки браузерах проверил? Это странная особенность вебкита а не стандарт.
В стандарте явно это не написано:
http://www.w3.org/TR/css-pseudo-4/#treelike
> When their computed content value is not none, these pseudo-elements generate boxes as if they were immediate children of their originating element
Но у элементов вроде input нет детей и потому не может быть псевдоэлементов.
> Нужно только разобраться, как вывести название подгружаемого файла, желательно без js.
Без JS никак
Какое нам дело до USA? Мы не в США живем. Также, графики не учитывают уровень типа джуниор/сениор и компанию.
Тут например http://hh.ru/search/vacancy?text=php&clusters=true&enable_snippets=true первая вакансия от 120 000
Плюс, число вакансий на PHP гораздо больше, особенно без опыта.
ну и никто не запрещает тебе вкатиться в отрасль PHP программистом а потом учить любые другие языки, почему нет?
Не только
>>520748
График недостоверный. На ноде нельзя написать ничего сербезного, с чего бы за нее стали больше платить чем за другие языки? Это наверно 3 хипстерские вакансии на всю страну, по которым судить нельзя.
Ну и вообще, так как на PHP гораздо больше вакансий то понятно что среднее будет меньше. Так как на ноде среднее берется из 3 хипстерских вакансий в Москве, а на PHP среднее из хороших московских вакансий и вакансии натягивателя шаблонов в Урюпинске.
Это явно непраивльные графики. Хорошо оплачиваются и востребованы C#, Java, PHP. Недоязыки вроде ноды никому не нужны, ты много знаешь банков где софт на ноде рабоатет?
Вот подтверждение про востребованность явы:
http://habrahabr.ru/company/changellenge/blog/196664/
> Java Школа была создана для того, чтобы обучить талантливых кандидатов языку Java практически с азов, а затем растить их внутри Центра Разработки Дойче Банка как профессионалов.
> Во время обучения каждый студент получает заработную плату в размере 100 тысяч рублей.
для ноды есть аналогичные возможности обучения? Нет и никогда не будет потому что ничего сложнее чатика на ней написать нельзя. А на Яве можно.
Ну благо долбоебов-снобов с предрассудками немного и они обычно никакого успеха в IT-сфере не достигают. Так что думаю их мнением можно пренебречь и пойти работать в нормальные фирмы.
Например, у меня есть стили вида
.class1 {
height: 100px;
width: 400px;
background: linear-gradient ....... // здесь десяток строк с кроссбраузерным градиентом
}
.class2 {
height: 20px;
width: 50px;
// снова те же градиенты
}
Вынести ли в одно место общий код, или строго писать полный набор правил для каждого конкретного объекта?
Учи LESS. Переменные и миксины позволяют использовать одни и те же куски кода по много раз. Просто один раз пишешь кусок кода, а потом ставишь в стилях ссылку на этот кусок.
В отдельный класс вынеси, потом всем элементам его назначай и твои отдельные вдобавок.
Подробнее прочитал про ЛЕСС - параша. Нужна лишь в разработке.
Не плохо бы было юзать его в готовом проекте, вносить правки, например.
Лучше фронтенд-разработчиком/дизайнером быть, чем пхп-макакой, денег больше будет. Да и работка творческая.
В общем такие дела ребят.
Пененес для теста парочку не совсем глобальных настроек в куки. Теперь планирую подогнать туда все аналогичные временные настрйоки. Ну например те же самые сортировки. Что бы пользователь мог насортировать себе странички как угодно, и все это дело бы там лежало. Поисковый запрос я туда не буду выносить, пусть живет в get и обнуляется при любом перезаходе.
Теперь вопрос следующий. Например у меня будет большая кучка настроек. В принципе мне удобно, для каждого конкретного места проверять свою конкретную куку, и её же менять. Но зато в браузере будет иметься куча разных кукисов вида:
name: hide_user, value: yes
Не то что бы всё это должно быть зашифровано, просто хотелось бы передать туда какой-массив, что бы все лежало компактно.
Пока что планирую написать пару функций, в которую буду передвать нужное значение куки, она будет добавлять её в массив настроек и с помощью serialize будет его туда упаковывать и ставить пользователю. Ну так же и обратное. Когда надо будет узнать какая настройка стоит у пользователя. Будет спрашивать куки, userialize-ить её, копаться в массиве с настройками, и отдавать их контроллеру.
Просто это выглядит слишком громоздко как-то, и немного костыльно.
У тебя так получатся очень жирные куки, ОП этого не одобрит. Хочешь использовать куки, можешь пихать в неё строку-последовательность цифр, где положение в строке означает настройку, а сама цифра представляет значение этой настройки.
Прошу помощи с опечаточником, все остальные задачи сделал, а на этой встал и не понимаю, где ошибка.
PHP Parse error: syntax error, unexpected ')', expecting ';' in /home/f6absi/prog.php on line 11
Использовал только 2 джойна и группировку. Только не допёр, как подсчитать взаимные лайки через COUNT(), поэтому использовал SUM().
С картинкой все ясно, но что делать с цифрами сбоку?
Суть такова: если менять стили яваскриптом напрямик, то они побеждают hover. Онклик такого яваскрипта сильнее ховера от css.
А вот если написать функцию, которая добавляет класс со стилями, то стили прописанные в ховер почему-то сильнее.
Не могу внятно выразить мысль, так что накидал небольшой пример: http://jsfiddle.net/8jx5bpt0/
Объясните, почему так происходит? И чем по-сути является срабатывание hover? Это как я понимаю намертво встроенный в браузер скрипт? Почему тогда в css нет других событий типа onclick или onmouseover?
Также, как и в любой другой сфере после 40. Ты либо создаешь себе "имя", либо становишься мамкиным начальником. Иначе будешь обычным хуем 40летним, как и в любой другой сфере.
Впрочем, если тебе 20-30, загадывать что будет через 10 лет - полная хуйня. Всё очень быстро меняется сейчас.
>> Задание №2:
>Слишком много дивов и max-width, попробуй обойтись одним.
Ещё более лучшее задание №2: http://jsfiddle.net/84v309mb/
Задание №3: http://jsfiddle.net/a98mcd5z/
Задание №4: http://jsfiddle.net/yvr7hj3j/
Задание №5: http://jsfiddle.net/2xjouzwn/
Буду очень благодарен.
Серьезно? Мне надо что бы куки были после дешифровки стройным массивом, понимаешь? В массиве у меня могут быть значения как угодно выстроены. А если я буду строку использовать как куки, то надо будет её дербанить, что бы привести к общему виду. В общем понимаешь? Алсо я тут посмотрел, куки вообще получаются небольшие. Даже если я добавлю больше настроек чем пока ожидаю.
http://ideone.com/mFs0tl
Ну вот, получается строка хорошо если пол килобайта. В куки вроде бы до 4х спокойно может лежать.
Задание №6: http://jsfiddle.net/j5741y6e/
Задание №7: http://jsfiddle.net/u0rjy061/
Задание №8: http://jsfiddle.net/Lcvzv2rt/
Задание №9: http://jsfiddle.net/y38g3apr/ (до меня так и не дошло, как сделать так, чтобы текст не обтекал левый блок, а шёл отдельной колонкой)
Неделю читал учебник по JS, родил ответы на комментарии по клику и вообще доделал древовидные комменты. Сейчас еще почитаю учебник и переделаю чтоб форма ответа появлялась под комментом на который отвечаешь.
Есть вопрос по самому файлообменнику, что там не так, что еще допиливать нужно.
И ничего не происходит. Просто бесконечно открывается эта ссылка, без всяких ошибок. Слушалку дебаггера включаю, настроено по-моему все верно.Ставил xdebug на убунту с помощью apt-get install
В прошлом треде анончик решил задачу по списку студентов. Хочется посмотреть что у него получилось.
Не совсем понимаю как подключить его базу данных studentBackup.sql
Все файлы из github кинул в Apache25\htdocks. Установлен по инструкции Apache, PHP, Mysql, этого достаточно чтобы запустить его список студентов, или что то еще надо?
Нет ли возможности так же отлаживать программы для php? Я пробовал ставить какие то точки останова, но пошаговой трассировки так и не смог достичь.
Windows.
дело в том, что я тыкаю дебаг, открывается автоматические браузер, и сторм пытается бесконечно присоединиться к сессии.
Юзай netbeans, в нем включи php - debugging - port 9000, session id netbeans-xdebug. В php.ini включи xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
xdebug.remote_port=9000.
Поставь расширение xdebug helper в chrome и включи в нем в настройках интеграцию с netbeans. Все работает тогда.
но я привык к сторму
Я спросил тебя прочел ли ты документацию и разобрался ли как работает xdebug? Это не такая штука которую достаточно поставить и она работает. Она должна успешно соединиться с IDE и если у тебя например сервер в виртуалке то разумется соединиться изнутри с хостом может быть невозможно.
Напиши какая у тебя ОС, где установлен Апач и тд. Без этой информации тебе никто не поможет, телепатов тут нет.
>>521552
Нет. Юзать надо документацию в первую очередь.
>>521542
Тут куча людей которые делают список студентов, ты про какой говоришь? Там обычно надо:
- создать базу данных
- закачать в нее дамп (например консольной командой mysql -uusername -p database_name < dump.sql , вот гайд по консоли: https://gist.github.com/codedokode/10539213 )
- найти конфиг и вписать туда свои реквизиты доступа к БД
- включить отображение ошибок в PHP, display_errors
- если используется композер (если есть файл composer.json), то установить его, открыть консоль, перейти в папку с проектом и сделать composer install
- открыть сайт в браузере и посмотреть есть ли ошибки, если есть то исправить
Нельзя делать unserialize с данными полученными от пользователя, это небезопасно, так как позволяет вызывать деструкторы с произволно заполненными полями и может скрывать в себе другие уязвимости.
Вместо нее безопасно использовать json_decode.
У меня все хорошо, прочитал о xdebug и сразу же все через 10 минут заработало. Проблемы у другого анончика, он как я понял на linux сидит и у него phpstrom, а не Netbeans.
Ховер это не явскрипт. Это псевдокласс CSS. При наведении мыши на элемент к нему применяются дополнительно свойства, описанные в селекторе с псевдоклассом hover.
То есть если есть стили
.element { ... }
.element:hover { .. }
То второе правило по умолчанию отключено и включается только при наведении мыши на любой элемент с классом element.
Подробнее: http://htmlbook.ru/css/hover
:hover можно применять в сочетании с другими правилами, например:
tr:hover td .some-class { ... }
> если менять стили яваскриптом напрямик, то они побеждают hover. Онклик такого яваскрипта сильнее ховера от css.
Потому что правила в атрибуте style имеют больший приоритет чем описанные в CSS файле. Почитай про приоритеты селекторов:
http://www.quizful.net/post/specificity-of-css-selectors
http://htmlbook.ru/samcss/kaskadirovanie
http://habrahabr.ru/post/137588/
У нас в ОП посте есть задания на HTML/CSS которые помогут тебе углубить знания по этой теме. Я бы советовал их пройти (а может и наши задачи по JS) так как вижу что у тебя тут есть непонимание.
Ещё я думаю, что если во втором джойне исключить повторяющиеся пары, то взаимные лайки можно подсчитать и через COUNT(). Правда, как это реализовать -- не знаю.
Эти цифры прописаны в атрибутах. Тебе надо как-то сделать чтобы они отображались на странице. Для этого тебе нужен «сгенерированный контент», то есть элементы которые создаются с помощью css-правил. В CSS для этого есть псевдоэлементы, например ::before и ::after
http://habrahabr.ru/post/154319/
http://htmlbook.ru/css3/after
http://htmlbook.ru/css3/before
http://css.yoksel.ru/content/ (эта статья подробно описывает что можно вписать в свойство content)
Помни что у псевдоэлементов есть подвохи:
- они не выделяются и не копируются в буфер обмена в некоторых браузерах
- они могут не читаться программами чтения текста
- их нету у одиночных элементов вроде img, input
> AND l2.userLiked = l1.userLiker
А это нужно? Там ведь стоят условия джойна:
> ON u.id = l1.userLiker
> ON u.id = l2.userLiked
которые делают то же самое.
А вообще, молодец, правильно решил, надеюсь что джойны ты теперь понимаешь и можешь писать с закрытыми глазами. Многие запросы так и реализуются — ты просто джойнишь все участвующие таблицы и отсеиваешь лишнее через WHERE.
А еще, ты хочешь получше SQL изучить? У меня есть задачка про борду (кстати хорошая задача для собеседоваия — жаль что таких не дают, она 99.9% кандидатов отсеивает):
- сделай базу для анонимного форума, форум состоит из тредов, треды из постов, пост состоит из id, даты и текста. Сделай вывод первых N тредов, каждый тред выводится как ОП пост + 3 последних поста если они есть. Сначала надо решить задачу на идельной нормализованной базе (запрос получается адски сложный), потом предложить способы денормализации (хранения избыточных данных) чтобы максимально упростить запрос, избавиться от кучи джойнов и заставить его использовать индексы.
Пиханы, хелп.
Пытаюсь заставить загрузчик загружать помимо трёх типов картинок ещё и видео тип webm, но при попытке загрузки выскакивает ошибка "Не удалось прочитать размер файла"..
В чём трабла?
<?php
// Менеджер загрузок
if (isset($_FILES['file'])) {
if ($_FILES['file']['name'] != "") {
validateFileUpload();
if (!is_file($_FILES['file']['tmp_name']) || !is_readable($_FILES['file']['tmp_name'])) {
fancyDie("Файл не передался. Повторите попытку.");
}
$post['file_original'] = substr(htmlentities($_FILES['file']['name'], ENT_QUOTES), 0, 50);
$post['file_hex'] = md5_file($_FILES['file']['tmp_name']);
$post['file_size'] = $_FILES['file']['size'];
$post['file_size_formatted'] = convertBytes($post['file_size']);
$file_type = strtolower(preg_replace('/.*(\..+)/', '\1', $_FILES['file']['name']));
if ($file_type == '.jpeg') { $file_type = '.jpg'; }
$file_name = time() . mt_rand(1, 99);
$post['thumb'] = $file_name . "s" . $file_type;
$post['file'] = $file_name . $file_type;
$thumb_location = "db/" . $post['thumb'];
$file_location = "db/" . $post['file'];
if (!($file_type == '.jpg' || $file_type == '.gif' || $file_type == '.png' || $file_type == '.webm')) {
fancyDie("Допустимые форматы: GIF, JPG, PNG, WEBM.");
}
if (!@getimagesize($_FILES['file']['tmp_name'])) {
fancyDie("Не удалось прочитать размер файла. Повторите попытку.");
}
$file_info = getimagesize($_FILES['file']['tmp_name']);
$file_mime = $file_info['mime'];
if (!($file_mime == "image/jpeg" || $file_mime == "image/gif" || $file_mime == "image/png"|| $file_mime == "video/webm")) {
fancyDie("Допустимые форматы: GIF, JPG, PNG, WEBM.");
}
checkDuplicateImage($post['file_hex']);
if (!move_uploaded_file($_FILES['file']['tmp_name'], $file_location)) {
fancyDie("Не удалось сохранить загруженный файл.");
}
if ($_FILES['file']['size'] != filesize($file_location)) {
fancyDie("Файл не загружен. Вернитесь и попробуйте снова.");
}
$post['image_width'] = $file_info[0]; $post['image_height'] = $file_info[1];
list($thumb_maxwidth, $thumb_maxheight) = thumbnailDimensions(
$post['image_width'], $post['image_height'], $post['parent'] != '0'
);
if (!createThumbnail($file_location, $thumb_location, $thumb_maxwidth, $thumb_maxheight)) {
fancyDie("Could not create thumbnail.");
}
$thumb_info = getimagesize($thumb_location);
$post['thumb_width'] = $thumb_info[0]; $post['thumb_height'] = $thumb_info[1];
}
}
if (!CLAIRE_TEXTMODE) {
if ($post['file'] == '') {
// No file uploaded
if ($post['parent'] == '0') {
fancyDie("Для создания треда нужно прикрепить картинку.");}}}
if (str_replace('<br>', '', $post['message']) == "") {
fancyDie("Вы не ввели сообщение поста.");
}
$post['id'] = insertPost($post);
$redirect = '?do=thread&id=' . ($post['parent']=='0' ? $post['id'] : $post['parent']) . '#'. $post['id'];
trimThreads();
if ($post['parent'] != '0' && $bump) bumpThreadByID($post['parent']);
}
?>
Пиханы, хелп.
Пытаюсь заставить загрузчик загружать помимо трёх типов картинок ещё и видео тип webm, но при попытке загрузки выскакивает ошибка "Не удалось прочитать размер файла"..
В чём трабла?
<?php
// Менеджер загрузок
if (isset($_FILES['file'])) {
if ($_FILES['file']['name'] != "") {
validateFileUpload();
if (!is_file($_FILES['file']['tmp_name']) || !is_readable($_FILES['file']['tmp_name'])) {
fancyDie("Файл не передался. Повторите попытку.");
}
$post['file_original'] = substr(htmlentities($_FILES['file']['name'], ENT_QUOTES), 0, 50);
$post['file_hex'] = md5_file($_FILES['file']['tmp_name']);
$post['file_size'] = $_FILES['file']['size'];
$post['file_size_formatted'] = convertBytes($post['file_size']);
$file_type = strtolower(preg_replace('/.*(\..+)/', '\1', $_FILES['file']['name']));
if ($file_type == '.jpeg') { $file_type = '.jpg'; }
$file_name = time() . mt_rand(1, 99);
$post['thumb'] = $file_name . "s" . $file_type;
$post['file'] = $file_name . $file_type;
$thumb_location = "db/" . $post['thumb'];
$file_location = "db/" . $post['file'];
if (!($file_type == '.jpg' || $file_type == '.gif' || $file_type == '.png' || $file_type == '.webm')) {
fancyDie("Допустимые форматы: GIF, JPG, PNG, WEBM.");
}
if (!@getimagesize($_FILES['file']['tmp_name'])) {
fancyDie("Не удалось прочитать размер файла. Повторите попытку.");
}
$file_info = getimagesize($_FILES['file']['tmp_name']);
$file_mime = $file_info['mime'];
if (!($file_mime == "image/jpeg" || $file_mime == "image/gif" || $file_mime == "image/png"|| $file_mime == "video/webm")) {
fancyDie("Допустимые форматы: GIF, JPG, PNG, WEBM.");
}
checkDuplicateImage($post['file_hex']);
if (!move_uploaded_file($_FILES['file']['tmp_name'], $file_location)) {
fancyDie("Не удалось сохранить загруженный файл.");
}
if ($_FILES['file']['size'] != filesize($file_location)) {
fancyDie("Файл не загружен. Вернитесь и попробуйте снова.");
}
$post['image_width'] = $file_info[0]; $post['image_height'] = $file_info[1];
list($thumb_maxwidth, $thumb_maxheight) = thumbnailDimensions(
$post['image_width'], $post['image_height'], $post['parent'] != '0'
);
if (!createThumbnail($file_location, $thumb_location, $thumb_maxwidth, $thumb_maxheight)) {
fancyDie("Could not create thumbnail.");
}
$thumb_info = getimagesize($thumb_location);
$post['thumb_width'] = $thumb_info[0]; $post['thumb_height'] = $thumb_info[1];
}
}
if (!CLAIRE_TEXTMODE) {
if ($post['file'] == '') {
// No file uploaded
if ($post['parent'] == '0') {
fancyDie("Для создания треда нужно прикрепить картинку.");}}}
if (str_replace('<br>', '', $post['message']) == "") {
fancyDie("Вы не ввели сообщение поста.");
}
$post['id'] = insertPost($post);
$redirect = '?do=thread&id=' . ($post['parent']=='0' ? $post['id'] : $post['parent']) . '#'. $post['id'];
trimThreads();
if ($post['parent'] != '0' && $bump) bumpThreadByID($post['parent']);
}
?>
> взаимные лайки можно подсчитать и через COUNT()
Это вряд ли, так как джойн делает полное декартово произведение. То есть если юзер поставил лайки a, b, c и получил от a, d, e то мы получаем все возможные их комбинации при джойне:
a a
a d
a e
b a
b d
b e
c a
c d
c e
Взаимный лайк тут (a a) и считать их удобнее через SUM.
Не могу не похвалить себя, какую я хорошую и развивающую задачу придумал. Простая, а так просто не решишь.
А ты скопировал код или написал сам? Если скопировал то вопросы лучше задавать его автору.
>>521606
Хороший — намного сложнее, сам подумай, у нас одна таблица и одна форма, а в хорошем магазине пара десятков таблиц и сложная админка. Объем работы намного больше (хотя знания полученные в ходе решения задачи и помогут в написании магазина. но магазин лучше писать на фреймворке вроде Yii или Symfony 2). Лучше не писать его с нуля, а взять любую готовую CMS коих десятки.
>А еще, ты хочешь получше SQL изучить? У меня есть задачка про борду (кстати хорошая задача для собеседоваия — жаль что таких не дают, она 99.9% кандидатов отсеивает):
Конечно хочу. Попробую решить, параллельно допиливая абитуриентов.
>Лучше не писать его с нуля, а взять любую готовую CMS коих десятки.
Посоветуй если можешь, если бы ты создавал инет-магазин какой cms выбрал бы?
>А ты скопировал код или написал сам? Если скопировал то вопросы лучше задавать его автору.
Ну с автором никак не связаться, да и это загрузчик от тиниборды, вроде, но оптимизированный.
В мое время была модной Simpla (платная) — у нее админка красивая. Но вообще у меня опыта в создании ИМ нет, я не знаю например какие фичи нужны заказчикам и насколько их сложно/легко допиливать. На западе популярна Magento, которую по моему в Украине делают, Opencart (по моему это плагин к Друпалу, если так то представляю какой там код).
потому дам ссылки на рейтинги CMS — читай обзоры, смотри демоверсии, выбирай:
http://www.cmsmagazine.ru/catalogue/
http://www.ratingruneta.ru/cms/
>>521618
Тогда попробуй разобрать код построчно, например ты пишешь, что выводится ошибка. Посмотри в каком случае она выводится, почему, что к этому приводит. Наставь echo и var_dump чтобы увидеть что в переменных, может там что-то не то.
да, у меня phpstorm. проблему решил. я какого-то хрена создал run/debug configuration web application еще давно, и через него как раз скрипт пытался открыться в браузере. как только удалил нафиг все конфигурации - заработало. спасибо, чем-то ты даже натолкнул меня на мысль, упомянув, что у тебя браузер не открывается а дебажится все в консольке
У нас теперь есть строгая типизация, как во взрослых языках? Ну почти.
print_r($lol = arr());
function Arr(){
тут получение данных типа array
return $retval['data'];
}
Есть скрипт /admin/index.php
В нем форма авторизации. Если пользователь авторизировался, то инклудится /admin/vasya/admin.php
Суть вопроса: как заставить скрипт /admin/vasya/admin.php, не работать, при переходе по прямой ссылке на него?
НАЧААААЛЬНИК
Никак.
Можно сделать vasya длинным и рандомным, как пароль
$_SERVER['HTTP_REFERER']
В .htaccess в папке /admin/vasya добавить:
AuthType Basic
AuthName "restricted area"
AuthUserFile ./.htpasswd
require valid-user
В .htpasswd написать логин и пароль в такой форме vasya:dGRkPurkuWmW2
Благодарю!
Я еще новичок а в задаче такие требования будто я уже специалист и размяться зашел.
https://gist.github.com/codedokode/58ebc90bd006baf4b35c#Задание-11
Там есть подсказки, читал?
> подсказка: http://habrahabr.ru/post/154719/
> подсказка: http://habrahabr.ru/post/105267/
Ты не можешь изменить форму радиокнопки но ты можешь ее поместить внутрь label и скрыть, и менять вид дива или спана рядом с ней.
Поясни пожалуйста глубже мне эту уязвимость? Я вижу максимум эррор, при попытке подсунуть в куку какой-нибудь бред.
Прочитай замечание в мануале для начала: http://php.net/manual/ru/function.unserialize.php
Далее можешь почитать статьи из гугла http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=php+unserialize+vuln
$data = mysqli_fetch_array($result);
do {
$title7=$data['title'];
$description7=$data['description'];
}
while($data = mysqli_fetch_array($result));
$result=mysqli_query($connect, "SELECT FROM articlesmain WHERE id=8");
$data = mysqli_fetch_array($result);
do {
$title8=$data['title'];
$description8=$data['description'];
}
while($data = mysqli_fetch_array($result));
$parse->set_tpl('{TITLE6}',$title6); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION6}',$description6);
$parse->set_tpl('{TITLE7}',$title7); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION7}',$description7);
$parse->set_tpl('{TITLE8}',$title8); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION8}',$description8);
$parse->tpl_parse(); //Парсим
Господа, как это можно автоматизировать? Оно у меня потом в шаблон парситься, там особая структура, ее нельзя нарушать, поэтому просто %s не подходит. Пробовал for, но выводит только последнюю строку.
$data = mysqli_fetch_array($result);
do {
$title7=$data['title'];
$description7=$data['description'];
}
while($data = mysqli_fetch_array($result));
$result=mysqli_query($connect, "SELECT FROM articlesmain WHERE id=8");
$data = mysqli_fetch_array($result);
do {
$title8=$data['title'];
$description8=$data['description'];
}
while($data = mysqli_fetch_array($result));
$parse->set_tpl('{TITLE6}',$title6); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION6}',$description6);
$parse->set_tpl('{TITLE7}',$title7); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION7}',$description7);
$parse->set_tpl('{TITLE8}',$title8); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION8}',$description8);
$parse->tpl_parse(); //Парсим
Господа, как это можно автоматизировать? Оно у меня потом в шаблон парситься, там особая структура, ее нельзя нарушать, поэтому просто %s не подходит. Пробовал for, но выводит только последнюю строку.
а в чем бесполезность? можно ведь обернуть в обертку и создать мобильное приложение
Без них ты будешь javascript и css писать вручную, выйдет по объему сильно больше, читается хуже. Разбираться через год тебе будет в коде, написанном под фреймворк проще.
Мне не надо освоить язык программирования?
>дополню
А вот всякий раз когда мне показывают готовое решения, то у меня появляется мысль " Почему я так не додумался, это же так просто"
>мне не дано
Именно что не дано. Это не язык программирования, а беспорядочное нагромождение костылей.
>вроде все выучил до этого и багаж знаний есть
Не делай так больше.
<?
define('PATH_LOG', 'path.log');
$dt = time();
$page = $_SERVER['REQUEST_URI'];
$ref = pathinfo($_SERVER['HTTP_REFERER'], PATHINFO_BASENAME);
$path = "$dt|$page|$ref\n";
$handle = fopen('log/' . PATH_LOG, "a+") or die("Не могу открыть файл!");
fputs($handle, $path);
fclose($handle);
Выдает:
Warning: fopen(log/path.log): failed to open stream: No such file or directory in C:\Users\Public\OpenServer\OpenServer\domains\mysite2.local\inc\log.inc.php on line 6
Попробовал создать в директории папку через mkdir, все окей, тобишь с правами все в порядке. Нехуя не понимаю тогда.
ну, то есть этот код в index.php и должен если папки log и файла path.log нет, сам их создать.
Пост: http://m.habrahabr.ru/post/263703/
Изучайте, пока не прикрыли, если кому любопытно. Хотя это скорее сборник антипаттернов, как писать не надо (такой большой проект сделан в виде кучи процедурной лапши).
Оп, а почему ты все время постишь ссылку на m.habrhabr.ru? Не удобно этот вырвиглаз с пэка читать.
Задай вопрос в треде, если что-то непонятно, ОП придет и ответит. если ты начинающий, то вполне нормально что что-то тебе неочевидно, тем более что в больших задачах там не всегда есть подсказки как решать.
>>521957
Папка не создается автоматически, только сам файл. Если папки log нет то будет ошибка.
>>521958
Нет, создается только файл а не папка.
>>522001
Если тут https://tech.yandex.ru/ нет то значит нет.
Я привык читать мобильную версию так как на ней меньше лишнего и нет этих дурацких блоков ссылок сбоку и дурацкой панели слева. Но ты прав, у других людей могут быть другие предпочтения, наверно лучше постить обычную ссылку.
Статья: https://news.ycombinator.com/item?id=9954686
http://www.npr.org/sections/alltechconsidered/2015/07/27/426613020/major-flaw-in-android-phones-would-let-hackers-in-with-just-a-text
Там правда классы есть, только как-то очень беспорядочно накиданы: https://github.com/veryEvilMan/fl-ru-damp/tree/master/classes
Как видите чтобы не запутаться, автору пришлось в комментарии описать структуру массива с данными. В случае использования класса описывать ничего не надо, так как поля класса описаны в коде.
Еще и переменную назвали бессмысленно: $info.
Кстати, те, аноны, кто учатся в нашем треде и делают задание на студентов, используют именно ООП-подход, как в лучших домах фреймворках.
Ну и дополню, в случае использования ORM библиотеки Doctrine 2 им бы не пришлось вообще писать функци и insert/update — доктрина предоставляет готовые функции для этого.
ОП, а в больших проектах используют вообще фреймворки и всякие ОРМ библиотеки, или все с нуля пишется для оптимизации под себя и все такое?
Большой проект не всегда значит highload, а значит большой по объему. Потому использование фреймворка как правило оправданно. Ну вот возьмем тот же сайт фриланс.ру. Можно ли считать его высоконагруженным? Я считаю, что не очень.
Если погуглить, то мы видим такие данные: https://roem.ru/29-03-2013/117912/molodye-frilans-birji-upustili-shans-vo-vremya-krizisa-free-lanceru/
Там 76 000 человек в день (в 2013 году), допустим сейчас их стало 150 000, допустим каждый в среднем просматривает 20 страниц, тогда это выходит около 3 млн запросов в день. Один сервер такое может и потянуть, наверно у них их несколько, но это еще не такая посещаемость, когда тебе приходится шардить базу (ну и судя по их коду шардинга у них нет).
Ну и любой проект не становится высоконагруженным за один день, обычно проходят годы. Если ты не пишешь игру или приложение для соцсети которую планируется активно раскручивать, то фреймворк поможет сэкономить тебе кучу времени на планирование архитектуры и написание кода.
Так, я видел примеры когда проект изначально писался на фреймворке, а потом был аккуратно перенесен на более простой движок, заточенный под этот проект. Также видел много примеров самописных движков и практически всегда они были ужасны.
Потому начинать все же стоит с фреймворка. Просто надо разобраться какие там есть возможности для оптимизации кода, в той же доктрине их немало.
Хотелось бы вместо разговоров увидеть тесты. Кто-нибудь хочет потестировать доктрину в сравнении с чистыми запросами?
в не функциональности. сам по суди, человеку нужен сайт для продажи товара, что он выберет уродливый и криво сверстанный сайт с админкой, каталогом и бд или красивенький чисто информационный лэндинг со стразиками? конечно первое.
фл.ру еще та параша. прям глаза открыл тоже мне.
Без випов на заказ даже заявку не подать, випы для ньюфани грабительские, личку с заказчиками прикрыли. на фл.ру происходит полный беспредел. может собраться и норм биржу сделать?
А зарабатывать на хлеб себе на чем будешь, няша, если не на про аккаунтах?
В принципе платить за размещение или получение заказа нормально. Но вот платить за возможность может быть получить, а может не получить заказ — это нехорошо.
День добрый, есть ли что-то подобное learn.javascript.ru по CSS или HTML, с чего начать, умею только в питон немного, но это пока что хобби, хочу начать фрилансить, яваскрипт, думаю, быстро освою, а вот вёрстка это же не программирование, поэтому реквестирую что-то, что поможет мне поднять знания подставове.
MVC заключается в том что мы не смешиваем все в кучу, а разбиваем на 3 части. Контроллер зарашивает данные у модели и передает их вью для вывода. Попробуй написать код задачи про студентов и посмотрим его насколько он соответствует MVC.
Ага, увидел, не открывал эту ссылку ибо написано "задачки", а на самом деле там много другой инфы, помимо самих задачек. Спасибо.
Все нормальные биржи берут процент с выполненных заказов с заказчика - этим и зарабатывают.
а оплата же через биржу начисляется.
я это понимаю, хоть ты и повторяешь как попугай одно и то же, я не понимаю принцип ООП в МВК, пальчиками перепечатать пример, чтобы работало я могу, а вот изменения или правка мне не даются, ибо не понимаю принципа.
Пиши с нуля, а не перепечатывай примеры. Напиши напрмер 20 строчек для задачи про студентов и спроси, все ли верно и как сделать лучше.
А зачем знать сумму сделки? Тот же moneybookers берет за вывод на карту и перевод 3 доллара 85 центов, с этого и живет.
Понятное дело у биржи фрилансеров транзакций будет меньше чем у платежной системы, ну так можно брать за 1 сделку больше.
Хех, всегда знал, что идея привязки аутентификации на сайтах к сотовому говно. Теперь это начало подтверждаться.
Если я с нуля напишу, то это уже будет не совсем МВК и ООП. Вот я сейчас так свой проект пишу, пока что даже не знаю, как через шаблон добавлять новые статьи и осуществить пагинацию, сделал вывод 8 статей на странице и усе. потом покажу.
Я устроился джуном на внезапно ПИТОН через 3 недели после прохождения кодеакадеми. Увидел вакансию со стажировочкой и обучением, прислали задание калькулятор кредитов на sinatra, потратил пару вечерков на изучение синатры, написал калькулятор, отправил вместе с резюме.
2 месяца практики, потом взяли джуном. ДС 40к зарплата
Блядь, на руби. Фикс. Просто питонотред читал, совсем мозги скомкались, пойду пожру.
Пробовал удаленно - одни отказы, уже не пробую. Простой сайт с админкой и бд могу написать, что там еще можно уметь? фреймворки еще не учил.
Еще нет, но я не думаю, что они сложные. Любая инфа гуглится в два счета.
Пол-года учил верстку и фронтенд, потом напейсал свою мини-борду, ща новостной сайт делаю, плюс копирайтю и фильмы смотрю, а шо?
1. Так делать не стоит?
2. Сейчас начал учить YII там так не прокатит?
1) да, не стоит. Во-первых в твоей базе потом хрен разберешься, во-вторых нет гарантий целостности ссылок и со временм копятся ссылки на несуществующие записи.
Я вообще не понимаю какая выгода от не использования ключей? Никакой. Так делают только неучи которым лень потратить 30 минут на изучение темы и которые спешат быстрее быдлокодить.
Ссылка http://denis.in.ua/foreign-keys-in-mysql.htm
2) Смотри пункт 1
https://github.com/V3N0m21/Uppu3
Доделал чтоб форма ответа открывалась под комментом, пол дня голову ломал чтоб понять как это правильно сделать. Пока что выглядит не оче, но потом дизайн допилю.
ОП, посмотри что у меня там вообще и что нужно переделать
но многие требуют знание этой хрени.
\tdisplay:none;
}
Пытаюсь скрыть радиокнопку но этот ксс не помогает, в чем причина?
Прежде всего хочу поблагодарить ОПа и всех причастных за запиливание задачек, получил хоть какой-то вектор в обучении.
Задание номер 10:
https://jsfiddle.net/zn8w7yo3/
На форматировании внимания не акцентировал, так как заелся с висящими примечаниями, конкретно с их правильным позиционированием. Повторить вроде удалось, но решение очень хрупкое, изменения ширины не выдержит. Что я делаю не так?
В доке http://framework.zend.com/manual/2.0/en/modules/zend.service-manager.intro.html на первой строчке написано:
> The Service Locator design pattern is implemented by the ServiceManager
Registry это более примитивная штука, которая только отдает то что в нее положено и как правило делается статически:
Registry::set('x', new X());
$x = Regsitry::get('x');
А ServiceLocator умеет создавать или доставать объекты-сервисы по заранее настроенным правилам.
О, спасибо, не видел. А чому там не Dependency Injection? Программеры у Zenda не осилили, или там в этом качестве только Service Locator подходит?
DI там ты делаешь ручками в фабрике или коллбеке. Вот еще есть на русском статья: http://habrahabr.ru/post/241471/
Мне что-то не особо нравится, как-то они перемудрили по моему, посмотри лучше как в Symfony DI Container сделан если хочешь хороший пример (его можно использовать и отдельно от самой симфони).
Хотя DI в ZF вроде бы тоже есть: http://framework.zend.com/manual/2.3/en/modules/zend.di.introduction.html
Все, понял. В Zend\DI выходит не сам DI (его ручками пишут для всех нужных классов), а какой-то умный DI Container, который в код смотрит, все DI находит и сам где надо классы инициализирует и injection делает.
Пытаюсь сделать из дива кнопку.
Вот как раз и решаю. Сделал радиокнопку с лейблом. Уже все работает кроме того, что див не меняется после нажатия на него. При наведении и клипе сделал изменения.
Ну во первых надо проверить, нажимаются ли у тебя кнопки. Если у тебя стоит дисплей:нон, поставь отображение кнопок и посмотри нажимаются ли они. Если да, то остается дело за малым, добавить нужное свойство селектору с псевдоклассом :checked
Да, работает. нон с дисплея кнопок убрал. Вот как все выглядит.
:checked на что вешать? На див? Если на него, то у меня не работает. Если на радиокнопку то работает, но вокруг кнопки а не дива и если дисплей нон на кнопку вернуть то ничего не видно.
Кури "селекторы и их комбинации": http://htmlbook.ru/css
Твоя задача легко решается, но только если инпут поставить перед дивом и поставить правильный селектор, связав input:checked и div.
Спасибо, решил. Вот только не понял пока почему не сработало то же самое, но в обратном порядке.
Потому-что селектор + применяет правила ко второму элементу, а не первому. То есть в div + input правило будет применяться к input, а не див, значит если мы хотим, чтобы правило применялось к диву, нужно сперва, чтобы див шел после инпута в хтмл коде, а потом нужно сделать селектор iput+div
Все понятно стало, спасибо.
Либо засунуть в нее чекбокс + css3 либо яваскриптом при клике делать toggleClass (добавлять/убирать CSS класс).
>>522722
> :checked на что вешать? На див?
:checked относится только к радиокнопкам и чебоксам. Ты пробовал посмотреть его описание например тут: http://htmlbook.ru/css/checked ? Там в самом начале написано:
> Псевдокласс :checked применяется к элементам интерфейса, таким как переключатели (checkbox) и флажки (radio), когда они находятся в положение «включено».
Также, ты читал внимательно статьи на которые тебе я давал ссылки? В CSS есть такие селекторы как + и ~ (поддерживается в меньшем числе браузеров). Изучи эти селекторы.
Соответственно идея примерно такая, делаем такое дерево DOM:
div.switch
....label // чтобы ловить клики по всей области кнопки
........input type=radio // сам инпут
........span.switch-body // сама кнопка, которая содержит текст и меняет цвет
После чего остается лишь написать правило вроде
.switch input:checked + .switch-body { выделить нажатую кнопку цветом }
Я вижу что у тебя явно не хватает знаний про селекторы CSS и про псевдоклассы. Изучай:
http://htmlbook.ru/css/cat/pseudoclass
http://htmlbook.ru/metki/selektory
http://htmlbook.ru/samcss/sosednie-selektory
https://learn.javascript.ru/css-selectors
Ну и сразу же предупрежу что не надо злоупотреблять сложными селекторами. 99% правил в твоем CSS должны состоять из одного-двух-трех классов разделенных пробелом или > .
Либо засунуть в нее чекбокс + css3 либо яваскриптом при клике делать toggleClass (добавлять/убирать CSS класс).
>>522722
> :checked на что вешать? На див?
:checked относится только к радиокнопкам и чебоксам. Ты пробовал посмотреть его описание например тут: http://htmlbook.ru/css/checked ? Там в самом начале написано:
> Псевдокласс :checked применяется к элементам интерфейса, таким как переключатели (checkbox) и флажки (radio), когда они находятся в положение «включено».
Также, ты читал внимательно статьи на которые тебе я давал ссылки? В CSS есть такие селекторы как + и ~ (поддерживается в меньшем числе браузеров). Изучи эти селекторы.
Соответственно идея примерно такая, делаем такое дерево DOM:
div.switch
....label // чтобы ловить клики по всей области кнопки
........input type=radio // сам инпут
........span.switch-body // сама кнопка, которая содержит текст и меняет цвет
После чего остается лишь написать правило вроде
.switch input:checked + .switch-body { выделить нажатую кнопку цветом }
Я вижу что у тебя явно не хватает знаний про селекторы CSS и про псевдоклассы. Изучай:
http://htmlbook.ru/css/cat/pseudoclass
http://htmlbook.ru/metki/selektory
http://htmlbook.ru/samcss/sosednie-selektory
https://learn.javascript.ru/css-selectors
Ну и сразу же предупрежу что не надо злоупотреблять сложными селекторами. 99% правил в твоем CSS должны состоять из одного-двух-трех классов разделенных пробелом или > .
Надо сделать нормальные имена классов, k и lk разумеется годятся для проверки но как решение не годятся. Имена лучше всего делать вида «блок-элемент», например:
.switch
.switch-body
.button-selector
.button-selector-label
В таком стиле.
Кстати судя по http://www.quirksmode.org/css/selectors/ селектор ~ поддерживается начиная с ИЕ7, раз так, твой код должен работать в максимально большом числе браузеров.
Так написано что в банках такое (обычно) не работает.
А вот новые сервисы, работающие с биткойнами, пока видимо ни про CSRF ни про смс-подтверждение не в курсе и в них эту уязвимость можно применить: https://news.ycombinator.com/item?id=9966123
Всегда защищайте ваши формы CSRF токенами. ну и читайте внимательно наши уроки.
У меня даже на убунту выдает почему-то "C:\fakepath\filename". Эта строка всегда такого вида вне зависимости от ос и браузера?
Подскажите, где смотреть такие моменты. Научите гуглить, короче.
Вот перешел на сайт w3.org, там в поиске вбил input file.
Попадаю на страницу http://www.w3.org/TR/html-markup/input.file.html
Так, тут есть раздел DOM Interface, и ссылка на http://www.w3.org/TR/2012/WD-html5-20121025/common-input-element-apis.html#dom-input-value
Нет, про value здесь говорится только в общих чертах. Но чуть ниже о свойстве filename (хотя я вообще-то всегда обращался для получения этой строки через "value", это неправильно?)
>On getting, it must return the string "C:\fakepath\" followed by the filename of the first file in the list of selected files, if any, or the empty string if the list is empty.
>Note: This "fakepath" requirement is a sad accident of history. See the example in the File Upload state section for more information.
По ссылке
>For historical reasons, the value IDL attribute prefixes the filename with the string "C:\fakepath\". Some legacy user agents actually included the full path (which was a security vulnerability). As a result of this, obtaining the filename from the value IDL attribute in a backwards-compatible way is non-trivial. The following function extracts the filename in a suitably compatible manner:
дают какую-то свою универсальную функцию
В целом почти сам разобрался. На всякий случай уточню, правильно ли я понял, что в современных браузерах всегда используется эта виндовая строка, которую можно спокойно сплитить по бекслешу? Можно ли использовать fileInput.value, или же предпочтительнее что-то другое, там в документации говорится о каком-то filename, я не понял, к какому вообще дом-объекту относится это свойство?
Конечно, я сильно сомневаюсь что это правда, так как эта задача не требует вообще ничего думать, профессиональный разработчик решит ее за минуту. В Гугле вряд ли бы стали давать задачу школьного уровня.
Но вы пока не профессиональные разработчики, почему бы не поломать голову? Вот задача:
- напишите функцию, переворачивающую бинарное дерево.
Дам пару пояснений. Во-первых, дерево это структура, состоящая из узлов, у каждого узла, кроме корневого, есть родитель:
https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
http://www.intuit.ru/studies/courses/648/504/lecture/11458
Вообще, структура из узлов, которые связаны друг с другом, называется граф. Дерево это частный стучай графа, в котором нет циклов и у каждого узла только один родитель.
С деревьями связано много интересных алгоритмов и задач:
http://algolist.manual.ru/ds/btree.php
http://algolist.manual.ru/ds/walk.php
Бинарное (двоичное) дерево — это дерево, у каждого узла которого может быть не более 2 детей. Их обычно называют «левый» и «правый» ребенок.
«Перевернуть» дерево значит пройтись по всем узлам в дереве и поменять местами «левого» и «правого» детей.
Узел дерева обычно содержит еще какие-то данные. Например, число, букву, строку, или что-нибудь еще. В данной задаче это значения не имеет, но если узлы с числами выстраивать в определенном (отсортированном порядке), мы получим упорядоченное дерево, в котором можно довлоьно быстро делать поиск. Именно упорядоченные двоичные деревья, например, используются в индексах базы данных для ускорения их поиска. Префиксные (не двоичные) деревья можно использовать для поиска слов с опечатками в словаре. Это я к тому что деревья важная штука и много где используются.
Для начала, вам, конечно, надо реализовать само дерево. Для этого в PHP надо сделать класс (любители массивов идут в какой-нибудь другой тред), который представляет один узел дерева. Из объектов такого класса можно будет построить дерево.
Потом надо будет придумать способ обхода всех узлов дерева. Для этого нужна либо рекурсивная функция, либо очередь, куда мы складываем новые найденные узлы, которые планируем посетить:
http://learnc.info/adt/binary_tree_traversal.html
http://hci.fenster.name/304y/lab3/
https://sohabr.net/post/232669/
Ну а имея его, перевернуть дерево, труда, думаю, не составит.
Аноны, попробуйте порешать. Даже если вы будете натягивать шаблоны на битрикс, все равно для мозгов полезно.
Конечно, я сильно сомневаюсь что это правда, так как эта задача не требует вообще ничего думать, профессиональный разработчик решит ее за минуту. В Гугле вряд ли бы стали давать задачу школьного уровня.
Но вы пока не профессиональные разработчики, почему бы не поломать голову? Вот задача:
- напишите функцию, переворачивающую бинарное дерево.
Дам пару пояснений. Во-первых, дерево это структура, состоящая из узлов, у каждого узла, кроме корневого, есть родитель:
https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
http://www.intuit.ru/studies/courses/648/504/lecture/11458
Вообще, структура из узлов, которые связаны друг с другом, называется граф. Дерево это частный стучай графа, в котором нет циклов и у каждого узла только один родитель.
С деревьями связано много интересных алгоритмов и задач:
http://algolist.manual.ru/ds/btree.php
http://algolist.manual.ru/ds/walk.php
Бинарное (двоичное) дерево — это дерево, у каждого узла которого может быть не более 2 детей. Их обычно называют «левый» и «правый» ребенок.
«Перевернуть» дерево значит пройтись по всем узлам в дереве и поменять местами «левого» и «правого» детей.
Узел дерева обычно содержит еще какие-то данные. Например, число, букву, строку, или что-нибудь еще. В данной задаче это значения не имеет, но если узлы с числами выстраивать в определенном (отсортированном порядке), мы получим упорядоченное дерево, в котором можно довлоьно быстро делать поиск. Именно упорядоченные двоичные деревья, например, используются в индексах базы данных для ускорения их поиска. Префиксные (не двоичные) деревья можно использовать для поиска слов с опечатками в словаре. Это я к тому что деревья важная штука и много где используются.
Для начала, вам, конечно, надо реализовать само дерево. Для этого в PHP надо сделать класс (любители массивов идут в какой-нибудь другой тред), который представляет один узел дерева. Из объектов такого класса можно будет построить дерево.
Потом надо будет придумать способ обхода всех узлов дерева. Для этого нужна либо рекурсивная функция, либо очередь, куда мы складываем новые найденные узлы, которые планируем посетить:
http://learnc.info/adt/binary_tree_traversal.html
http://hci.fenster.name/304y/lab3/
https://sohabr.net/post/232669/
Ну а имея его, перевернуть дерево, труда, думаю, не составит.
Аноны, попробуйте порешать. Даже если вы будете натягивать шаблоны на битрикс, все равно для мозгов полезно.
> У меня даже на убунту выдает почему-то "C:\fakepath\filename".
Браузер в целях защиты пользовательской информации не передает полный путь к файлу. Имеет право.
> правильно ли я понял, что в современных браузерах всегда используется эта виндовая строка, которую можно спокойно сплитить по бекслешу?
Ненадежно. Я бы сделал более надежный алгоритм, который принимает любое из имен:
file.txt
/tmp/file.txt
c:\test\file.txt
> Можно ли использовать fileInput.value, или же предпочтительнее что-то другое, там в документации говорится о каком-то filename, я не понял, к какому вообще дом-объекту относится это свойство?
filename это какое-то странное свойство, с которым я сам не сталкивался и не уверен что оно вообще везде поддерживается.
Можно использовать value если нужно только имя. Также, в новых браузерах есть объект File (в свойстве input.files) который содержит информацию о выбранном файле:
https://developer.mozilla.org/ru/docs/Web/API/File
https://developer.mozilla.org/ru/docs/Using_files_from_web_applications
> там в документации говорится о каком-то filename, я не понял, к какому вообще дом-объекту относится это свойство?
Это не свойство, а режим, прочти что написано выше:
> The value IDL attribute allows scripts to manipulate the value of an input element. The attribute is in one of the following modes, which define its behavior:
> ...
> filename
> On getting, it must return the string ...
Это просто значит что у файловых инпутов свойство value находится в режиме (?) filename и хранит путь или имя выбранного файла.
Понятия не имею, что такое "режим", лучше действительно буду обращаться через api объекта file, files[0].name или лучше в цикле если выбрано несколько файлов.
>Для начала, вам, конечно, надо реализовать само дерево. Для этого в PHP надо сделать класс (любители массивов идут в какой-нибудь другой тред)
А само дерево в виде массива хранить можно?
Мы не умеем.
Это как? Массивы там не нужны, так как дерево состоит из узлов и мы можем ссылки на них в самих же узгах и хранить. Ну вот пример:
// создаем первый узел
$n1 = new Node;
// второй
$n2 = new Node;
// Добавляем второй как ребенка первого
$n1->setLeftChild($n2);
>>522921
Структура данных, используется во многих алгоритмах, ты пост прочел?
>>522924
А документация?
>>522936
Нет, не актуальны, PSR для PHP.
Есть такие ссылки:
https://learn.javascript.ru/coding-style
http://learn.javascript.ru/write-unmain-code
Это как? Массивы там не нужны, так как дерево состоит из узлов и мы можем ссылки на них в самих же узгах и хранить. Ну вот пример:
// создаем первый узел
$n1 = new Node;
// второй
$n2 = new Node;
// Добавляем второй как ребенка первого
$n1->setLeftChild($n2);
>>522921
Структура данных, используется во многих алгоритмах, ты пост прочел?
>>522924
А документация?
>>522936
Нет, не актуальны, PSR для PHP.
Есть такие ссылки:
https://learn.javascript.ru/coding-style
http://learn.javascript.ru/write-unmain-code
Ок, вот мои мысли.
Во-первых, я вижу по структуре что ты вдохновлялся Юи. Это не лучший пример для подражания, особенно если ты смотрел на устаревший Yii1, а не Yii2 так как его автор тот еще велосипедист и любитель все делать по-своему. Более того, Юи это большой фрейморк, потому делать микрофреймворк по аналогии с ним неправильно.
В качестве пример микрофрйемворка стоило бы посомтреть на SLim или Silex. Они сделаны совем по-другому и их архитектура лучше подходит для крошечных проектов. А Юи-подобная архитектура подходит плохо, она громоздкая и избыточная.
Далее, твой фреймворк нельзя подключить через композер. Его нельзя установить в отдельную папку, и он тянет с собой какой-то index.php с кодом. Вот допустим я бы решил написать под него приложение. Как отличать где код фрйемворка, а где мой код? Твой фреймворк предполагает что все это надо перемешать в кучу, это неправильно. Сторонний код должен ставиться через композер и лежать в отдельной папке.
Разумеется, библиотеки и фреймворки стоит выносить в отдельный неймспейс, чтобы избежать конфликтов имен с пользовательским кодом и другими библиотеками.
Далее, это абсолютный пример как делать неправильно: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/Component.php
Что это за ерунда? Почему ты все классы наследуешь от какого-то Компонента? Наследование предполагает что классы представляют собой что-то однотипное, похожее. Но у Валидатора и Контроллера нет ничего общего и наследоваться от одного предка они не должны.
Ты абсолютно непраивльно реализовал автозагрузчик: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/Component.php#L15
Зачем ты примешиваешь код автозагрузки во все классы? Он должен быть отдельно, а в случае фреймворка он вообще должен быть реализован через композер. Каждый класс должен заниматься своим делом. Это не задача Валидатора заниматься автозагрузкой. Ну и я не понимаю, зачем подключать файлы через require когда в PHP есть настоящая автозагрузка: http://habrahabr.ru/post/136761/
По всему коду размазаны функции типа loadClass:
https://github.com/DmitryMachavariani/micro/blob/master/framework/Rain.php#L53
Это надо все удалить и сделать нормальную автозагрузку через композер по PSR-4.
Тут в контроллере тоже смешана куча разной логики: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/BaseController.php
Обычно контроллер реализуют так: на вход он получает запрос Request и отдает на выходе ответ, Response:
$response = $controller->handle($request);
В некоторых фрйемворках заготовка ответа передается как аргуимент, а контроллер его заполняет:
$controller->handle($request, $response);
Соответственно вся работа с GET/POST вынесена в объект Request.
Также, у тебя зачем-то заложено использование каких-то странных параемтров:
> $data = isset($_GET['d']) ? explode("/", $_GET['d']) : explode("/", self::$default_base);
Что еще за d? Что это? Почему я должен это использовать?
> https://github.com/DmitryMachavariani/micro/blob/master/framework/base/BaseController.php#L34
> exit("Not found file " . app . "/views/" . $this->getController() . "/" . $file . ".php" . "");
В мире ООП надо использовать исключения, урок: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Ты же пишешь пользователю непонятную ему информацию, и не логгируешь информацию об ошибке. Администратор сайта о ней никогда не узнает. ДОЛжно быть наоборот, пользователю — заглушка, администратору — запись в лог (и исключения позволяют это сделать).
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/DataBase.php#L28
> } catch (PDOException $e) {
> die($e->getMessage());
Это неправильно. Ты пользователю вываливаешь информацию о базе данных, котрую он не понимает, а в логи ничего не пишется. Этот код пишут в учебниках для примера, а не для того чтобы его копировали в реальные приложения.
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/DataBase.php#L58
> $this->result = $this->database->query("SELECT * FROM " . $table_name . " LIMIT " . $from . ", " . $to)->fetchAll();
Нельзя вставлять переменные прямо в запрос, это во-первых некачественный код, во-вторых вероятность SQl инъекции. Надо использовать плейсхолдеры: http://habrahabr.ru/post/137664/
Сам класс базы данных тоже спроектирован неудачно, ты смешал в одном классе и довольно бесполезный построитель запросов, и обертку над PDO. Посмотри например как устроен Doctrine DBAL, там все разнесено в отдельные классы.
Построитель запросов должен идти отдельным классом. Тем более что в 90% случаев у нас запрос неизменен, его можно просто прописать строкой и нужды в построителе нету.
> public function where($where = null, $type = 'AND') {
Функция не экранирует данные при сборке, это SQL инъекция.
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/Router.php#L40
РОутер не занимается редиректами. Его задача лишь проанализировать и разобрать URL. Редиректы делаются через объект Response.
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/Session.php
Смысл этого класса непонятен. Что мешает напрямую работать с SESSION?
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/User.php
> class User extends Session {
Пользователь это не разновидность сессии, тут неправильно использовать наследование. Более того, ты умудрился смешать в одном классе 3 разных вещи, которые должны быть отдельно:
- класс работы с сессией
- класс для авторизации/разгогинивания
- класс, хранящий информацию о пользователе
Должно быть 3 отдельных класса.
> https://github.com/DmitryMachavariani/micro/blob/master/framework/helper/FormHelper.php#L17
Непраивльно смешивать PHP логику и HTML. HTML должен быть в шаблоне.
Также, у тебя не экранируются данные при вставке в HTML. Это XSS уязвимость.
> https://github.com/DmitryMachavariani/micro/blob/master/index.php
Константы пишутся большими буквами, смысл их неясен. зачем нужна константа "url" если логичнее сделать такой метод в объекте Request? Какой смысл в константе "FILEPATH" и почему это константа а не метод?
В общем, на этом, думаю, можно проверку закончить и остальное не проверять. Потому что все эти ошибки разбираются в нашем задании про студентов и я тут начинаю пересказывать комментарии к этому заданию, лучше ты прочти их сам: https://github.com/codedokode/pasta/blob/master/student-list.md
Вот мое мнение: писать свои велосипеды, это в общем неплохо и полезно. Ты узнаешь что-то новое, лучше начиаешь разбираться в других фреймворках. Но в товем случае, тебе надо больше смотреть на существующие технологии и фреймворки и меньше вариться в собственном соку, потому что код пока что очень слабый и в нем полно проблем. Ты не знешь многих базовых вещей, которые надо изучать до фрнймворков.
Если ты решишь наши задачи про студентво и файлообменник (в ОП посте есть ссылки), кстати, ты сможешь многих таких ошибок избежать. А если изучишь существуюие микрофреймворки вроде Slim или Silex то сможешь избежать и остальных ошибок.
Вот краткий список вещей которые стоит тебе посмотреть:
- ООП и наследование
- composer
- автозагрузка в PHP
- фреймворк Slim
- плейсхолдеры в SQL запросах
- htmlspeciaclahrs и XSS
Если тебе что-то непонятно или есть вопросы, задавай, я поясню и дам ссылочки.
Ок, вот мои мысли.
Во-первых, я вижу по структуре что ты вдохновлялся Юи. Это не лучший пример для подражания, особенно если ты смотрел на устаревший Yii1, а не Yii2 так как его автор тот еще велосипедист и любитель все делать по-своему. Более того, Юи это большой фрейморк, потому делать микрофреймворк по аналогии с ним неправильно.
В качестве пример микрофрйемворка стоило бы посомтреть на SLim или Silex. Они сделаны совем по-другому и их архитектура лучше подходит для крошечных проектов. А Юи-подобная архитектура подходит плохо, она громоздкая и избыточная.
Далее, твой фреймворк нельзя подключить через композер. Его нельзя установить в отдельную папку, и он тянет с собой какой-то index.php с кодом. Вот допустим я бы решил написать под него приложение. Как отличать где код фрйемворка, а где мой код? Твой фреймворк предполагает что все это надо перемешать в кучу, это неправильно. Сторонний код должен ставиться через композер и лежать в отдельной папке.
Разумеется, библиотеки и фреймворки стоит выносить в отдельный неймспейс, чтобы избежать конфликтов имен с пользовательским кодом и другими библиотеками.
Далее, это абсолютный пример как делать неправильно: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/Component.php
Что это за ерунда? Почему ты все классы наследуешь от какого-то Компонента? Наследование предполагает что классы представляют собой что-то однотипное, похожее. Но у Валидатора и Контроллера нет ничего общего и наследоваться от одного предка они не должны.
Ты абсолютно непраивльно реализовал автозагрузчик: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/Component.php#L15
Зачем ты примешиваешь код автозагрузки во все классы? Он должен быть отдельно, а в случае фреймворка он вообще должен быть реализован через композер. Каждый класс должен заниматься своим делом. Это не задача Валидатора заниматься автозагрузкой. Ну и я не понимаю, зачем подключать файлы через require когда в PHP есть настоящая автозагрузка: http://habrahabr.ru/post/136761/
По всему коду размазаны функции типа loadClass:
https://github.com/DmitryMachavariani/micro/blob/master/framework/Rain.php#L53
Это надо все удалить и сделать нормальную автозагрузку через композер по PSR-4.
Тут в контроллере тоже смешана куча разной логики: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/BaseController.php
Обычно контроллер реализуют так: на вход он получает запрос Request и отдает на выходе ответ, Response:
$response = $controller->handle($request);
В некоторых фрйемворках заготовка ответа передается как аргуимент, а контроллер его заполняет:
$controller->handle($request, $response);
Соответственно вся работа с GET/POST вынесена в объект Request.
Также, у тебя зачем-то заложено использование каких-то странных параемтров:
> $data = isset($_GET['d']) ? explode("/", $_GET['d']) : explode("/", self::$default_base);
Что еще за d? Что это? Почему я должен это использовать?
> https://github.com/DmitryMachavariani/micro/blob/master/framework/base/BaseController.php#L34
> exit("Not found file " . app . "/views/" . $this->getController() . "/" . $file . ".php" . "");
В мире ООП надо использовать исключения, урок: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Ты же пишешь пользователю непонятную ему информацию, и не логгируешь информацию об ошибке. Администратор сайта о ней никогда не узнает. ДОЛжно быть наоборот, пользователю — заглушка, администратору — запись в лог (и исключения позволяют это сделать).
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/DataBase.php#L28
> } catch (PDOException $e) {
> die($e->getMessage());
Это неправильно. Ты пользователю вываливаешь информацию о базе данных, котрую он не понимает, а в логи ничего не пишется. Этот код пишут в учебниках для примера, а не для того чтобы его копировали в реальные приложения.
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/DataBase.php#L58
> $this->result = $this->database->query("SELECT * FROM " . $table_name . " LIMIT " . $from . ", " . $to)->fetchAll();
Нельзя вставлять переменные прямо в запрос, это во-первых некачественный код, во-вторых вероятность SQl инъекции. Надо использовать плейсхолдеры: http://habrahabr.ru/post/137664/
Сам класс базы данных тоже спроектирован неудачно, ты смешал в одном классе и довольно бесполезный построитель запросов, и обертку над PDO. Посмотри например как устроен Doctrine DBAL, там все разнесено в отдельные классы.
Построитель запросов должен идти отдельным классом. Тем более что в 90% случаев у нас запрос неизменен, его можно просто прописать строкой и нужды в построителе нету.
> public function where($where = null, $type = 'AND') {
Функция не экранирует данные при сборке, это SQL инъекция.
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/Router.php#L40
РОутер не занимается редиректами. Его задача лишь проанализировать и разобрать URL. Редиректы делаются через объект Response.
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/Session.php
Смысл этого класса непонятен. Что мешает напрямую работать с SESSION?
> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/User.php
> class User extends Session {
Пользователь это не разновидность сессии, тут неправильно использовать наследование. Более того, ты умудрился смешать в одном классе 3 разных вещи, которые должны быть отдельно:
- класс работы с сессией
- класс для авторизации/разгогинивания
- класс, хранящий информацию о пользователе
Должно быть 3 отдельных класса.
> https://github.com/DmitryMachavariani/micro/blob/master/framework/helper/FormHelper.php#L17
Непраивльно смешивать PHP логику и HTML. HTML должен быть в шаблоне.
Также, у тебя не экранируются данные при вставке в HTML. Это XSS уязвимость.
> https://github.com/DmitryMachavariani/micro/blob/master/index.php
Константы пишутся большими буквами, смысл их неясен. зачем нужна константа "url" если логичнее сделать такой метод в объекте Request? Какой смысл в константе "FILEPATH" и почему это константа а не метод?
В общем, на этом, думаю, можно проверку закончить и остальное не проверять. Потому что все эти ошибки разбираются в нашем задании про студентов и я тут начинаю пересказывать комментарии к этому заданию, лучше ты прочти их сам: https://github.com/codedokode/pasta/blob/master/student-list.md
Вот мое мнение: писать свои велосипеды, это в общем неплохо и полезно. Ты узнаешь что-то новое, лучше начиаешь разбираться в других фреймворках. Но в товем случае, тебе надо больше смотреть на существующие технологии и фреймворки и меньше вариться в собственном соку, потому что код пока что очень слабый и в нем полно проблем. Ты не знешь многих базовых вещей, которые надо изучать до фрнймворков.
Если ты решишь наши задачи про студентво и файлообменник (в ОП посте есть ссылки), кстати, ты сможешь многих таких ошибок избежать. А если изучишь существуюие микрофреймворки вроде Slim или Silex то сможешь избежать и остальных ошибок.
Вот краткий список вещей которые стоит тебе посмотреть:
- ООП и наследование
- composer
- автозагрузка в PHP
- фреймворк Slim
- плейсхолдеры в SQL запросах
- htmlspeciaclahrs и XSS
Если тебе что-то непонятно или есть вопросы, задавай, я поясню и дам ссылочки.
Я думаю, под «АПИ» он имел в виду пример простого приложения, использующего фреймворк.
>>520534
Можно, но имей в виду что битрикс это то еще дно. Его пишут студенты работающие за 20 000 руб и качество кода соответствующее.
>>520557
Для графиков есть JS библиотеки либ оможно рисовать их средствами PHP на сервере либо рисовать в SVG файле. А в твоем случае график вообще можно из дивов сделать.
>>520583
С PHP проще будет. Яву потом тебе никто не запрещает изучать.
>>520666
Надо только убедиться что во всех браузерах и размерах окна файловый инпут находится ровно над нарисованным.
>>520947
Если ты все это делаешь потому что не осили исправить плохой код то я тебя не поддерживаю. Если пользователю действительно надо чтобы при нажатии сортировки она надолго сохранялась (в чем я сильно сомневаюсь) то можно использовать куки, если нет то надо делать это через URL.
Для сериализации можно использовать json_encode, лучше наверно просто отдельные куки.
>>520976
Регулярка слишком сложная. Там достаточно поиска 2 ситуаций:
- любые буквы, латинская, русская, любые буквы
- любые буквы, русская, латинская, любые
Чтобы найти неправильные слова.
> for ($i=0; $i<$count; $i++) {
Используй foreach, он удобнее.
Алсо, что-то программа выводит непонятный ответ:
> Опечатка в слове мяc:[]
Ты учел что в preg_replace $1, $2, $3 относятся именно к трем самым первым парам скобок в регулярке?
Я думаю, под «АПИ» он имел в виду пример простого приложения, использующего фреймворк.
>>520534
Можно, но имей в виду что битрикс это то еще дно. Его пишут студенты работающие за 20 000 руб и качество кода соответствующее.
>>520557
Для графиков есть JS библиотеки либ оможно рисовать их средствами PHP на сервере либо рисовать в SVG файле. А в твоем случае график вообще можно из дивов сделать.
>>520583
С PHP проще будет. Яву потом тебе никто не запрещает изучать.
>>520666
Надо только убедиться что во всех браузерах и размерах окна файловый инпут находится ровно над нарисованным.
>>520947
Если ты все это делаешь потому что не осили исправить плохой код то я тебя не поддерживаю. Если пользователю действительно надо чтобы при нажатии сортировки она надолго сохранялась (в чем я сильно сомневаюсь) то можно использовать куки, если нет то надо делать это через URL.
Для сериализации можно использовать json_encode, лучше наверно просто отдельные куки.
>>520976
Регулярка слишком сложная. Там достаточно поиска 2 ситуаций:
- любые буквы, латинская, русская, любые буквы
- любые буквы, русская, латинская, любые
Чтобы найти неправильные слова.
> for ($i=0; $i<$count; $i++) {
Используй foreach, он удобнее.
Алсо, что-то программа выводит непонятный ответ:
> Опечатка в слове мяc:[]
Ты учел что в preg_replace $1, $2, $3 относятся именно к трем самым первым парам скобок в регулярке?
Вот ответ, спамфильтр не пропускает: http://pastebin.com/ziK5KHmU
>>521138
А люди как живут?
>>521142
> Ещё более лучшее задание №2:
Теперь все верно
> Задание №3
Надо отключить курсив в теге em, а то вот что может получиться: https://jsfiddle.net/3cgrz53j/
Стрелочку лучше вписать через html-мнемонику, так как ее нельзя ввести с клавиатуры (ну то есть у меня она конечно есть но у других людей может и не быть и они не смогут нормально редактировать код).
> Задание №4
Хорошо, молодец, это задача на знание inline-block, вертикального выравнивания и удаления пробелов между инлайн-блоками.
> Задание №5
Ок, все верно.
>>521145
Нет.
>>521150
Надо исользовать json_encode либо отдельные куки. если ты хочешь чтобы настройки привязывались не к компьютеру, а к аккаунту, лучше вообще их в базе хранить.
Вот ответ, спамфильтр не пропускает: http://pastebin.com/ziK5KHmU
>>521138
А люди как живут?
>>521142
> Ещё более лучшее задание №2:
Теперь все верно
> Задание №3
Надо отключить курсив в теге em, а то вот что может получиться: https://jsfiddle.net/3cgrz53j/
Стрелочку лучше вписать через html-мнемонику, так как ее нельзя ввести с клавиатуры (ну то есть у меня она конечно есть но у других людей может и не быть и они не смогут нормально редактировать код).
> Задание №4
Хорошо, молодец, это задача на знание inline-block, вертикального выравнивания и удаления пробелов между инлайн-блоками.
> Задание №5
Ок, все верно.
>>521145
Нет.
>>521150
Надо исользовать json_encode либо отдельные куки. если ты хочешь чтобы настройки привязывались не к компьютеру, а к аккаунту, лучше вообще их в базе хранить.
> Задание №6
У списка надо убрать кружочки. В меню нужно сделать больше расстояние между пунктами по вертикали (на глаз, как на картинке).
> src: url("http://www.xfont.ru/files/fonts/5/247509.ttf");
Требушет встроен в винды и есть на других платформах, так что это не нужно. Ну и если речь не об учебном задании, я бы не рискнул подключать шрифты с левого сайта. Более того, у меня серьезные подозрения что они там не с разрешения правообладателя, так как требушет принадлежит майкрософту.
Заголовок там по моему надо сделать не-жирным.
Текст и меню тоже надо сделать требушетом, этот шрифт можно прописать как основной на теге html или body.
> Задание №7
Ок, хорошо, я вижу что ты указал для кнопки и input разную height. Я советую тебе еще почитать про свойство box-sizing если ты о нем еще не знаешь.
> Задание №8
Когда указываешь font-size всегда указывай и line-height иначе он наследуется и поулчится не то что надо. Основной размер и стиль шрифта надо указывать не на p (это как минимум странно, почему размер применяется только к тексту внутри абзацев, а как же другие теги? ), а на html или body.
div там лишний и его надо убрать. Мне кажется тегов p и aside вполне достаточно. clear можно перенести на aside.
Отступ для абзацев надо задавать не маргином на детях, а паддингом на родителе, посмотри даже в задании написано:
> не задавай поля с помощью margin на <p>. Поля задаются с помощью padding на родительском элементе
Вот какие проблемы получаются из-за маргина:
http://jsfiddle.net/oz48zgcw/1/
Шрифт крупный, все поехало. Надо делать поля через паддинг чтобы этого не было. текст не только внутри абзацев бывает.
>Задание №9
>div {
>\tborder: 1px solid #a3a3a3;
Это не годится так как стиль применяется вообще к любым дивам и ломает верстку если вставить эти блоки на реальную страницу. Пиши стили которые не ломают чужие теги.
> .greyBlock:after {
>\tcontent: " ";
Это старый clearfix, сейчас похитрее штука есть, microclearfix, ссылка на нее в подсказке к заданию. Но твой вариант тоже подходит.
> <p class="inside text">
У p надо убрать классы, так как на практике у нас есть кусок HTML который надо вывести, например, текст поста из базы данных, и мы не хотим в нем искать теги и добавлять в них классы, а хотим просто вывести как есть. То есть на p не должно быть никаких классов.
Опять же шрифт должен применяться не только к абзацам, а к любому содержимому, спискам, тексту вне тегов.
> до меня так и не дошло, как сделать так, чтобы текст не обтекал левый блок, а шёл отдельной колонкой
Сделать большой padding-left на .greyBlock. желтый квадрат можно загнать влево отрицательным маргином: https://gist.github.com/codedokode/3f6063edf0a2227eb313
> Задание №6
У списка надо убрать кружочки. В меню нужно сделать больше расстояние между пунктами по вертикали (на глаз, как на картинке).
> src: url("http://www.xfont.ru/files/fonts/5/247509.ttf");
Требушет встроен в винды и есть на других платформах, так что это не нужно. Ну и если речь не об учебном задании, я бы не рискнул подключать шрифты с левого сайта. Более того, у меня серьезные подозрения что они там не с разрешения правообладателя, так как требушет принадлежит майкрософту.
Заголовок там по моему надо сделать не-жирным.
Текст и меню тоже надо сделать требушетом, этот шрифт можно прописать как основной на теге html или body.
> Задание №7
Ок, хорошо, я вижу что ты указал для кнопки и input разную height. Я советую тебе еще почитать про свойство box-sizing если ты о нем еще не знаешь.
> Задание №8
Когда указываешь font-size всегда указывай и line-height иначе он наследуется и поулчится не то что надо. Основной размер и стиль шрифта надо указывать не на p (это как минимум странно, почему размер применяется только к тексту внутри абзацев, а как же другие теги? ), а на html или body.
div там лишний и его надо убрать. Мне кажется тегов p и aside вполне достаточно. clear можно перенести на aside.
Отступ для абзацев надо задавать не маргином на детях, а паддингом на родителе, посмотри даже в задании написано:
> не задавай поля с помощью margin на <p>. Поля задаются с помощью padding на родительском элементе
Вот какие проблемы получаются из-за маргина:
http://jsfiddle.net/oz48zgcw/1/
Шрифт крупный, все поехало. Надо делать поля через паддинг чтобы этого не было. текст не только внутри абзацев бывает.
>Задание №9
>div {
>\tborder: 1px solid #a3a3a3;
Это не годится так как стиль применяется вообще к любым дивам и ломает верстку если вставить эти блоки на реальную страницу. Пиши стили которые не ломают чужие теги.
> .greyBlock:after {
>\tcontent: " ";
Это старый clearfix, сейчас похитрее штука есть, microclearfix, ссылка на нее в подсказке к заданию. Но твой вариант тоже подходит.
> <p class="inside text">
У p надо убрать классы, так как на практике у нас есть кусок HTML который надо вывести, например, текст поста из базы данных, и мы не хотим в нем искать теги и добавлять в них классы, а хотим просто вывести как есть. То есть на p не должно быть никаких классов.
Опять же шрифт должен применяться не только к абзацам, а к любому содержимому, спискам, тексту вне тегов.
> до меня так и не дошло, как сделать так, чтобы текст не обтекал левый блок, а шёл отдельной колонкой
Сделать большой padding-left на .greyBlock. желтый квадрат можно загнать влево отрицательным маргином: https://gist.github.com/codedokode/3f6063edf0a2227eb313
я пост прочел, нахуя ты даешь примеры на си в треде про похапе? совсем ебнулся уже со своим преподаванием?
Тебе надо сначала изучить основы PHP. Если в массиве нет элемента то функция вернет null и выдаст ошибку.
>>521668
Ты непраивльно делаешь авторизацию. ты должен в защищенном файле проверять залогинен ли пользователь, если нет то выводить форму логина.
> как заставить скрипт /admin/vasya/admin.php, не работать, при переходе по прямой ссылке на него?
Никак.
>>521690
И внимательно читай все замечания и подсказки под заданиями. Там иногда и полезные советы написаны.
>>521819
> Господа, как это можно автоматизировать?
Массивом.
> Оно у меня потом в шаблон парситься, там особая структура, ее нельзя нарушать
Его надо выкинуть и переписать на твиге, вот мое мнение.
Код кошмарный. Не пишите так, хорошие дети.
Интересно, что заставляет людей писать этот ад? Почему они не хотят изучить Slim, twig, doctrine, symfony или хотя бы Yii2 и сделать нормально? Ведь все равно с таким кодом ни в одну нормальную компанию не возьмут.
> $title8
> $parse->set_tpl('{TITLE8}',$title8);
8-е название! Восьмое! Поэтому вы никогда не должны изобретать свой шаблонизатор, а должны взять твиг.
>>521823
Чушь пишешь. Как фронтенд может быть бесполезным если позволяет при умении создавать удобные и красивые интерфейсы?
>>521946
В следующий раз на аналогичной задаче додумаешься. Потому надо решать сейчас как можно больше задачек. Программирование во многом состоит из написания того что ты уже видел раньше.
Тебе надо сначала изучить основы PHP. Если в массиве нет элемента то функция вернет null и выдаст ошибку.
>>521668
Ты непраивльно делаешь авторизацию. ты должен в защищенном файле проверять залогинен ли пользователь, если нет то выводить форму логина.
> как заставить скрипт /admin/vasya/admin.php, не работать, при переходе по прямой ссылке на него?
Никак.
>>521690
И внимательно читай все замечания и подсказки под заданиями. Там иногда и полезные советы написаны.
>>521819
> Господа, как это можно автоматизировать?
Массивом.
> Оно у меня потом в шаблон парситься, там особая структура, ее нельзя нарушать
Его надо выкинуть и переписать на твиге, вот мое мнение.
Код кошмарный. Не пишите так, хорошие дети.
Интересно, что заставляет людей писать этот ад? Почему они не хотят изучить Slim, twig, doctrine, symfony или хотя бы Yii2 и сделать нормально? Ведь все равно с таким кодом ни в одну нормальную компанию не возьмут.
> $title8
> $parse->set_tpl('{TITLE8}',$title8);
8-е название! Восьмое! Поэтому вы никогда не должны изобретать свой шаблонизатор, а должны взять твиг.
>>521823
Чушь пишешь. Как фронтенд может быть бесполезным если позволяет при умении создавать удобные и красивые интерфейсы?
>>521946
В следующий раз на аналогичной задаче додумаешься. Потому надо решать сейчас как можно больше задачек. Программирование во многом состоит из написания того что ты уже видел раньше.
Подскажите как сделать анимацию текста, чтобы он плавно переливался из одного в другой при переключении табов.
Раньше почему-то было принято называть классы начиная с C: CUser, CWindow. Сейчас это не пишут, так как классы видно по заглавной букве в начале.
>>522147
Чтобы брать больше с тех кто побогаче.
> можно брать за 1 сделку больше.
Тогда 10-долларовые заказчики огорчатся.
>>522168
Я бы сказал меньше, 4-8 месяцев, если по хардкору учиться в нашем треде то можно в минимальную границу уложиться.
>>522225
Странно даже, кодеакадеми это ведь ознакомительный уровень. Ты наверно и до этого знал что-то.
>>522235
Какая польза без фреймворков? Какие виды сайтов по твоему выгоднее писать на чистом PHP? Никакие. Почему фреймворки не учишь? мог бы начать с нашего задания про файлообменник например.
> Простой сайт с админкой и бд могу написать, что там еще можно уметь?
Может код людям не нравится, который без фреймворков? Может он еще и без ООП? И выглядит как в учебниках 10-летней давности?
>>522245
Что же до сих пор Yii2/Symfony 2 не освоил?
>>522287
Ctrl + Shift + I нажми в браузере и попробуй разобраться
>>522425
JOIN это не замена внешних ключей, это способ объединения таблиц. Перечитай пост и ссылку в нем: >>522385
Не использовать внешние ключи = быдлокодить
>>522427
Код запости куда-нибудь вроде jsfiddle или codepen.
Раньше почему-то было принято называть классы начиная с C: CUser, CWindow. Сейчас это не пишут, так как классы видно по заглавной букве в начале.
>>522147
Чтобы брать больше с тех кто побогаче.
> можно брать за 1 сделку больше.
Тогда 10-долларовые заказчики огорчатся.
>>522168
Я бы сказал меньше, 4-8 месяцев, если по хардкору учиться в нашем треде то можно в минимальную границу уложиться.
>>522225
Странно даже, кодеакадеми это ведь ознакомительный уровень. Ты наверно и до этого знал что-то.
>>522235
Какая польза без фреймворков? Какие виды сайтов по твоему выгоднее писать на чистом PHP? Никакие. Почему фреймворки не учишь? мог бы начать с нашего задания про файлообменник например.
> Простой сайт с админкой и бд могу написать, что там еще можно уметь?
Может код людям не нравится, который без фреймворков? Может он еще и без ООП? И выглядит как в учебниках 10-летней давности?
>>522245
Что же до сих пор Yii2/Symfony 2 не освоил?
>>522287
Ctrl + Shift + I нажми в браузере и попробуй разобраться
>>522425
JOIN это не замена внешних ключей, это способ объединения таблиц. Перечитай пост и ссылку в нем: >>522385
Не использовать внешние ключи = быдлокодить
>>522427
Код запости куда-нибудь вроде jsfiddle или codepen.
Ладно, сделаю ваши задачки и пойду учить твиг тогда.
>Как фронтенд может быть бесполезным
Фронтенд макак итак как говна расплодилось, их неохотно берут на работу за пределами дс по крайней мере. потому что бэкэнд важнее
Имеется в виду что у инпутов разных типов (файл, поле ввода, чекбокс) value ведет себя по-разному, и там описаны вырианты такого поведения, это и есть «режимы».
>>522994
Код на Си можешь не читать, только теорию. Других ссылок не нашел. Да и какая разница, код-то ты все равно должен написать сам, так что код на Си это делать никак не мешает.
>>522998
Можно расположить все тексты друг над другом, сделать их прозрачными и при переключении анимировать opacity. Можно сделать чтобы текст уезжал влево и другой выезжал справа, за счет свойств left или transform. Можно вообще трехмерные трансформации сделать:
http://habrahabr.ru/company/nordavind/blog/209462/
http://habrahabr.ru/post/135816/
http://habrahabr.ru/post/159161/
http://habrahabr.ru/post/151300/
Я советую разобраться с transition (переходы), transform и transform 3d, пригодится. Можно на них красивые штуки делать.
> input:checked + label + input + label + article + article + article {
> \t\t\t\tdisplay: block;
А можно ли обойтись без таких адских селекторов? Вот тут пост например на тему есть: http://chikuyonok.ru/2009/04/dl-tabs/ хотя он со своими недостатками.
> div.innerHTML = '<h4><b> Ответить: </b></h4>' +
> + '<form action="/send/{{ file.id }}" method="post">'+
> + '<label for="name">Ваше имя</label><br>'+
> + '<input type="text" name="name" value="Anonymous"><br>'+
Вот это плохо, засовывать HTML в JS. ты можешь засунуть шаблон в HTML код в script-блок как описано тут:
https://learn.javascript.ru/template-lodash#хранение-шаблона-в-документе
https://learn.javascript.ru/templates
Вот так вот: <script type="text/x-template" id="menu-template">
Заметь, я пишу x-template так как MIME типа text/template нет, а для своих придуманных типов принято приписывать x-.
Для js-test.html можно было не писать маршрут, а кинуть его в public и обращаться напрямую.
> commentButton.onclick = function(){
не полагайся на то что браузер создает глобальные переменные по id, используй getElementById явно.
> onclick="appendPostForm({{comment.id}}, '{{comment.user}}', postForm{{comment.id}})"
Используй json_encode для надежной подстановки данных в скрипт. Что если в user встретится кавычка или перевод строки? Как минимум, скрипт сломается.
> div.innerHTML = '<h4><b> Ответить: </b></h4>' +
> + '<form action="/send/{{ file.id }}" method="post">'+
> + '<label for="name">Ваше имя</label><br>'+
> + '<input type="text" name="name" value="Anonymous"><br>'+
Вот это плохо, засовывать HTML в JS. ты можешь засунуть шаблон в HTML код в script-блок как описано тут:
https://learn.javascript.ru/template-lodash#хранение-шаблона-в-документе
https://learn.javascript.ru/templates
Вот так вот: <script type="text/x-template" id="menu-template">
Заметь, я пишу x-template так как MIME типа text/template нет, а для своих придуманных типов принято приписывать x-.
Для js-test.html можно было не писать маршрут, а кинуть его в public и обращаться напрямую.
> commentButton.onclick = function(){
не полагайся на то что браузер создает глобальные переменные по id, используй getElementById явно.
> onclick="appendPostForm({{comment.id}}, '{{comment.user}}', postForm{{comment.id}})"
Используй json_encode для надежной подстановки данных в скрипт. Что если в user встретится кавычка или перевод строки? Как минимум, скрипт сломается.
>Что же до сих пор Yii2/Symfony 2 не освоил?
Как бы не видел необходимости, ведь все что угодно можно нагуглить и написать на чистом пхп.
Это будет как минимум дольше. В коде будет разбираться и поддерживать дольше и сложнее. По моему опыту, в 99% случаев это будет быдлокод (смотри дамп фриланса выше по треду). Заказчик очевидно окажется в проигрыше от сотруюничества с таким велосипедистом.
Потому советую изучать.
>Папка не создается автоматически, только сам файл. Если папки log нет то будет ошибка.
Спасибо, позже попробую написать что-нибудь типа простенького файлового менеджера, чтобы лучше покрыть эту тему, или задание на файлообменник сделаю ваше, если доберусь.
>Вот это плохо, засовывать HTML в JS. ты можешь засунуть шаблон в HTML код в script-блок как описано тут
До этой главы в книге я еще не дошел, посмотрю
Но превращают код в кашу. Потому мы будем ветвить не массивы, а объекты.
>>523107
Балансировка слишком круто, для начала надо просто перевернуть дерево. А тем кто повернул, дадим балансировку.
>>523098
> public function createChilds()
Этой функции тут не должно быть, как мне кажется. Она лишает нас возможности управлять созданием узлов, например какого он должен быть класса и что передать ему в конструктор. Удобнее сделать методы вроде задатьЛевогоРебенка().
Также, мне кажется свойства лучше сделать непубличными. Например, при добавлении узла мы должны поступать примерно так:
- проверить что этот узел не имеет родителя
- прописать себя в parent узла
- прописать узел в одного из детей
- если на его месте был другой узел, надо его удалить
У тебя поля публичные и нет никаких гарантий что они все будут в согласованном виде. Правильнее сделать их непублимчными и сделать методы добавления/удаления детей которые гарантируют что все ссылки будут проставлены правильно. Этим ты сбережешь время разработчиков которые будут работать с ствоим деревом.
> if (!empty($base->leftChild) && !empty($base->rightChild)) {
Тут будет ошибка если один из детей есть — его потомки останутся неперевернутыми.
Ну и конечно, я вижу, что для тебя эта задачка слишком простая. Может сделаешь задание чуть посложнее?
- напиши методы добавления/удаления детей с сбалансировкой дерева
В сбалансированном дереве у каждого узла есть какое-то знчение, например число. Число в любом из левых потомков узла должно быть не больше чем число в самом узле, и число в любом из правых потомков должно быть не меньше чем в самом узле.
Дерево называется сбалансированным если в нем нет длинных ветвей из одиночных узлов (точное определние: если взять глубину левой и правой ветвей любого узла, они отличаются не более чем на единицу):
1
...2
......3
.........4
Выше пример несбалансированного деерва. Если посмотреть на узел 1 то слева у него нет потомков, там глубина ветки 0. А справа аж 3 потомка, глубина ветки 3. Непорядок. Если его сбалансировать, получится пирамидка:
.....2
1.........3
.................4
Есть разные алгоритмы балансировки: АВЛ и красно-черные деревья. Говорят, первое проще.
https://ru.wikipedia.org/wiki/%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
Статья с описанием алгоритма балансировки АВЛ-деревьев: http://habrahabr.ru/post/150732/
Про красно-черные деревья: https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE-%D1%87%D1%91%D1%80%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
Поломай голову еще немного.
Если решишь это и будет желание, я дам задачку на поиск слова с ошибками в словаре с помощью деревьев (это примерно то же что делает ворд, когда предлагает варианты исправления опечатки).
Но превращают код в кашу. Потому мы будем ветвить не массивы, а объекты.
>>523107
Балансировка слишком круто, для начала надо просто перевернуть дерево. А тем кто повернул, дадим балансировку.
>>523098
> public function createChilds()
Этой функции тут не должно быть, как мне кажется. Она лишает нас возможности управлять созданием узлов, например какого он должен быть класса и что передать ему в конструктор. Удобнее сделать методы вроде задатьЛевогоРебенка().
Также, мне кажется свойства лучше сделать непубличными. Например, при добавлении узла мы должны поступать примерно так:
- проверить что этот узел не имеет родителя
- прописать себя в parent узла
- прописать узел в одного из детей
- если на его месте был другой узел, надо его удалить
У тебя поля публичные и нет никаких гарантий что они все будут в согласованном виде. Правильнее сделать их непублимчными и сделать методы добавления/удаления детей которые гарантируют что все ссылки будут проставлены правильно. Этим ты сбережешь время разработчиков которые будут работать с ствоим деревом.
> if (!empty($base->leftChild) && !empty($base->rightChild)) {
Тут будет ошибка если один из детей есть — его потомки останутся неперевернутыми.
Ну и конечно, я вижу, что для тебя эта задачка слишком простая. Может сделаешь задание чуть посложнее?
- напиши методы добавления/удаления детей с сбалансировкой дерева
В сбалансированном дереве у каждого узла есть какое-то знчение, например число. Число в любом из левых потомков узла должно быть не больше чем число в самом узле, и число в любом из правых потомков должно быть не меньше чем в самом узле.
Дерево называется сбалансированным если в нем нет длинных ветвей из одиночных узлов (точное определние: если взять глубину левой и правой ветвей любого узла, они отличаются не более чем на единицу):
1
...2
......3
.........4
Выше пример несбалансированного деерва. Если посмотреть на узел 1 то слева у него нет потомков, там глубина ветки 0. А справа аж 3 потомка, глубина ветки 3. Непорядок. Если его сбалансировать, получится пирамидка:
.....2
1.........3
.................4
Есть разные алгоритмы балансировки: АВЛ и красно-черные деревья. Говорят, первое проще.
https://ru.wikipedia.org/wiki/%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
Статья с описанием алгоритма балансировки АВЛ-деревьев: http://habrahabr.ru/post/150732/
Про красно-черные деревья: https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE-%D1%87%D1%91%D1%80%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
Поломай голову еще немного.
Если решишь это и будет желание, я дам задачку на поиск слова с ошибками в словаре с помощью деревьев (это примерно то же что делает ворд, когда предлагает варианты исправления опечатки).
Ой, не пизди. Сидел с таким престарелым преподом-пидором, он мне хуету всякую советовал, давно устаревшую. Сам примеры писал, хуже чем тут в треде постят. Преподы вообще не шарят ничего в программировании. Так бы и прозябал в неведении, если бы не ОП.
>Может сделаешь задание чуть посложнее?
>Поломай голову еще немного.
>Если решишь это и будет желание, я дам задачку на поиск слова с ошибками в словаре с помощью деревьев (это примерно то же что делает ворд, когда предлагает варианты исправления опечатки).
Конечно попробую решить, но позже. Сначала абитуриентов добью, а то уже неделю ничего в них не правил, всё статейки в сети читаю да задачки решаю. Скоро и забуду уже что и как там (в абитуриентах) устроено.
Foreach почитаю, попробую, но пытался сделать способами, которые выдавались в уроках. На счет регулярного выражения и скобок, видимо запутался, думал, что после | отсчет заново начинается. Спасибо за помощь
Нашел, где в уроках говорилось про foreach. Мельком было и как-то не отложилось в памяти
\t$regexp = "/[!.?]/u";
\t$sent = preg_split($regexp, $text, 0, PREG_SPLIT_NO_EMPTY);
\tforeach ($sent as &$s) {
\t\t$s = trim($s);
\t\t$s = ucfirst($s);
\t}
\treturn $sent;
}
$k = makeFirstLetterUppercase($text);
var_dump($k);
Решаю первую задачу из раздела "Повторим?". Почему не получается сделать первую букву заглавной. Я чего-то не понимаю про функцию ucfrist?
ucfirst не работает с кириллицей в utf-8. Ее лучше вообще никогда не использовать. Урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Используй mb_substr и mb_strtoupper.
URL: http://example.com/test.php/foo/bar
[PHP_SELF] => /test.php/foo/bar
[SCRIPT_NAME] => /test.php
SCRIPT_NAME - путь к обрабатываемому файлу на web сервере (может быть include файл)
PHP_SELF - путь на web сервере к запрошенному юзером файлу (не include, только что юзер запросил)
__FILE__ - путь к обрабатываемому файлу в файловой системе (в том числе include )
И вот стоит у меня вопрос что мне делать дальше. Есть маленькая конторка в которую я могу пойти, там вроде в основном работают на зенде, но из того что я вижу быдлокод и велосипеды там цветут буйным цветом и я не уверен что смогу научиться там чему-нибудь хорошему. С другой стороны я могу продолжить обучаться сам и здесь в треде вместе со всеми, освоить yii и symfony и потом пробовать вкатываться во фриланс или в конторку посерьезней.
Короче не знаю я пока какой стул выбрать.
Сам я быдлоадмин в банке за три копейки 25го лвла, могу посвящать учебе большую часть рабочего дня. Жду советов мудрых
Мануал не отвечает на твой вопрос? http://php.net/manual/ru/reserved.variables.server.php
Попробуй сделать такой скрипт под именем test.php:
<?php
var_dump($_SERVER);
Вызови его так:
http://localhost/test.php/a/b/c
Посмотри на результат. В PHP_SELF и SCRIPT_NAME будут разные значения, как заметил выше >>523351
Ты можешь спросить, эй, а что это за /a/b/c ты приписал? Разве так можно? Да, можно, это древняя фича протокола CGI (которую перенял Апач) и она задумывалась для создания человекопонятных URL вроде /index.php/news/today
То, то дописано после имени скрипта (/a/b/c), идет в PATH_INFO.
>>523363
> путь к обрабатываемому файлу на web сервере (может быть include файл)
Ты ошибаешься.
>>523385
Если есть возможность, стоит смотреть в строну Symfony 2 и может быть фронтенда (ну все эти продвинутые JS фреймворки), с их знанием наверно можно найти работу получше. С другой стороны, слишком долго с обучением затягивать тоже не стоит.
Я кстати на Yii вообще никогда ничего не писал, просто знаю его чуть-чуть по документации и по тому что тут аноны на нем делали. Так что не знаю, стоит ли на него тратить время. С другой стороны, он распространен. С третьей стороны, те, кто на нем пишут, скорее всего пишут еще хуже чем те что на зенде.
Файлообменник, если это ты скидывал, тоже постараюсь глянуть.
Мануал не отвечает на твой вопрос? http://php.net/manual/ru/reserved.variables.server.php
Попробуй сделать такой скрипт под именем test.php:
<?php
var_dump($_SERVER);
Вызови его так:
http://localhost/test.php/a/b/c
Посмотри на результат. В PHP_SELF и SCRIPT_NAME будут разные значения, как заметил выше >>523351
Ты можешь спросить, эй, а что это за /a/b/c ты приписал? Разве так можно? Да, можно, это древняя фича протокола CGI (которую перенял Апач) и она задумывалась для создания человекопонятных URL вроде /index.php/news/today
То, то дописано после имени скрипта (/a/b/c), идет в PATH_INFO.
>>523363
> путь к обрабатываемому файлу на web сервере (может быть include файл)
Ты ошибаешься.
>>523385
Если есть возможность, стоит смотреть в строну Symfony 2 и может быть фронтенда (ну все эти продвинутые JS фреймворки), с их знанием наверно можно найти работу получше. С другой стороны, слишком долго с обучением затягивать тоже не стоит.
Я кстати на Yii вообще никогда ничего не писал, просто знаю его чуть-чуть по документации и по тому что тут аноны на нем делали. Так что не знаю, стоит ли на него тратить время. С другой стороны, он распространен. С третьей стороны, те, кто на нем пишут, скорее всего пишут еще хуже чем те что на зенде.
Файлообменник, если это ты скидывал, тоже постараюсь глянуть.
Иди лучше на бе считалочку создай, тугосеря.
Нет, перекатываться мы туда не будем. Хватит уже недотредов которые только сбивают всех с толку и содержат неправильные ссылки на предыдущий пост. Завтра сделаем нормальный тред. Картинку с котом впрочем может быть возьмем.
Не надо так говорить, может у него хорошие намерения и он просто пытался помочь треду. Но блин, ссылка на предыдущий пост указывает не туда, заголовка нет, привычной картинки нет, это людей только с толку сбивает. Лучше я чуть позже сделаю нормальный тред.
А это вообще жирнее некуда. Теперь точно нахуй, нахуй.
Привет, аноны. Мне стало интересно, вот вы тут учите:
>PHP (а также JS/CSS/HTML/SQL)
Разделение труда вообще существует? Допустим я хочу фрилансить, что-бы успешно этим заниматься мне нужно учить и вёрстку и пхп?
Бэкенд программерам нужны только основы верстки и базовые знания javascript/jquery. Обычно бэкендам верстку уже готовую дают, и самому верстать из psd не нужно. Фронтендам нужно хорошо знать верстку, углубленно javascript и кучу javascript библиотек для фронтенда. Если тебе в фронтенды, то лучше в треде по верстке сиди. Алсо, пикрелейтед. Синим там, что бэкенду нужно знать, остальное фронтендам.
Бэкенда полно разного же, в зависимости от выбранного языка/cms/фреймворка/библиотек. Там все в картинку не влезло бы. В треде тут стандартным для PHP программера инструментам учат, почитай сайт ОПа, поделай задания, понятнее станет.
Back-end это по большей части серверные дела, которые клиент не видит, front-end это уже то, что непосредственно видит клиент, и с чем взаимодействует, как мне думается
1. Это легитимный тред? Если нет, то киньте линк.
2. В общем, освоил основы пыхи, джс, джиквери, мускуль, теперь пора учить, то, что принесет мне трудоустройство и соответственно профит. План такой - делаю как говорят, в прочессе учусь\разбираюсь и следующим делаю уже свой проект. Вот решил по этому гайду заниматься https://github.com/githubjeka/yii2-tutorial
Кто что думает, особенно ОП, что можешь сказать после беглого взгляда.
Пока мы в этом треде, сегодня-завтра сделаем новый.
У нас есть задачки на студентов и файлообменник в оп-посте, их решают до фреймворков. Если ты точно уверен что знаешь то что в них изучается (работа с формами, таблицами, композер, ООП, MVC) то ты можешь их не решать, хотя я бы их как минимум посмотрел. Там много полезной информации.
Также, заметь, у нас в Оп посте есть задачки на SQL.
Туториал это неплохо но я бы параллельно читал официальную документацию.
По Yii2 у нас есть большая задачка на сайт с тестами. Ты можешь ее решать или делать свой проект, как хочешь.
Если хочешь, можешь потом показать код на проверку.
>>516349-кун снова репортинг ин
Взяли на работу с хайлоадом все-таки, хоть я вообще в нем ни в зуб ногой и половину вопросов на собеседовании завалил. Срочно им добить отдел программерами надо было, подходящих кандидатов мало. Через пару недель выходить. Сказали, что недостающему доучат, главное что основы знаю (тут отдельное спасибо ОПу за хорошие задания и внятные объяснения). Сижу теперь повторяю все перед работой, потом еще отпишусь.
Все что ты перечислил я знаю с гуглом и работал с этим. Даже свой минифреймворк написал, просто думаю вкатиться в ии2, потому интересно не пробовал ли кто по сей ссылке ходить до меня.
Пусть пишет, тут такие истории приветствуются.
Ну вот и хорошо, это твой шанс поучиться за счет работодателя.
Ты там выше писал что в SQL не очень разбираешься, я бы советовал прорешать наши задачки на SQL + для хайлоада обязательно конечно надо почитать про индексы:
https://gist.github.com/codedokode/10539213#Индексы
http://ruhighload.com/post/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%D0%B8+%D0%B2+MySQL
Ну и разумеется прочитай про нормализацию, внешние ключи и транзакции. Без этого людей нельзя даже близко подпускать к базам данных.
База данных зачастую это сердце приложения и надо в них хорошо разбираться.
Это если ты планируешь работать с SQL конечно. Если у вас NoSQL то стоит сделать упор на изучение того что там используется.
>>523933
Я этот туториал первый раз вижу.
>>523932
нет, тебе
Спасибо, порешаю. Нет, там не NoSQL, обычный MySQL, nginx и memcached.
>Сказали, что недостающему доучат, главное что основы знаю (тут отдельное спасибо ОПу за хорошие задания и внятные объяснения).
Ну тогда я спокоен за свою судьбу, лол. И спасибо тебе, что отписался.
Первая мысль естественно сохранять его в какой-нибудь невидимый элемент (или добавить свой атрибут).
Но может быть есть более корректные способы?
Я бы загуглил, не знаю что писать в поиске.
Какой гет в html? Я говорю о клике по дом-элементу.
Ну ладно, положу айдишник в какой-нибудь дополнительный атрибут. Подозреваю, что оп назовет это говнокодом, и мне придется переписывать.
Кстати, если прописать свои атрибуты в html, валидаторы будут ругаться?
...
Мне даже пришло в голову проверить: будут.
Error: Attribute fid not allowed on element div at this point.
Куда же тогда его засунуть?
А ты сам как сюда попал?
>>523983
Либо в data- аттрибуты либо в код вызова обработчика:
<button data-id="121212" data-name="asdada">Нажать!</button>
<button onclick="sendSomething(123, 'sadad')">Нажать!
При вставке данных в HTML/JS не забывай про грамотное испльзование htmlspecialchars/json_encode.
>>523989
Data-атрибуты специально для этого придуманы и HTML5 валидатор должен их пропускать.
О, действительно, я не знал.
http://htmlbook.ru/blog/atribut-data
>htmlspecialchars
Ну это как я понял только если мы собираемся выводить данные, записанные в базу от пользователя.
Я думаю, что в случае с айди или временной меткой это можно опустить (?полувопрос)
Нет, ты должен любые данные обрабатывать с помощью htmlspecialchars. Например символ & ты должен выводить как & а < как < — это правила HTML.
> Я думаю, что в случае с айди или временной меткой это можно опустить
Если число то можно пропустить их через intval, но с htmlspecialchars будет логичнее. И это для тебя должно быть привычкой. А если ты будешь использовать современный шаблонизатор вроде twig, он делает это сам.
Прочитай-ка мой урок про XSS:
https://github.com/codedokode/pasta/blob/master/security/xss.md
А также про html сущности:
http://www.w3.org/International/questions/qa-escapes.ru.php#use
специально вниз проматал, чтобы тыкнуть тебя носом в лужу.
Ты из дурки пишешь что ли?
Ты так не умеешь?
А у тебя что-то вроде портфолио было? Ну там задачки ОПовские, файлообменники, студенты и т.п.
Нет, ничего не было. Опыт эникеем был пару лет в шараге. Взяли только потому что хорошо на интервью отвечал про все эти отличия абстрактных классов от интерфейсов и трейтов от closures. Вопросов было реально много, практически по всем темам, БД, ООП, новые фичи PHP, css/html, javascript, jquery, git, системы деплоймента, юниттесты, линукс, memcached всякие, nginx, фреймворки, библиотеки, jira. Плавал я только в БД и фреймворках, остальное из ОПовых объяснений и чтения документации более-менее знал. В итоге сказали, что знаю больше, чем средний выпускник института, который к ним приходит, поэтому берут. Сказали еще, что не любят учить всему по сто раз заново с азов, поэтому когда готовый уже приходит и можно сразу сажать с заданиями в трекер разбираться, это плюс большой.
Нет. Wordpress ковырял под темплейты. Ну у них сказали фреймворка сейчас тоже не будет, избавляются постепенно, переписывая модули на чистый php.
jsfiddle, github
Это тупо, лучше github pages. там довольно легко залить.
http://maketi.esy.es/
В общем я попытался разобраться сначала с гитхамбом, но не смог, на jsfiddle я не понял как картинки добавлять, да и экран там не полный (или можно на полный развернуть, но я ни тем, ни другим сервисом не пользовался до этого), поэтому я решил сразу прислать вам в виде сайта, а вы уже сможете открыть код и посмотреть.
css я в индексном файле оставил, но ясное дело, что для него отдельный файл нужно создавать. Так же я не смог разобраться со словами в шапке, при большом уменьшении
экрана они скатываются вниз, так же я резко смещается вверх блок с серым фоном, который находится под портфолио, если уменьшается количество отображаемых работ в портфолио (при выборе категории работ ALL GRAPHIC и т.д.).
Хотелось бы услышать замечания по работе, так же помощь по устранению тех ошибок которые я совершил, но больше всего я хочу услышать о том как я пишу. Многое слышал о требованиях к читаемости кода. Вот и хочу знать читаем он у меня или нет. А то я просто новичок и это моя первая работа, перед этим только делал остальные 12 заданий из ссылки в ОП посте (сюда их правда не присылал, показывал их другу студенту-программисту, ОПа лишний раз нагружать уже не хотел).
><div style="height: 50px">
За такое в продакшне руки отрывают. Вам дали css файл, так нет, вылавливайте разрабы потом по коду эти инлайны.
><center>
>The <center> tag is not supported in HTML5. Use CSS instead.
Как думаете, это битрикс-параша или нет?
Ясное дело. К тому же жмотистая веб-студия без перспектив, судя по объяве. Идти стоит, только если совсем отчаялся работу найти.
Так что вот так : >>524402 .
Решение одной из задач.
Но ведь битрикс используется даже в студии Лебедева.
>>524403
Справедливости ради, они идут на уступки. Судя по требованиям подходят даже люди со знанием уровня кодеакадеми и видеокурсов. Впрочем, если там есть хороший тимлид-надсмотрщик то все может получиться.
Ну и хочу, пользуясь возможностью, напомнить, мое мнение, что видеокурсы для программиста это абсурд. Я понимаю видеоуроки типа «как поменять обои в виндоус» для обычных, непрофессиональных пользователей. Но если ты хочешь стать программистом, ты не должен опускаться до уровня блондинки которой надо показать какую кнопку нажать. Видеокурс! По программированию!
Не ведитесь на это аноны. Те, кто делают такие курсы, просто пытаются кажущейся простотой заманить как можно больше человек (например с целью продать им курс). У них нет цели подготовить хорошего специалиста, у них цель получить ваше внимание и ваши деньги.
Программированию нельзя обучиться, повторяя чьи-то действия, это (пока еще) не работа сборщика на конвеере. Здесь надо уметь думать.
Справедливости ради, мой учебник тоже пытается выглядеть простым, чтобы заманить побольше читателей. Но в дальнейшем более сложные задачи отсеивают тех кто просто хочет повторять увиденное.
Содержание страницы обычно в базе, шаблоны на диске. Надо было почитать докуменацию наверно.
html код обычо можно найти через админку цмс. Там он не всегда в явной форме написан, иногда бывает собственный язык разметки, который в админке прикрепляется к страничке в виде ее темплейта. Вот этот темплейт открываешь и редактируешь на языке цмс, по нему длинная дока есть. А цмс уже его преобразует в html при выводе.
А ты бы советовал туда сходить? Или лучше подтянуть свой уровень и искать места получше?
В дешевой веб-студии обычно под копирку за пару дней лепят однотонные сайты на битриксе или вордпрессе каком-нибудь. Особо многому ты там не научишься, потому что ни ООП, ни работы с БД, ни оптимизаций там не будет, будет сплошной копипаст одного и того же шаблона изо дня в день. Идти стоит, если бывают проекты, которые от месяца занимают и где в самом деле программировать надо. Так что если пойдешь, разузнавай на интервью, чем именно они занимаются, что за тулзы используют и какого типа проекты бывают.
Может он будет какие-то внтренние тулзы писать. Стоит идти или не стоит, зависит от твоей ситуации, с другой стороны слишком долго учиться тоже не очень полезно.
Как я понимаю в маппер нужно запихнуть все функции, которые работают с БД напрямую. А в классе абитуриента тогда что останется, только переменные? В маппере для обновления каждого свойства абитуриента нужно делать разные функции, или это все можно объединить в одну функцию? И не совсем понятно как выводить поля с абитуриентами в таблицу. Их всех нужно будет в один массив запихнуть или перебирать по одному и выводить?
Или может еще что-то можно почитать или сделать, прежде чем начинать это задание делать?
>Как я понимаю в маппер нужно запихнуть все функции, которые работают с БД напрямую.
Маппер это объект который загружает и сохраняет другие объекты (Студентов) в/из базы. Так что да, работать с базой надо через него.
> А в классе абитуриента тогда что останется, только переменные?
да
> В маппере для обновления каждого свойства абитуриента нужно делать разные функции, или это все можно объединить в одну функцию?
Можно объединить. На практике тебе не нужно обновлять отдельные свойства, тебе надо обновить все и функция выглядит примерно так:
$mapper->save($abiturient);
> И не совсем понятно как выводить поля с абитуриентами в таблицу. Их всех нужно будет в один массив запихнуть или перебирать по одному и выводить?
Что значит отдельные поля? У тебя есть массив объектов-абитуриентов, в шаблоне перебираешь их в цикле и выводишь:
<?php foreach (...): ?>
Имя: <?= htmlspeialchars($abiturent->name) ?>
И так далее.
> Или может еще что-то можно почитать или сделать, прежде чем начинать это задание делать?
Прочитать внимательно примечания к задаче.
Эмм, а в чем принципиальное отличие видеоуроков от текстовых? Все тоже самое, только более подробно и наглядно. Ну и плюс иногда наблюдать за тем как шарящий человек работает гораздо полезнее, чем зубрить голую теорию.
На heroku.com зарегай бесплатный акк и погоняй там свой сайт, так проще всего. Потом проапгрейдишь до платного, если понадобится. Кроме heroku еще горы бесплатных хостингов есть, вот тебе целая куча http://www.free-webhosts.com/free-php-webhosting.php Дома скорее всего не сможешь, многие провайдеры блочат порт 80, скорость на отдачу низкая, ip меняется, домашний роутер кучу одновременных запросов не выдержит.
Что происходит, если в настройках роутера поменять мак-адрес wan?
http://linkmeup.ru/blog/11.html
>Что происходит, если в настройках роутера поменять мак-адрес wan?
Сменится мак роутера. Если провайдер привязывает акк к маку, то не сможешь больше зайти в инет, пока провайдеру новый мак-адрес не сообщишь. Если не привязывает, то просто будет оборудование провайдера новый мак-адрес видеть. В инет твой мак-адрес не уходит, теряется на первом же роутере.
>видеокурсы для программиста это абсурд
Согласен. Но видеокурсы делают не для программистов, а для тех, кто хочет им стать, но не написал за всю жизнь ни строки кода, и не имеет ни малейшего представления о программировании. Многим катастрофически не хватает демонстрационных примеров. Вот только для этого и существуют видеокурсы. Посмотреть, как оно работает, получить общее представление, и уже за подробностями лезть в ублюдочную техническую документацию, которую как я начинаю подозревать пишут даже не люди, а генерируют боты.
У тебя в универе была высшая математика? Что, сразу после лекций гнали на экзамен решать интегралы? Или может все-таки были практические занятия?
В конце концов психически здоровым людям всегда приятнее воспринимать информацию на слух, слышать голос другого человека.
>ублюдочную техническую документацию, которую как я начинаю подозревать пишут даже не люди, а генерируют боты
Документация обычно охватывает все случаи применения какой-нибудь функции или технологии, т.е. раскрыт весь потенциал. Для разбирающихся в основных понятиях людей очень удобно, не нужно рыться в разных местах, можно вникнуть за 5 минут. В курсах обычно учат только поверхностно и небольшой части возможностей и внутренних механизмов, полного понимания, как и что работает у тебя не будет.
>психически здоровым людям всегда приятнее воспринимать информацию на слух, слышать голос другого человека
О типах людей слышал? Есть визуалы, есть аудиалы, есть кинестетики. Программисты как раз чаще визуалы. На слух воспринимаются подобные темы визуалами довольно тяжело.
Задротская нечитабельная херня.
>Мы понимаем, что для новичков «OSI» и «TCP/IP» — это страшные слова.
Самоутверждение.
>Начнём с постановки задачи. Есть некая фирма, занимающаяся, допустим, производством лифтов, идущих только вверх, и потому называется ООО «Лифт ми ап». Расположены они в старом здании на Арбате, и сгнившие провода, воткнутые в пожжёные и прожжёные коммутаторы времён 10Base-T не ожидают подключения новых серверов по гигабитным карточкам. Итак, у них катастрофическая потребность в сетевой инфраструктуре и денег куры не клюют, что даёт вам возможность безграничного выбора. Это чудесный сон любого инженера. А вы вчера выдержали собеседование, и в сложной борьбе по праву получили должность сетевого администратора. И теперь вы в ней первый и единственный в своём роде. Поздравляем!
Что за галиматью я читаю? Я спросил про основные термины из области системного администрирования, ты мне подсунул какую-то парашу.
>аудиалы
Самоназвание аутистов?
Любой человек, неспособный к общению и информационному обмену, это больной человек.
http://www.intuit.ru/studies/courses/2/2/info
http://www.intuit.ru/studies/courses/509/365/info
http://www.intuit.ru/studies/courses/3688/930/info
Попробуй тут тогда, там более доступно излагают.
О, это уже получше. Сразу видно, профессиональные преподаватели, снисходят до объяснения тех терминов, которые употребляют, а не посылают на гугл или в википедию.
Вот допустим в википедии я хочу почитать про эту самую модель OSI, о которой я так много слышал. Что я вижу?
>Сетевая модель OSI (базовая эталонная модель взаимодействия открытых систем, сокр. ЭМВОС; 1978 год) — сетевая модель стека сетевых протоколов OSI/ISO (ГОСТ Р ИСО/МЭК 7498-1-99).
Ну офигеть теперь. Я не знаю, что они подразумевают под "моделью", что такое "открытые системы", что такое "стек", что такое "протокол" понимаю смутно, имея базовые знания только по http. Как ты думаешь, полезна для меня эта статья?
У интуита по крайней мере делаются попытки объяснять те важные термины, которые они употребляют.
В первой же лекции например дается определение открытой системы. http://www.intuit.ru/studies/courses/2/2/lecture/28
Так что здесь ни к чему не могу придраться. Придется читать.
Жаль только, что в текстовом виде. В аудио/видеоформате я мог бы послушать и на толчке, и за едой.
Спасибо, остановлюсь таки на интуите.
У специалиста действительно то, что ты говорил: затягивание времени с целью выкачать деньги, много пауз, разговоры не по теме, иногда сёрбанье кофейка и сморкание в микрофон.
И это у Борисова, который там лучший лектор.
Но объясняет хорошо, без его курсов я бы не осилил самостоятельно учиться по документации, как ты советуешь.
> что такое "открытые системы"
https://ru.wikipedia.org/wiki/Открытая_система_(информатика)
> что они подразумевают под "моделью"
https://ru.wikipedia.org/wiki/Эталонная_модель
>что такое "стек"
https://ru.wikipedia.org/wiki/Стек
> что такое "протокол" понимаю смутно
https://ru.wikipedia.org/wiki/Протокол_передачи_данных
Все ответы есть в той же википедии.
Протокол это описание способа и языка передачи данных. Ну в случае интернета, описывается например формат пакета с данными, из каких байтов он состоит и что они обозначают. Какие пакеты можно передавать и как. Вот например в статье про протокол IP приведен пример IP-пакета: https://ru.wikipedia.org/wiki/IP#.D0.9F.D0.B0.D0.BA.D0.B5.D1.82
Стек это вот такая штука:
http://www.usaypt.org/USIYPT%202014/USIYPT14%20Problems/USIYPT14problems%20images/Magnet%20Stack.png
Есть еще структура данных стек, вот такая: http://www.cs.cmu.edu/~adamchik/15-121/lectures/Stacks%20and%20Queues/pix/stack.bmp которая тут отношения никакого не имеет.
В данном случеа «стек протоколов» значит что один протокол работает поверх другого, а другой поверх третьего. Например протокол HTTP соединяется с сервером с помощью TCP, а тот использует IP для передачи пакетов по интернету, а IP использует какой-то протокол физического уровня (например Ethernet, передающий данные в виде электрических сигналов в кабеле).
Модель OSI соответсвтенно разделяет стек (набор использующих друг друга) протоколов на уровни, начиная от низкоуровневых, физичсеских, опсиывающий принципы передачи данныех по кабелю, оптоволокну или телефонной сети, и до высокоуровневых, с которыми работает приложение.
OSI это абстрактная модель, и в реальности часть уровней из нее может не использоваться.
Мы разбиваем протоколы на уровни чтобы разбить на части описание способа передачи данных по сети (иначе все будет слишком сложно) и дать возможность подменять нижележащие протоколы не трогая вышележащие. Например, если мы заменим кабель на оптоволокно, меняется только протокол физического уровня (который определяет как биты кодируются электрическими сигналами или лазерными импульсами), а вышележащие протоколы мы используем те же так как они не знают по какой среде передается сигнал, а просто передают протоколу физического уровня набор байт которые надо передать.
https://github.com/nsdvw/file-sharing
Пробовал выложить на бесплатный хостинг, но там (hostinger) куча проблем. InnoDB видите ли они не поддерживают. Пришлось убрать внешние ключи и транзакции. Все равно почему-то не работает (я имею ввиду, нельзя загрузить файл). Залил пока несколько файлов по ftp, залил базу, чтобы было хоть что смотреть. Библиотека gd, которая у меня рисует превью для картинок, у них тоже походу какая-то неправильная.
Короче, ОНО НЕ РАБОТАЕТ, а куда смотреть и что исправлять не знаю. phpinfo очевидно, но мне эта информация ни о чем не говорил. А хотелось бы разбираться в этих наскальных надписях.
http://filesharing.pe.hu/info.php
В логах ничего нет. Про логгирование я кстати тоже не в курсе. Мне нужно что-то прописывать в коде, чтобы велись логи, или они всегда есть у администратора, только нужно ждать когда их скопируют мне в папку?
В чем может быть причина? Какие еще кроме транзакций и внешних ключей отличия InnoDB от MyISAM?
Что я еще использовал:
finfo, getId3, mod_rewrite
Да нет, эти вещи вроде не могут вызвать проблем.
Там что-то именно с загрузкой файлов. Только что отключил джаваскрипт, который аяксом отправлял запрос, выдает теперь голую страницу с надписью
Access denied.
Интересно.
О, теперь слим выдает ошибку Only variables should be passed by reference
При чем тут передача переменных по ссылке? Нету там такого.
Файлы не скачиваются, вернее сохраняются пустышки по 0 байт.
Хуйня короче какая-то.
А, ну в целом как я и думал, прежде всего транзакции и внешние ключи.
Так что тут не в этом дело.
Тут именно что-то с загрузкой файлов. Не понимаю. Где там у меня ссылка?
ААА.... в bindParam передается в качестве аргумента результат работы другой ф-ции, в данном случае json_encode.
Кажется, оп говорил мне об этом когда-то, но я прослушал. Да и у меня на локалочке все работает, а у этих редисок видите ли нет. Где находится настройка, которая отвечает за это дело? Как вообще привести свой локальный сервер к "стандартному" что ли виду?
Ставил апт-гетом на убунту, ничего не менял.
Ну вот, нормально объяснил, это я понимаю. Если бы так везде писали.
Ты эти пасты сохраняй, а еще лучше добавляй к своему бложику на гитхабе или народ.ру.
Я например физически не в состоянии запоминать все с первого раза, нужно перечитывать по несколько раз.
Под самим видео на ютубе есть ссылка поделиться->html-код. Там получаешь готовый айфрейм, который можно скопипастить. Если автор видео не запретил встраивание, конечно.
В cms должны быть всякие виджеты, или как они там называются. В вордпресс это шорткод embed https://codex.wordpress.org/%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2
>>524520
> В логах ничего нет. Про логгирование я кстати тоже не в курсе
На хостингах обычно либо есть папка с логами, доступная по FTP либо просмотр логов в личном кабинете.
Но бесплатный хостинг на то и бесплатный чтобы не заморачиваться такими вещами: http://www.hostinger.ru/baza-znaniy/615.html
Но судя по phpinfo это неверно и логи все же ведутся.
Ты можешь попробовать задать путь к логу явно, указав в начале index.php:
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/log.txt');
Или ты можешь попробовать поискать другой хостинг. Но опять же, судя по phpinfo все логгируется.
> InnoDB видите ли они не поддерживают.
Бесплатный хостинг такой бесплатный.
> а куда смотреть и что исправлять не знаю
Либо в логи либо на крайний случай включить display_errors, поставить error_reporting(-1) и отлаживать.
> Какие еще кроме транзакций и внешних ключей отличия InnoDB от MyISAM?
http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D1%8F+innodb+myisam
> О, теперь слим выдает ошибку Only variables should be passed by reference
Посмотри в каокй строке и какой там код. Это может быть вызвано старой версией php например.
> Файлы не скачиваются, вернее сохраняются пустышки по 0 байт.
Потому что нет модуля sendfile. Можешь сделать проверку есть ли такое расширение на сервере ( функция http://php.net/manual/ru/function.apache-get-modules.php но она может быть запрещена администратором) и если нет то отдавать файл через readfile.
> А хотелось бы разбираться в этих наскальных надписях.
Это просто информация о конфигурации, включенныхмодулях, и настройках, заданных для php. Они описаны например тут: http://php.net/manual/ru/ini.php
http://filesharing.pe.hu/info.php
Сделай поиск по слову error:
> error_log\t/home/u448009642/.logs/php_error.log
Вот и ответ где логи. Имей в виду что папки с точки в линуксе невидимые и могут не везде показываться (на доступ это не влияет).
> error_reporting\t32759
Я бы поставил E_ALL на всякий случай
>>524524
500 ошибка это как правило ошибки или запрещенные директивы в .htaccess
>>524539
В bindParam нельзя передавать выражения. Иди почитай мануал для начала: http://php.net/manual/ru/pdostatement.bindparam.php
Вообще в 99% случаев нужен bindValue (в которой можно передавать любые выражения), зачем ты вообще тут bindParam используешь? Он используется обычно для вызова хранимых процедур, чтобы база могла вернуть какое-то значение, а оно бы записалось обратно в привязанную переменную. тебе это вообще не нужно.
В многих статьях в интернете тоже кстати bindParam вместо bndValue используют — их авторы неучи-копипастеры.
> . Да и у меня на локалочке все работает, а у этих редисок видите ли нет.
Тебе надо проверить свою локалочку. может ты просто не видишь предупреждений и логи не читаешь? Тут ошибка в твоем коде.
> Как вообще привести свой локальный сервер к "стандартному" что ли виду?
Настройки по умолчанию, можно включить display_errors либо читать логи, error_reporting поставить в E_ALL или -1 (фиксировать любые ошибки).
>>524547
Ок, я наверно сегодня не успею, давай завтра проверю. у тебя явно есть ошибки, так как в моем фаерфоксе из 4 колонок четвертая переносится на новую строку, как проверю, скажу почему. Ты все предыдудщие задачи на HTML решил ведь?
>>524555
Для тестирования 8 мб хватит
>>524570
1) https://developers.google.com/youtube/player_parameters?hl=ru
2) универсальный способ с использованием стандарта oembed: http://oembed.com/ http://habrahabr.ru/post/141303/
>>524520
> В логах ничего нет. Про логгирование я кстати тоже не в курсе
На хостингах обычно либо есть папка с логами, доступная по FTP либо просмотр логов в личном кабинете.
Но бесплатный хостинг на то и бесплатный чтобы не заморачиваться такими вещами: http://www.hostinger.ru/baza-znaniy/615.html
Но судя по phpinfo это неверно и логи все же ведутся.
Ты можешь попробовать задать путь к логу явно, указав в начале index.php:
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/log.txt');
Или ты можешь попробовать поискать другой хостинг. Но опять же, судя по phpinfo все логгируется.
> InnoDB видите ли они не поддерживают.
Бесплатный хостинг такой бесплатный.
> а куда смотреть и что исправлять не знаю
Либо в логи либо на крайний случай включить display_errors, поставить error_reporting(-1) и отлаживать.
> Какие еще кроме транзакций и внешних ключей отличия InnoDB от MyISAM?
http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D1%8F+innodb+myisam
> О, теперь слим выдает ошибку Only variables should be passed by reference
Посмотри в каокй строке и какой там код. Это может быть вызвано старой версией php например.
> Файлы не скачиваются, вернее сохраняются пустышки по 0 байт.
Потому что нет модуля sendfile. Можешь сделать проверку есть ли такое расширение на сервере ( функция http://php.net/manual/ru/function.apache-get-modules.php но она может быть запрещена администратором) и если нет то отдавать файл через readfile.
> А хотелось бы разбираться в этих наскальных надписях.
Это просто информация о конфигурации, включенныхмодулях, и настройках, заданных для php. Они описаны например тут: http://php.net/manual/ru/ini.php
http://filesharing.pe.hu/info.php
Сделай поиск по слову error:
> error_log\t/home/u448009642/.logs/php_error.log
Вот и ответ где логи. Имей в виду что папки с точки в линуксе невидимые и могут не везде показываться (на доступ это не влияет).
> error_reporting\t32759
Я бы поставил E_ALL на всякий случай
>>524524
500 ошибка это как правило ошибки или запрещенные директивы в .htaccess
>>524539
В bindParam нельзя передавать выражения. Иди почитай мануал для начала: http://php.net/manual/ru/pdostatement.bindparam.php
Вообще в 99% случаев нужен bindValue (в которой можно передавать любые выражения), зачем ты вообще тут bindParam используешь? Он используется обычно для вызова хранимых процедур, чтобы база могла вернуть какое-то значение, а оно бы записалось обратно в привязанную переменную. тебе это вообще не нужно.
В многих статьях в интернете тоже кстати bindParam вместо bndValue используют — их авторы неучи-копипастеры.
> . Да и у меня на локалочке все работает, а у этих редисок видите ли нет.
Тебе надо проверить свою локалочку. может ты просто не видишь предупреждений и логи не читаешь? Тут ошибка в твоем коде.
> Как вообще привести свой локальный сервер к "стандартному" что ли виду?
Настройки по умолчанию, можно включить display_errors либо читать логи, error_reporting поставить в E_ALL или -1 (фиксировать любые ошибки).
>>524547
Ок, я наверно сегодня не успею, давай завтра проверю. у тебя явно есть ошибки, так как в моем фаерфоксе из 4 колонок четвертая переносится на новую строку, как проверю, скажу почему. Ты все предыдудщие задачи на HTML решил ведь?
>>524555
Для тестирования 8 мб хватит
>>524570
1) https://developers.google.com/youtube/player_parameters?hl=ru
2) универсальный способ с использованием стандарта oembed: http://oembed.com/ http://habrahabr.ru/post/141303/
Еще есть спецификация oembed, если ее поддерживать то можно видео с любого совместимого сайта встраивать:
http://habrahabr.ru/post/141303/
Все 12 задач по CSS у меня решены, только решения я сюда не присылал, их проверял мой знакомый студент-программист. А насчет 4го блока странно, у меня ни в одном браузере такого нету и у двух моих друзей которых я просил проверить работоспособность тоже ничего не крашилось.
Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать нажимающимися, чтобы они сохраняли свое состояние. Можно использовать невидимые радиокнокпи + css3.
Код из блока style надо вынести в внешний css-файл и подключать через тег <link>
> <img src="img/rss.png" class="boll1">
Все картинки относящиеся к дизайну надо делать через background-image в CSS. Тег img используется только для картинок в содержимом статьи (фото, иллюстрации) или в твоем случае, для каритинок в портфолио.
Мелкие однотипные иконки желательно объединить в css спрайт.
Имена классов мне не нравятся. Что за bool1? Давай нормальные читабельные имена вроде social-icons
> "bb_first_line
Обычно через дефисы пишут идентификаторы в CSS
> <div class="text1">
>\t\t\t<b>Our Features Works</b>
Тег b не используется так как внешний вид текста должен задаватся в CSS, а теги задают смысл этого текста. В днном случае текст это заголовок и должен использоваться один из тегов h1-h6
> overflow-x:hidden;
Либо объясняй зачем это либо удаляй
> .shapka {
Не пиши транслитом, не знаешь английского используй гугл транслейт или яндекс-словари.
> font: 12px "Open Sans", Arial, sans-serif;
Нужен @font-face инае шрифт не будет работать у тех у кого не установлен на компьютере.
> .second_block
Нужно более понятное и объясняющее название
> <p><a name="link_portfolio"></a></p>
Уже лет 10 можно вместо name просто приписвыать атрибут id к любому тегу. Старый учебник читал?
> GRAPHIC
Капс лок надо делать не в тексте а через text-transform
В портфолио, лучше не делать по несколько копий каждой картинки, а помечать css классами к каким разделам она относится.
> <div class="clear"></div>
Почитай про clearfix и microclearfix hack: http://nicolasgallagher.com/micro-clearfix-hack/
В общем, тебе тут еще много чего исправлять.
Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать нажимающимися, чтобы они сохраняли свое состояние. Можно использовать невидимые радиокнокпи + css3.
Код из блока style надо вынести в внешний css-файл и подключать через тег <link>
> <img src="img/rss.png" class="boll1">
Все картинки относящиеся к дизайну надо делать через background-image в CSS. Тег img используется только для картинок в содержимом статьи (фото, иллюстрации) или в твоем случае, для каритинок в портфолио.
Мелкие однотипные иконки желательно объединить в css спрайт.
Имена классов мне не нравятся. Что за bool1? Давай нормальные читабельные имена вроде social-icons
> "bb_first_line
Обычно через дефисы пишут идентификаторы в CSS
> <div class="text1">
>\t\t\t<b>Our Features Works</b>
Тег b не используется так как внешний вид текста должен задаватся в CSS, а теги задают смысл этого текста. В днном случае текст это заголовок и должен использоваться один из тегов h1-h6
> overflow-x:hidden;
Либо объясняй зачем это либо удаляй
> .shapka {
Не пиши транслитом, не знаешь английского используй гугл транслейт или яндекс-словари.
> font: 12px "Open Sans", Arial, sans-serif;
Нужен @font-face инае шрифт не будет работать у тех у кого не установлен на компьютере.
> .second_block
Нужно более понятное и объясняющее название
> <p><a name="link_portfolio"></a></p>
Уже лет 10 можно вместо name просто приписвыать атрибут id к любому тегу. Старый учебник читал?
> GRAPHIC
Капс лок надо делать не в тексте а через text-transform
В портфолио, лучше не делать по несколько копий каждой картинки, а помечать css классами к каким разделам она относится.
> <div class="clear"></div>
Почитай про clearfix и microclearfix hack: http://nicolasgallagher.com/micro-clearfix-hack/
В общем, тебе тут еще много чего исправлять.
Собираюсь пилить faceted search на базе примерно 150к записей. Но не знаю на чем, ElasticSearch или Sphinx.
Можешь что-то посоветовать? Я пока склоняюсь к первому, но материала кроме официальной документации хрен найдешь.
sphinx проще в установке, меньше и компактнее. Если он соответствует твоим требованиям и если тесты покажут достаточную производительность, можно его использовать.
С ES не работал.
Выходит MongoDB вообще нигде не нужен? Практически везде же есть реляционность данных и все преимущества перед MySQL исчезнут.
Вот тут описаны преимущества монго дб: http://www.mongodb-is-web-scale.com/
А вообще, на монге можно выжать большую производительность (пожертвовав надежностью, транзакциями и связями) и она масштабируется на несколько серверов, если например ты делаешь высоконагруженную игру для соцсети то может быть она тебе поможет, хотя я не использовал ее в таких сценариях (но данные о платежах я бы все же хранил в SQL базе). Тут стоит почитать доклады компаний типа мэйл ру или разработчиков игр которые такие нагруженные приложения делают и посмотреть что они исопльзуют. Справедливости ради, у MySQL тоже есть какой-то драйвер для испльзования ее в режиме NoSQL и работы с InnoDB напрямую:
HandlerSocket - http://habrahabr.ru/post/239637/
Ну и у MySQL тоже есть кластер и он выдает неплохие цифры в бенчмарках в NoSQL режиме (и он вроде бесплатный): http://www.mysql.com/why-mysql/benchmarks/mysql-cluster/
Вообще по моему монга это больше какая-то хипстерская и экспериментальная штука (мое оценочное суждение).
>>524965
Спасибо, все понятно с монгой теперь. А что про Postgresql? Лучше он Mysql с дополнениями или сравнимы? Вот тут пишут Postgresql монгу по производительности уделал и всем его теперь юзать
http://www.enterprisedb.com/postgres-plus-edb-blog/marc-linster/postgres-outperforms-mongodb-and-ushers-new-developer-reality
Чому тогда до сих пор везде Mysql в основном в объявлениях?
Ну держи миддила: http://e4e5group.com/#vacancies
Просто мне эти ссылки в рекламе показываются, я подумал, что людям деньги зря тратить, я их бесплатно (увы:( ) попиарю.
Можешь оценить например какие технологии стоит изучать, посмотреть что другие кандидаты пишут.
<input type="radio" name="odin" checked="checked" id="vkl1"><label for="vkl1"><span class="b_all">ALL</span></label>
Как мне сделать ксс спана при чекнутом инпуте?
input:nth-of-type(1):checked + label > span не помогает, хотя с виду все выглядит рабочим.
Полный код здесь maketi.esy.es
Вопрос отменяется. Починил, проблема была в другом.
Скобки нужно экранировать бекслешем, как и любой спецсимвол типа \?, \.
Выучи сначала синтаксис, не хватайся за задачи, если не знаешь языка регулярных выражений.
Задачи нужно решать только для закрепления знаний.
Понял, спасибо. А вообще там так же написано что скобки можно искать так-же загнав их в квадратные, вот я и пытался с помощью квадратных.
Как вытащить значение таблицы в таблице?
ОП, или кто бы то ни было, что у вас есть по вордпресс? Хочу серьезно разобраться с этой сучкой, нужно все что есть.
Извиняюсь за свою тупость, но можно чуть подробнее пожалуйста.
Все тот же школьник пытающийся в пхп
У тебя функция mt_rand () генерирует случайное число, но оно никуда не записывается. Запиши ее в переменную и тогда уже можешь выводить. Выглядеть это должно примерно так:
$mt_rand = mt_rand (1, 6);
Благодарю
https://github.com/Integer64/myTestSite.dev/tree/master/CatMouse
Подскажи как реализовать поедание кошки мышкой?
Придется передавать ссылку на объект Field в объект Cat?
> Придется передавать ссылку на объект Field в объект Cat?
Эта ссылка нужна, как без нее кошка будет ориентироваться и знать кто где находится?
У тебя сдеално вот так:
> public function lookAround(SplObjectStorage $listOfAnimals)
И это не правильно по моему так как у тебя в программе ходят какие-то списки животных которые надо поддерживать в актуальном состоянии. Лучше при добавлении животного на карту передавать ему ссылку на Field, а через нее оно может видеть что вокруг.
Поедание можно сделать так: кошка при ходе на клетку, проверяет какое животное на ней нахолится:
- мышка — снимаем ее с карты и съедаем
- кошка или собака - значит ошибка в программе
> if (spl_object_hash($animal) === $this->hashOfAnimal) continue;
Объекты можно сравнивать через ===, тебе не нужны хеши: http://php.net/manual/ru/language.oop5.object-comparison.php
бамп
Решил что настало время все-таки подтянуть матчасть, потому что есть много пробелов.
Так что выделю на это несколько недель.
Первые пять заданий на html.
1) 1 задание.
Вариант 1 с дивами-обертками:
http://jsfiddle.net/c62zkf53/3/
Вариант 2 с box-sizing:
http://jsfiddle.net/c62zkf53/2/
Насколько я понял, первый вариант предпочтительнее, потому что префиксы браузеров -moz-, -webkit- и им подобные не любит валидатор.
2) http://jsfiddle.net/2zpm9mqa/
3) http://jsfiddle.net/t5pmcLb5/1/
>из тегов можно использовать только <em>
Это почему? При чем тут вообще em? Чтобы показать, что стили любого элемента можно переопределить?
Не понял задание.
4) http://jsfiddle.net/frksyugb/
Чего мне jsfiddle подсвечивает красным закрывающие теги </div>? А, у них там принято писать <br/> под xhtml, поэтому разметка ломается.
Не понял, как должен по заданию себя вести синий блок при малой ширине браузера.
5) http://jsfiddle.net/pnm2jrto/
6) http://jsfiddle.net/8mk9bc62/
7) Откуда-то берется один лишний пиксель. Пришлось поставить дробное число в паддинг. http://jsfiddle.net/3z6zpu9b/2/
8) > верстка должна позволять без изменения CSS дописать или убрать любое число абзацев, списков, заголовков, картинок и примечаний
Не понимаю, что имеется ввиду. Намек на выпадение плавающего блока? Решается заданием padding у параграфа.
http://jsfiddle.net/vhm7wnh7/
?php
function longdate($timestamp)
{
\treturn date("l F jS Y", $timestamp);
}
?>
Аффтар грит, что функция должна вернуть дату в определенном формате, а у меня пусто (может пропущен echo или print в этом коде)?
>Пагни, знакомлюсь с PHP по книжке Роберта Никсона "Создаем динамические вэб сайты с помощью
Выбрасывай её нахуй.
Устаревший код, устаревший подход к программированию. ООП нет, паттернов нет, примеры кода - процедурная каша.
В коде описывается функция. Описывается, но нигде не вызывается. Сперва ты описал функцию, потом её надо вызвать, например хотя-бы так echo имяфункции(аргумент);
Надо вызвать функцию например написать ниже:
echo longdate(time());
В учебнике из Оп поста кстати это объясняется + есть урок по датам/времени в PHP: https://gist.github.com/codedokode/10539805
Песец, просто песец! Сплошные "не баг, а фича".
Я бы не сказал что они сложные для знающего JS программиста. Может просто к ним не прилагается уроков которые постепенно ко всему подводят? А ты читаешь учебник на learn.javascript.ru? В нем все что нужно для решения задач, объясняется.
Если зашел в тупик, запости код и напиши где остановился, дадим подсказку или ссылку на мануал.
Ссылок на мануал будет достаточно. Я прочёл только первые три главы (Введение..Качество кода).
Смог родить только вот что: https://jsfiddle.net/xc616ono/
Это чудо работает только если выполняются следующие условия: 1) у нас один генератор; 2) его имя "generator".
Прочитай про локальные переменные и слово var: https://learn.javascript.ru/variables
Также, придется прочитать про замыкания. Это немного сложно но ты ведь не полный ноль, ты php знаешь и тебе можно давать вещи посложнее чем новичкам: https://learn.javascript.ru/closures
Если кратко то в JS любая функция в момент создания захватывает (замыкает в себе) ссылки на переменные снаружи нее. Вот пример:
function createNewFunc()
{
var i = 5; // внешняя по отношению к testFunc переменная
var testFunc = function () { return i; }; // создаем новую функцию
return testFunc;
}
var x = createNewFunc();
// в x лежит функция testFunc которая захватила ссылку на переменную i
var y = x(); // вызываем функцию
console.log(y); // 5
При этом разумеется в месте вызова функции переменная i не видна (так как это локлаьная переменная в createNewFunc):
console.log(i); // ошибка о несуществующей переменной
Прочти про замыкания и разбери этот пример.
То есть тебе придется пока начать с теории, прежде чем хотя бы первую задачу решить. Зато если ты это пройдешь то будешь хорошо понимать JS и он не будет вызыват удивления.
Прочитай про локальные переменные и слово var: https://learn.javascript.ru/variables
Также, придется прочитать про замыкания. Это немного сложно но ты ведь не полный ноль, ты php знаешь и тебе можно давать вещи посложнее чем новичкам: https://learn.javascript.ru/closures
Если кратко то в JS любая функция в момент создания захватывает (замыкает в себе) ссылки на переменные снаружи нее. Вот пример:
function createNewFunc()
{
var i = 5; // внешняя по отношению к testFunc переменная
var testFunc = function () { return i; }; // создаем новую функцию
return testFunc;
}
var x = createNewFunc();
// в x лежит функция testFunc которая захватила ссылку на переменную i
var y = x(); // вызываем функцию
console.log(y); // 5
При этом разумеется в месте вызова функции переменная i не видна (так как это локлаьная переменная в createNewFunc):
console.log(i); // ошибка о несуществующей переменной
Прочти про замыкания и разбери этот пример.
То есть тебе придется пока начать с теории, прежде чем хотя бы первую задачу решить. Зато если ты это пройдешь то будешь хорошо понимать JS и он не будет вызыват удивления.
>Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать нажимающимися, чтобы они сохраняли свое состояние.
Готово.
>Код из блока style надо вынести в внешний css-файл и подключать через тег <link>
Готово.
>Все картинки относящиеся к дизайну надо делать через background-image в CSS
Готово.
>Имена классов мне не нравятся. Что за bool1? Давай нормальные читабельные имена вроде social-icons
Заменил.
>Обычно через дефисы пишут идентификаторы в CSS
Переделал.
>Тег b не используется так как внешний вид текста должен задаватся в CSS, а теги задают смысл этого текста. В днном случае текст это заголовок и должен использоваться один из тегов h1-h6
Переделал.
>overflow-x:hidden; Либо объясняй зачем это либо удаляй
Весь контент сайта я сделал шириной 900px, с ноутбука спокойно могу увеличить масштаб до 150% (дальше уже никому и не надо). Но при 150% появляется нижний бегунок который переводит влево-вправо на пару пикселей которые даже незаметны. Вот я и убрал его чтобы при 150% он не появлялся т.к. по сути не нужен, а только мешает. Но все-таки убрал эту строку и вернул бегунок.
>Не пиши транслитом
Все переписано, далее все буду писать на английском.
>Нужен @font-face инае шрифт не будет работать у тех у кого не установлен на компьютере.
Посмотрел как его подключить. Нужно добавить в папку с сайтом папку шрифтов которая весит 1.2мб. Стоит ли того или я делаю что-то не так? Смотрел здесь http://fonts4web.ru/opensans.html
>Уже лет 10 можно вместо name просто приписвыать атрибут id к любому тегу. Старый учебник читал?
Заменил где возможно. Осталось только это
<input type="radio" name="button" checked="checked" id="button1"></input><label for="button1"><span class="button_all">All</span></label>
Не понимаю как отсюда убрать name, т.к. без него крашится.
Читал все в htmlbook.ru
>Капс лок надо делать не в тексте а через text-transform
Переделал.
>В портфолио, лучше не делать по несколько копий каждой картинки, а помечать css классами к каким разделам она относится.
Переделал.
>Почитай про clearfix и microclearfix hack
Не понял в чем мой способ плох и вообще зачем так изворачиваться ради этой мелочи, ведь все и так работает.
Напомню, что загрузил все прямо на сайт maketi.esy.es
>Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать нажимающимися, чтобы они сохраняли свое состояние.
Готово.
>Код из блока style надо вынести в внешний css-файл и подключать через тег <link>
Готово.
>Все картинки относящиеся к дизайну надо делать через background-image в CSS
Готово.
>Имена классов мне не нравятся. Что за bool1? Давай нормальные читабельные имена вроде social-icons
Заменил.
>Обычно через дефисы пишут идентификаторы в CSS
Переделал.
>Тег b не используется так как внешний вид текста должен задаватся в CSS, а теги задают смысл этого текста. В днном случае текст это заголовок и должен использоваться один из тегов h1-h6
Переделал.
>overflow-x:hidden; Либо объясняй зачем это либо удаляй
Весь контент сайта я сделал шириной 900px, с ноутбука спокойно могу увеличить масштаб до 150% (дальше уже никому и не надо). Но при 150% появляется нижний бегунок который переводит влево-вправо на пару пикселей которые даже незаметны. Вот я и убрал его чтобы при 150% он не появлялся т.к. по сути не нужен, а только мешает. Но все-таки убрал эту строку и вернул бегунок.
>Не пиши транслитом
Все переписано, далее все буду писать на английском.
>Нужен @font-face инае шрифт не будет работать у тех у кого не установлен на компьютере.
Посмотрел как его подключить. Нужно добавить в папку с сайтом папку шрифтов которая весит 1.2мб. Стоит ли того или я делаю что-то не так? Смотрел здесь http://fonts4web.ru/opensans.html
>Уже лет 10 можно вместо name просто приписвыать атрибут id к любому тегу. Старый учебник читал?
Заменил где возможно. Осталось только это
<input type="radio" name="button" checked="checked" id="button1"></input><label for="button1"><span class="button_all">All</span></label>
Не понимаю как отсюда убрать name, т.к. без него крашится.
Читал все в htmlbook.ru
>Капс лок надо делать не в тексте а через text-transform
Переделал.
>В портфолио, лучше не делать по несколько копий каждой картинки, а помечать css классами к каким разделам она относится.
Переделал.
>Почитай про clearfix и microclearfix hack
Не понял в чем мой способ плох и вообще зачем так изворачиваться ради этой мелочи, ведь все и так работает.
Напомню, что загрузил все прямо на сайт maketi.esy.es
У тебя переменная generator глобальная и потому больше одной функции-счетчика создать нельзя. Надо не использовать глобальные переменные.
Также, ты делаешь странные вещи по моему, ты после вызова функции заменяешь ее на новую:
> generator = function() {
...
> generator = function() {
Это как-то неправильно и я толком сам не понимаю как это вообещ может работать.
Вместо alert лучше привыкай использовать console.log а то руки отвалятся на кнопки нажимать.
> Не понимаю как отсюда убрать name, т.к. без него крашится.
Я говорил что тег-якорь <a name> устарел. Сейчас любой элемент с атрибутом id является якорем.
Если ты откроешь исходный код например этой страницы https://ru.wikipedia.org/wiki/%D0%AF%D0%BA%D0%BE%D1%80%D1%8C то увидишь:
> <h2><span class="mw-headline" id=".D0.A3.D1.....D0.B9">Устройство и классификация якорей</span>
То есть id используется для обозначения якоря.
Сам атрибут name не устарел и в input конечно ничем заменить его нельзя и не требуется.
>>Почитай про clearfix и microclearfix hack
> Не понял в чем мой способ плох и вообще зачем так изворачиваться ради этой мелочи, ведь все и так работает.
Твой способ требует добавлять отдельный див. Клеарфикс позволяет просто добавить класс на элеиент чтобы тот охватывал (растягивался по высоте) все флоаты внутри него. Это достигается за счет создания в конце дива псевдоэлемента ::after со свойством clear: both. То есть тоже добавляется элемент с clear, но средствами CSS, не загрязняя HTML лишними служебными элементами.
Раньше, до CSS3, HTML был загрязнен всеми добавочными элементами. Например, чтобы сделать тень или скругление, часто в код добавляли кучу дивов:
<div class="wrap">
<span class="top-left"></span>
<span class="top"></span>
<span class="top-right"></span>
<p>Контент</p>
</div>
Я помню, сам так делал давно.
Но с CSS3 большинство этих дивов не нужны и мы можем писать чистый HTML:
<h1>...</h1>
<p>....</p>
То есть в данном случае способ с клеарфиксом предпочтительнее так как не требует загрязнять HTML лишними элементами. Ты дложен стремиться делать как можно более простой HTML, избегая оформления с помощью добавления лишних элементов.
Кстати, иконку адреса и телефона в подвале можно сделать через псевдоэлемент :before. Сделай-ка, ты же с ними знаком по предыдущим задачам, верно?
> Напомню, что загрузил все прямо на сайт maketi.esy.es
Молодец, что так делаешь, удобно смотреть и проверять.
> Не понимаю как отсюда убрать name, т.к. без него крашится.
Я говорил что тег-якорь <a name> устарел. Сейчас любой элемент с атрибутом id является якорем.
Если ты откроешь исходный код например этой страницы https://ru.wikipedia.org/wiki/%D0%AF%D0%BA%D0%BE%D1%80%D1%8C то увидишь:
> <h2><span class="mw-headline" id=".D0.A3.D1.....D0.B9">Устройство и классификация якорей</span>
То есть id используется для обозначения якоря.
Сам атрибут name не устарел и в input конечно ничем заменить его нельзя и не требуется.
>>Почитай про clearfix и microclearfix hack
> Не понял в чем мой способ плох и вообще зачем так изворачиваться ради этой мелочи, ведь все и так работает.
Твой способ требует добавлять отдельный див. Клеарфикс позволяет просто добавить класс на элеиент чтобы тот охватывал (растягивался по высоте) все флоаты внутри него. Это достигается за счет создания в конце дива псевдоэлемента ::after со свойством clear: both. То есть тоже добавляется элемент с clear, но средствами CSS, не загрязняя HTML лишними служебными элементами.
Раньше, до CSS3, HTML был загрязнен всеми добавочными элементами. Например, чтобы сделать тень или скругление, часто в код добавляли кучу дивов:
<div class="wrap">
<span class="top-left"></span>
<span class="top"></span>
<span class="top-right"></span>
<p>Контент</p>
</div>
Я помню, сам так делал давно.
Но с CSS3 большинство этих дивов не нужны и мы можем писать чистый HTML:
<h1>...</h1>
<p>....</p>
То есть в данном случае способ с клеарфиксом предпочтительнее так как не требует загрязнять HTML лишними элементами. Ты дложен стремиться делать как можно более простой HTML, избегая оформления с помощью добавления лишних элементов.
Кстати, иконку адреса и телефона в подвале можно сделать через псевдоэлемент :before. Сделай-ка, ты же с ними знаком по предыдущим задачам, верно?
> Напомню, что загрузил все прямо на сайт maketi.esy.es
Молодец, что так делаешь, удобно смотреть и проверять.
Кстати, говоря про добавочные элементы: в коде википедии спан это явно лишний добавочный элемент (возможно он для чего-то нужен). Чистый код выглядел бы так:
<h2 id="....">Устройство и классификация якорей</h2>
<p>текст</p>
Ты должен стремиться именно к такому.
Ну и я тебе напомню что HTML служит для семантической (смысловой) разметки текста. А оформление дложно быть в CSS. Потому когда ты ради оформления (иконки телефона) добавляешь спан или див, это не очень правильно. Правильнее использовать только CSS. Понятно, что иногда без лишних элементов никак, но тут простая ситуация и они не нужны.
Если открыть инспектор в браузере (Ctrl + Shift + I) то можно увидеть что у тебя ссылки внизу криво спозиционированы. У ссылки есть активная невидимая область справа от кнопок (если навести мышь, она меняет форму). Это значит, ты что-то криво там сверстал, я как доберусь, посмотрю что именно.
А ты используешь робота-проверяльщика? Если используешь и обнаружишь что-то странное (например он принимает программу с ошибками) — пиши мне, я поправлю его.
Да, я собирался его использовать, но только в том случае, если мне кажется, что написанная программа удовлетворяет условиям (а такого пока не было).
2) Продолжаю натыкаться на разные интересные особенности php, вот например если создать массив вида:
$arr = [1 => 3, '1' => 5], то будет создан массив с одним элементом 5 и ключом 1 типа int, тобиш '1' и 1 для массива одинаковые ключи как при создании так и при обращении.
http://ideone.com/Chstwl
http://ideone.com/yddJ6y
http://ideone.com/xgdIm2
http://ideone.com/gmkUEV
http://ideone.com/bfVMjf
http://ideone.com/E1jPIE
http://ideone.com/KpOWul
http://ideone.com/0sOa41
анон_выше
в смысле, тот, что с вырезанием пробелов, лол.
> Я подозреваю, что конструкция вида $text{$i} обращается к байту, а не к символу и по счастливой случайности половина строки действительно избавляется от пробелов.
Да. Символ пробела занимает ровно один байт и с ним код работает. Но чтобы удлить проблеы не нужен цикл, достаточно str_replace или strtr
Урок про строковые функции если ты его не видел: https://gist.github.com/codedokode/ff99e357e9860ea169b8
> Продолжаю натыкаться на разные интересные особенности php, вот например если создать массив вида:
$arr = [1 => 3, '1' => 5], то будет создан массив с одним элементом 5 и ключом 1 типа int, тобиш '1' и 1 для массива одинаковые ключи как при создании так и при обращении.
Да. если строка-ключ выглядит как число то PHP преобразует ее в число. Иначе бы такой код не работал:
$a = ['1' => 'test'];
echo $a[1]; // была бы ошибка
Вот тут описано: http://php.net/manual/ru/language.types.array.php
> Строки, содержащие целое число будут преобразованы к типу integer. Например, ключ со значением "8" будет в действительности сохранен со значением 8. С другой стороны, значение "08" не будет преобразовано, так как оно не является корректным десятичным целым.
> Числа с плавающей точкой (тип float) также будут преобразованы к типу integer, т.е. дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8
И так далее.
Ну и еще в цикле у тебя стоит mb_strlen которая возвращает число символов, а оно меньше чем число байт (кириллица = 2 байта) и ты в итоге проходишь только полстроки.
Потому что ссылка должна куда-то вести, в ней должен быть указан адрес страницы. А какая польза от ссылки javascript:vioid( ? Куда она ведет?
Тебе нужна не ссылка, а кнопка. А внешеий вид меняется средствами CSS.
>Советую "Изучаем PHP и MySQL" Мишель Е. Дэвис, Джон А. Филлипс.
скачал, а пишет, что она 2008 года, не сильно старая?
посоветуйте годную литературу на русском по php ну и вдобавок что там надо html css js mysql
Буду читать когда буду не дома, а дома буду решать задачки ОПа
Например
<p>Раз</p>
<p><span>Два</span></p>
<p>Три</p>
Стиль нужно применить только к тому p, который содержит span.
Не пизди, читал ее, все довольно подробно разъясняется, не хуже официальной документации.
Ты вообще крокодил анонимный, я откуда знаю. Я книгу читал, там все норм, лучше других туториалов, какие попадались.
Не, меня считали некоторые ребята пидором. Даже в 1с контору позвали один раз.
Буду надеяться на то, что кто-нибудь из тех, кто еще не прочитал резюме возьмет.
Кстати посмотрел резюме своих "конкурентов", чет там вообще какие-то Васяны со знанием синтаксиса. Либо фирмы зажрались, либо я резюме как-то не так составил.
В быдло-конторы берут по знакомству.
В хорошем месте естественно требуют знания.
Сиди и учись, хуле ноешь?
Проблема в том, что у меня нет возможности сидеть. Нужно работать идти. И чет мне кажется от джуна требовать миддловские знания это слишком.
Ты джуниора путаешь со стажером.
Джуниор должен уметь все то же, что миддл, разница только в объеме возлагаемых работ и ответственности.
Иди тогда работать в макдак за пряники, а вечером учись.
С 5го читай, там все более новое. Эта книжка каждые пару лет заново издается, походу убирают устаревшее в языке и добавляют обновленное.
Все эти джуниоры-миддлы от конторы зависят. В некоторых и на джуниора такое требуют, что сениор только знает, а в других на джуниора любого дауна берут, который видеолекцию php с ютуба посмотрел.
Ну я тоже не понял, рассылал вроде одно и то же везде, в итоге в нормальную фирму взяли, в остальных всех отфутболили, даже в парашных. Видно от удачи зависит.
Ну я очень надеюсь на фирму НГС, которая еще мое резюме не прочитала. У них там вроде вполне демократичные требования. А знание Yii требовала Noveo. Вернее у них там это было "желательно" знать. Но судя по всему это "желательно" надо читать как "требуется".
До собеседований редко, 3 раза всего пригласили. С 2х потом не позвонили, с 3й через неделю согласились.
На джуниора же и были. Простые запросы с JOIN в mysql, на javascriptе аякс запрос написать, в jquery там элемент подвинуть, в PHP класс с конструктором и mvc паттерн, в таком духе.
Ну это все я знаю. Даже больше. Плюс есть пара проектов на гитхабе, написанных на MVC, один из них на фреймворке. Походу единственное, что мне не хватает это Yii. Но у меня сейчас нет возможности его учить, нужно ехать уже.
Ну все норм у тебя значит, засылай дальше просто.
Паттерны-шматерны, методологии, управление командами и проектами, остальная хуйня.
Спрашивайте ответы, мои няши :3
Да, к счастью, она и там есть.
Сам становись тян. Заодно и деньги появятся.
>Твой способ требует добавлять отдельный див. Клеарфикс позволяет просто добавить класс на элеиент чтобы тот охватывал (растягивался по высоте) все флоаты внутри него.
Все понятно. Переделал, с технологией разобрался.
>Кстати, иконку адреса и телефона в подвале можно сделать через псевдоэлемент :before. Сделай-ка, ты же с ними знаком по предыдущим задачам, верно?
Знаком, переделал.
>Напомню, что загрузил все прямо на сайт maketi.esy.es Молодец, что так делаешь, удобно смотреть и проверять.
Надеюсь это был не сарказм, а то мне самому это удобно, я все сразу на сайт загружаю.
>Если открыть инспектор в браузере (Ctrl + Shift + I) то можно увидеть что у тебя ссылки внизу криво спозиционированы. У ссылки есть активная невидимая область справа от кнопок (если навести мышь, она меняет форму).
Действительно были пробелы между блочными элементами. Переделал, теперь активные ссылки только на месте, но остались какие-то подозрительные полоски сбоку (которые как-то странно выделяются, по одной), но они безобидны и некликабельны.
Хотелось бы еще услышать ответ насчет @font-face, стоит ли загружать папку 1.2 мегабайта ради одного шрифта? http://fonts4web.ru/opensans.html
Так же еще возник вопрос насчет шрифтов. Выставляю все в px (например 16px) но при большом уменьшении масштаба текст явно становится больше, я не могу понять в чем дело. Скрины на пике. Как видно в 1 случае блоки с текстом становятся длиннее, а во втором строчка с адресом становится настолько большой, что вытесняет строчку с телефоном.
>>525441
>>525477
9) http://jsfiddle.net/9grpj1hf/
10) Не имею понятия, как это решить. Например, сноска слева от курсивного текста должна ведь оставаться на той же высоте, что и текст, к которому она относится? То есть если текст переедет на новую строку при изменении ширины окна, то сноска должна быть всегда на том же уровне по вертикали. Напрашивается какой-нибудь ::before, но тогда вопрос, как зафиксировать положение этого псевдоэлемента по горизонтали.
Как сделать полупрозрачную надпись на картинке, тоже не знаю. То есть непонятно как ее пристыковать к нижнему краю изображения. Если бы я знал хотя бы высоту этого блока, то мог бы использовать отрицательный margin.
11) http://jsfiddle.net/9tLfgyej/1/
Как-то коряво получается. Уголки вылезают наружу при выделении.
Все-таки логичнее было бы использовать label с атрибутом for. Не понимаю, на каком основании это запрещено? Только чтобы сделать задачу "интереснее", или есть все же практические причины?
> Выставляю все в px (например 16px) но при большом уменьшении масштаба текст явно становится больше, я не могу понять в чем дело. Скрины на пике. Как видно в 1 случае блоки с текстом становятся длиннее, а во втором строчка с адресом становится настолько большой, что вытесняет строчку с телефоном.
1) в браузере может быть задан минимальный размер шрифта меньше которого он не уменьшается
2) шрифт в некоторых системах рендерится с привязкой к границам пикселей, соответсвенно при уменьшении масштаба он уменьшается непропорционально
Более того, один и тот же шрифт в разных ОС/браузерах рендерится чуть-по разному и там легко может набраться разница 1-2px на слово. Ты не должен делать какие-то предположения, что этот текст займет ровно стольуо пикселей, ты должен делать максимально надежную и прочную верстку.
label с атрибутом for доставляет небольшие неудобства когда ты не верстаешь инпуты руками, а например имеешь php код который их генерирует. В случае использования for мы должны правильно генерировать уникальные id, и заботиться чтобы они не сопадали.
Если ты верстаешь руками то
Впрочем, даже без for нам приходится беспокоиться об атрибутах name.
>>525927
А еще некоторые линии между кнопками почему-то двойные: https://jsfiddle.net/bc71zb8n/1/
>линии между кнопками почему-то двойные
Поправил. https://jsfiddle.net/bc71zb8n/2/
Ты лучше подскажи общее решение, очевидно там неправильно из-за выпадающих уголков.
Действительно есть какая-то граница. Крашится не постепенно, а с определенного момента уменьшения масштаба, при 50% и далее. При ширине 900, думаю, можно и не думать над этим, кому вообще нужно будет уменьшать ниже 450px, да и я так посмотрел, многие большие сайты крашатся подобным образом при сильном уменьшении масштаба.
Решил проверить на всех установленных браузерах и вот какой результат.
Есть предельно мелкий шрифт:
Opera
Yandex
Chrome
Отсутствует, а следовательно даже при уменьшении сайта до 1х1 пиксель все отображается абсолютно нормально:
IE
* Mozilla
Может есть что годное почитать по ООП? как раз к нему преступаю. Статейки, ламповые бложики которые не кто не спалил, или годное чтиво про ООП но на примере другого языка?
В этом ограничении нет ничего плохого, оно сделано чтобы текст гарантированно оставался читаемым. Молодец, что делаешь такие эксперименты.
Ну если выбирать беслпатно или за 5$, то ясен хуй я выберу бесплатно. Зачем тратиться если можно и не тратиться?
Если быстро подумать то: APPP, Clean code, OOAD.
Вообще список для чтения я успешно проебал, т.к. забыл засунуть его в облако.
Оп где-то раньше вот эту ссылку по ООП давал, я там много годноты нашел
http://sergeyteplyakov.blogspot.ru/2013/10/articles.html
Я вот очкую, что буду старье учить. Может рассмотреть другого автора? Есть варианты?
Полноценный. Придется весь, няша. В ОП посте также есть задачки для проверки и закрепления знаний. Не бойся, второй язык изучать проще чем первый.
После загрузки страницы document.write вызывать уже нельзя. Лучше его не использовать, а создавать и вставлять DOM элементы в страницу.
4-е издание 2013 года, там почти ничего не устарело.
Только часть. Обычно от PHP программистов не требуют полноценные тулы, использующие все фичи языка писать, достаточно простейших действий по манипуляции элементами и отсылке запросов. Часть пхпшников вообще одним jquery и готовыми тулами к нему обходится.
Получается яваскрипт будет первым. Я ведь пока только HTML/CSS овладел.
А вообще по объему яваскрипт каков по сравнению с PHP? А то не хочется надолго затягивать с обучением того языка, который даже не основной у меня.
Хуй знает, мне JS легче показался, чем PHP. Правда учил я его вторым. Но количество скобок это пиздец какой-то. До сих пор в них путаюсь.
Учи по w3schools сайту тогда, там в сжатом виде все, одни основы и с наглядными примерами. На learn.javascript.ru все более подробно и основательно разжевывают, но учить долго будешь.
<script>
var vasya;
if (vasya == 'undefined')
alert('vasya undefined');
document.getElementById("moidiv").innerHTML = vasya;
</script>
чому код не работает? alert не выдает на undefined, но в div пишет undefined
Все таки начал учить на http://learn.javascript.ru. Думаю разжевывание мне на пользу только пойдет. А насчет времени, ну по крайней мере до конца лета я собираюсь все по хардкору учить, как и CSS/HTML перед этим, тратя по ~10 часов в сутки. Ну а дальше как время свободное от универа будет, но думаю часов по 5 буду находить.
И кстати, платиновый вопрос, при таком раскладе вообще долго я буду учить все это дело?
года 2
Нет, не долго. У меня брат за неделю выучил, теперь работает синьором и получает 4килобакса.
>И кстати, платиновый вопрос, при таком раскладе вообще долго я буду учить все это дело?
Зависит от тебя. От того, насколько ты обучаем.
ОП называет примерные сроки 4-8 месяцев для нахождения работы джуном/стажёром в крупном городе.
Все понял. Просто имею в запасе 2 года, пока учусь в универе гуманитарий, потом планирую переехать из своей мухосрани 250к в Питер. Судя по всему времени мне хватит. Желание учить программирование у меня действительно есть.
Пойду-ка лучше с торрентов что-нибудь скачаю, в плеере громкость нормиально регулируется.
Как в гите откатиться на определенную версию (коммит) проекта? Допустим, у меня десять коммитов, и тут я обнаружил косяк, который пошел с девятой версии. Как откатиться на восьмую? (Гитбук читаю, дошел только до третьей главы пока)
(и файлообменник мой проверь, блджад)
https://github.com/nsdvw/file-sharing/blob/master/app/Model/Form.php
Такую верификацию ты сам придумал, или где-то подсмотрел? Я сейчас тоже регистрацию делаю в файлообменнике, ОП все-равно пока ничего не проверяет, и встал вопрос верификации, я эту тему пока еще не вскрывал, пока только посмотрел твою, хотел узнать что ты на эту тему читал, откуда черпал информацию. Твое решение мне выглядит каким-то совсем непрозрачным
Правила для проверки полей формы, заданные массивом, подсмотрел в yii.
Велосипед с циклами для обхода этого массива изобретал сам.
Хз, может и выглядит как говно, но по крайней мере хвалю себя за попытку вникнуть в принципы реализации таких штук.
Язык вероятного противника понимаешь? http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=git+revert+to+commit
>>526064
В больших фреймворках типа Симфони все еще сложнее, там каждый валидатор — отдельный объект: http://symfony-gu.ru/documentation/ru/html/book/forms.html
Но зато там крутые формы, они без всяких массивов прямо в твою модель данные пишут и читают.
>>522386
> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L47
> protected $fileId;
Тут можно (и нужно) прописать связь с файлом. А в файле — обратную связь. Зачем нам id файла когда мы можем прописать связь и доктрина будет возвращать нам сущность-файл? Тогда мы сможем делать такие вещи:
$file = $comment->getFile();
$comments = $file->getComments();
Соответственно setFileId надо выпилить. Заметь, что в доктрине можно для установки связи вместо загрузки полноценного объекта использовать легкую Reference которая содержит только id и не обращается к базе при создании: http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html#reference-proxies (впрочем, это оптимизация которая очень редко когда нужна, в твоем случае не нужна).
> static public function saveComment($post, $em, self $parent = null)
self в качестве тайп хинта точно работает? Это не будет воспринято как «объект класса self»?
> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L121
> static public function saveComment($post, $em, self $parent = null)
вот это неправильно. Комментарий не должен сам себя сохранять, у нас же data mapper.Сохранением занимается репозиторий либо класс-сервис. Если тебе нужны доаолнительные методы работы с базой, ты можешь сделать свой репозиторий, унаследовав стандартный:
http://habrahabr.ru/post/130275/
http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#custom-repositories (офиц. док.)
Но в данном случае и это не нужно. Тебе надо отказаться от массиво-ориентированного мышления и вместо функции которая принимает массив создавать объект Comment в контроллере либо в хелпере.
То есть примерно так:
$comment = new Comment;
$comment->... = $app->request->post(...);
...
if ($validator->isValidComment($comment)) {
...
} else {
...
}
Там кстати надо бы сделать нормальное добавление комментариев, с проверкой данных и выдачей ошибок. И наверно с аяксом, ты же изучаешь JS? Вот и сделай чтобы аяком отправлялся запрос на добавление комментария, запрос проверялся, и возвращались в JSON либо ошибки либо что все ок. При использовании аякса не забывай про такие вещи:
- индикация что идет обработка запроса, блокировка кнопки отправки на это время
- обработка сетевых ошибок
- возможность отправить запрос повторно при любой ошибке
Также можно добавить легкую клиентскую валидацию (вроде проверки что текст введен или проверки на длину) с помощью клиентской HTML5 валидации.
В случае отсутствия, ошибки загрузки или отказа JS либо должна быть возможность отправить форму комментария классическим способом, либо кнопки комментирования и форма должны быть скрыты.
Ну и аякс сейчас часто используется, тебе это пригодится. Если ты изучал jQuery, можно ее тут применить, можно без нее, на XMLHttpRequest и DOM.Если ты совсем JS не знаешь, то сделай отправку без JS, но с валидацией на сервере, как описано в моем уроке про формы.
Что с именами классов? Resource\File и Resourse\FileResource только путают. Я бы сделал папку Entity или Model для моделей. А остальное засунул в Helper.
Имена моделей обычно пишут в единственном числе, не Comments а Comment.Ведь у тебя в одном объекте хранится информация об одном комментарии.
> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php
Тут какая-то длинная простыня получается. Посмотри, может что можно вынести в отдельные функции (их можно определить тут же). Как минимум всю инициализацию доктрины стоит вынести в функцию чтобы не загрязнять глобальное пространство кучей переменных и избавиться от трудночитаемой простыни.
Также, пара замечаний по инициализации доктрины:
> $config->setAutoGenerateProxyClasses(false);
Не уверен что тут нужен false. Ведь это значит что прокси-классы для моделей ты будешь генерировать сам, явно, командой. Я думаю удобнее разрешить генерировать их автоматически.
> $deleted = $cache->deleteAll();
Если ты хочешь откючить кеш, ты можешь просто к качестве драйвера указать ArrayCache (кеширование описано тут на англ: http://doctrine-orm.readthedocs.org/en/latest/reference/caching.html ). Также есть VoidCache который ничего вообще никуда не сохраняет.
Заметь что кеширование относится только к метаданным (распарсенным аннотациям) и DQL запросам, сами данные из базы доктрина не кеширует (и это хорошо).
> $cache = new \Doctrine\Commmon\Cache\MemcacheCache();
Лучше в качестве альтернативы поставить файловый кеш, он есть в доктрине: https://github.com/doctrine/cache/tree/master/lib/Doctrine/Common/Cache
> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L53
параметры соединения (только те которые могут различаться на разных компьютерах, то есть название базы, доступы) надо вынести в конфиг-файл config.php
> {{ app.request.getRootUri() }}
Чтобы не копипастить это во всех шаблонах, можно в начале index.php проставлять переменную во view.
> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L17
> <label for="name">Ваше имя</label><br>
br верный признак того что тебе надо как-нибудь пройти наш Путь CSS/HTML. У тебя же там бутстрап используется, можно с его помощью форму оформить.
> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L32
> '{{comment.user}}'
Вставлять данные в JS надежнее через json_encode так как она правильно сохраняет любые спецсимволы. В твоем примере, если в имени есть символы ' или \ то JS-код сломается. Надо писать так:
в атрибутах {{ x | json_encode }}
в теге script: {{ x | json_encode | raw }}
Кавычки не требуются.
> style="margin-left:{{ (comment.level -1) × 25 }}px;">
надо бы сделать ограничение отступа, чтобы комменты не уходили за правый край страницы на большой глубине.
> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L78
> '<textarea name="comment" id="commentBody"></textarea><br>'+
id не могут повторяться. Но после вставки второй формы на странице будет 2 одинаковых id
> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L83
> commentButton.onclick = function(){
Не надо полагаться на глобальные переменные, создаваемые автоматически для элементов. Лучше использовать getElementById.
Яваскрипт-код конечно у тебя нехороший, надо его переделывать нормально. Ну и HTML в строке это тоже изврат.
Кстати, тебе не обязательно иметь вторую копию формы. Ты можешь взять существующую на странице форму и переместить, если ты изучал DOM то метод appendChild переносит DOM-элемент в новое место:
var commentForm = document.getElementById(..)
function appendForm(...) {
var comment = ...;
comment.appendChild(commentForm);
}
Если ты не изучал, то запиши себе на будущее разобраться с яваскриптом, потому что тут у тебя явные пробелы.
> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/comments.sql#L34
> `children` int(11) DEFAULT NULL,
Что хранится в children? Комментария нет, непонятно.
> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/public/.htaccess#L8
> php_value max_execution_time 1000
Это зачем? Ограничение по времени защищает от расходования ресурсов зациклившимися скриптами.
> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/public/.htaccess#L14
> RewriteRule ^download/[^/]+/[^/]+$ index.php
По моему это правило дублирует последнее.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L4
> use Uppu3\Helper\FormatHelper as FormatHelper;
as ... не нужен тут
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L12
> $app->container->singleton('em',
Тут можно бы сделать ленивую инициализацию доктрины:
$app->container->singleton('em', function() {
$entityManager = configureEntityManager();
return $entityManager;
});
Тогда доктрина инициализировалась бы не всегда, а только если она нужна.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L34
> if (file_exists($_FILES['load']['tmp_name'])) {
При загрузке надо проверять поле error, а то вдруг например файл не дозакачался? http://php.net/manual/ru/features.file-upload.errors.php
Эту папку надо удалить из репозитория. Для этого надо убрать ее из gitignore, убрать папку, закоммитить, вернуть в gitignore, вернуть папку.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L50
> $helper = new FormatHelper();
Это не нужно, там же все методы статические
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L73
> exit;
Используй return, а то не вызовется код, выполняющийся после обработки запроса (вдруг ты что-нибудь добавишь).
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L103
> isset($_POST['parent']) ? $parentID = $_POST['parent'] : $parentID = false;
?: предназначен для использования в выражениях, а не как замена для if. Правильнее писать так:
$parentId = ... ? ..: ..
Тогда мы явно видим что это присваивание значения переменной. А в данном случае вместо isset используй $app->request.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L107
> $parent = $app->em->find('Uppu3\Resource\Comments', $parentID);
Если parentId пуст незачем вызывать это.
По CSS и JS, я советую не смешивать в одной папке твои файлы и файлы бустрапа. Внешние библиотеки лучше класть в отдельную папку и не трогать. Иначе замучаешься с обновлением, да и понять где чей код сложно.
Пока я сам файлообменник не смотрел, давай ты пока исправишь замечания. Если какие-то вопросы, уточняй, я более развернуто напишу.
>>522386
> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L47
> protected $fileId;
Тут можно (и нужно) прописать связь с файлом. А в файле — обратную связь. Зачем нам id файла когда мы можем прописать связь и доктрина будет возвращать нам сущность-файл? Тогда мы сможем делать такие вещи:
$file = $comment->getFile();
$comments = $file->getComments();
Соответственно setFileId надо выпилить. Заметь, что в доктрине можно для установки связи вместо загрузки полноценного объекта использовать легкую Reference которая содержит только id и не обращается к базе при создании: http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html#reference-proxies (впрочем, это оптимизация которая очень редко когда нужна, в твоем случае не нужна).
> static public function saveComment($post, $em, self $parent = null)
self в качестве тайп хинта точно работает? Это не будет воспринято как «объект класса self»?
> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L121
> static public function saveComment($post, $em, self $parent = null)
вот это неправильно. Комментарий не должен сам себя сохранять, у нас же data mapper.Сохранением занимается репозиторий либо класс-сервис. Если тебе нужны доаолнительные методы работы с базой, ты можешь сделать свой репозиторий, унаследовав стандартный:
http://habrahabr.ru/post/130275/
http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#custom-repositories (офиц. док.)
Но в данном случае и это не нужно. Тебе надо отказаться от массиво-ориентированного мышления и вместо функции которая принимает массив создавать объект Comment в контроллере либо в хелпере.
То есть примерно так:
$comment = new Comment;
$comment->... = $app->request->post(...);
...
if ($validator->isValidComment($comment)) {
...
} else {
...
}
Там кстати надо бы сделать нормальное добавление комментариев, с проверкой данных и выдачей ошибок. И наверно с аяксом, ты же изучаешь JS? Вот и сделай чтобы аяком отправлялся запрос на добавление комментария, запрос проверялся, и возвращались в JSON либо ошибки либо что все ок. При использовании аякса не забывай про такие вещи:
- индикация что идет обработка запроса, блокировка кнопки отправки на это время
- обработка сетевых ошибок
- возможность отправить запрос повторно при любой ошибке
Также можно добавить легкую клиентскую валидацию (вроде проверки что текст введен или проверки на длину) с помощью клиентской HTML5 валидации.
В случае отсутствия, ошибки загрузки или отказа JS либо должна быть возможность отправить форму комментария классическим способом, либо кнопки комментирования и форма должны быть скрыты.
Ну и аякс сейчас часто используется, тебе это пригодится. Если ты изучал jQuery, можно ее тут применить, можно без нее, на XMLHttpRequest и DOM.Если ты совсем JS не знаешь, то сделай отправку без JS, но с валидацией на сервере, как описано в моем уроке про формы.
Что с именами классов? Resource\File и Resourse\FileResource только путают. Я бы сделал папку Entity или Model для моделей. А остальное засунул в Helper.
Имена моделей обычно пишут в единственном числе, не Comments а Comment.Ведь у тебя в одном объекте хранится информация об одном комментарии.
> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php
Тут какая-то длинная простыня получается. Посмотри, может что можно вынести в отдельные функции (их можно определить тут же). Как минимум всю инициализацию доктрины стоит вынести в функцию чтобы не загрязнять глобальное пространство кучей переменных и избавиться от трудночитаемой простыни.
Также, пара замечаний по инициализации доктрины:
> $config->setAutoGenerateProxyClasses(false);
Не уверен что тут нужен false. Ведь это значит что прокси-классы для моделей ты будешь генерировать сам, явно, командой. Я думаю удобнее разрешить генерировать их автоматически.
> $deleted = $cache->deleteAll();
Если ты хочешь откючить кеш, ты можешь просто к качестве драйвера указать ArrayCache (кеширование описано тут на англ: http://doctrine-orm.readthedocs.org/en/latest/reference/caching.html ). Также есть VoidCache который ничего вообще никуда не сохраняет.
Заметь что кеширование относится только к метаданным (распарсенным аннотациям) и DQL запросам, сами данные из базы доктрина не кеширует (и это хорошо).
> $cache = new \Doctrine\Commmon\Cache\MemcacheCache();
Лучше в качестве альтернативы поставить файловый кеш, он есть в доктрине: https://github.com/doctrine/cache/tree/master/lib/Doctrine/Common/Cache
> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L53
параметры соединения (только те которые могут различаться на разных компьютерах, то есть название базы, доступы) надо вынести в конфиг-файл config.php
> {{ app.request.getRootUri() }}
Чтобы не копипастить это во всех шаблонах, можно в начале index.php проставлять переменную во view.
> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L17
> <label for="name">Ваше имя</label><br>
br верный признак того что тебе надо как-нибудь пройти наш Путь CSS/HTML. У тебя же там бутстрап используется, можно с его помощью форму оформить.
> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L32
> '{{comment.user}}'
Вставлять данные в JS надежнее через json_encode так как она правильно сохраняет любые спецсимволы. В твоем примере, если в имени есть символы ' или \ то JS-код сломается. Надо писать так:
в атрибутах {{ x | json_encode }}
в теге script: {{ x | json_encode | raw }}
Кавычки не требуются.
> style="margin-left:{{ (comment.level -1) × 25 }}px;">
надо бы сделать ограничение отступа, чтобы комменты не уходили за правый край страницы на большой глубине.
> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L78
> '<textarea name="comment" id="commentBody"></textarea><br>'+
id не могут повторяться. Но после вставки второй формы на странице будет 2 одинаковых id
> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L83
> commentButton.onclick = function(){
Не надо полагаться на глобальные переменные, создаваемые автоматически для элементов. Лучше использовать getElementById.
Яваскрипт-код конечно у тебя нехороший, надо его переделывать нормально. Ну и HTML в строке это тоже изврат.
Кстати, тебе не обязательно иметь вторую копию формы. Ты можешь взять существующую на странице форму и переместить, если ты изучал DOM то метод appendChild переносит DOM-элемент в новое место:
var commentForm = document.getElementById(..)
function appendForm(...) {
var comment = ...;
comment.appendChild(commentForm);
}
Если ты не изучал, то запиши себе на будущее разобраться с яваскриптом, потому что тут у тебя явные пробелы.
> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/comments.sql#L34
> `children` int(11) DEFAULT NULL,
Что хранится в children? Комментария нет, непонятно.
> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/public/.htaccess#L8
> php_value max_execution_time 1000
Это зачем? Ограничение по времени защищает от расходования ресурсов зациклившимися скриптами.
> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/public/.htaccess#L14
> RewriteRule ^download/[^/]+/[^/]+$ index.php
По моему это правило дублирует последнее.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L4
> use Uppu3\Helper\FormatHelper as FormatHelper;
as ... не нужен тут
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L12
> $app->container->singleton('em',
Тут можно бы сделать ленивую инициализацию доктрины:
$app->container->singleton('em', function() {
$entityManager = configureEntityManager();
return $entityManager;
});
Тогда доктрина инициализировалась бы не всегда, а только если она нужна.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L34
> if (file_exists($_FILES['load']['tmp_name'])) {
При загрузке надо проверять поле error, а то вдруг например файл не дозакачался? http://php.net/manual/ru/features.file-upload.errors.php
Эту папку надо удалить из репозитория. Для этого надо убрать ее из gitignore, убрать папку, закоммитить, вернуть в gitignore, вернуть папку.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L50
> $helper = new FormatHelper();
Это не нужно, там же все методы статические
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L73
> exit;
Используй return, а то не вызовется код, выполняющийся после обработки запроса (вдруг ты что-нибудь добавишь).
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L103
> isset($_POST['parent']) ? $parentID = $_POST['parent'] : $parentID = false;
?: предназначен для использования в выражениях, а не как замена для if. Правильнее писать так:
$parentId = ... ? ..: ..
Тогда мы явно видим что это присваивание значения переменной. А в данном случае вместо isset используй $app->request.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L107
> $parent = $app->em->find('Uppu3\Resource\Comments', $parentID);
Если parentId пуст незачем вызывать это.
По CSS и JS, я советую не смешивать в одной папке твои файлы и файлы бустрапа. Внешние библиотеки лучше класть в отдельную папку и не трогать. Иначе замучаешься с обновлением, да и понять где чей код сложно.
Пока я сам файлообменник не смотрел, давай ты пока исправишь замечания. Если какие-то вопросы, уточняй, я более развернуто напишу.
Прошлый раз мы с тобой остановились на задаче с кошками-мышками. Скоро я посмотрю код и напишу сюда что мне было так непонятно.
Надеюсь, ты не думаешь, что я легкомысленно отношусь к этому, напротив - мне очень важно знать программирование, и я очень ценю твою помощь. Просто иногда бывает очень сложно.
Плохо понимаю.
Скачал даже какой-то школьный учебник
McKinlay S., Hastings B. - New Success - 2012
(Pre-intermediate и Intermediate уровни). Там есть аудио, упражнения на грамматику, вроде неплохо пошел.
Git-book не нравится, чувствуется что они старались как могли, но получилось как всегда, какая-то мутная хрень, и не документация, и не мануал.
Качнул несколько книжек, может какая-то из них пойдет.
Ferdinando Santacroce | Git Essentials (2015) рутрекер. Судя по оглавлению, тоже сухое перечисление фактов, которые я видимо должен заучивать наизусть.
Mike MqQuaid | Git in practice (2015) на трекерах не нашел, файлообменник http://nitroflare.com/view/B7637D869441A00/1617291978git.pdf
Пролистал, вроде неплохо, автор даже снисходит до того, чтобы объяснять и показывать примеры.
Есть, надо xdebug настроить и IDE с его поддержкой исплоьзовать.
>>522386
Вот кстати, ты файлообменник доделываешь, самое время за HTML, JS и SQL взяться, если ты их еще не решал. Ну и далее фреймворки мучать.
Вообще, справедливости ради, выгоднее может быть сначала мучать Yii2 и симфони 2, а потом JS/HTML/SQL, так как на собеседовании это будет весомее, но ведь ты будешь ужасный код писать, будешь тратить много времени на отладку неработающих скриптов или верстки, это все равно надо знать. Мне не нравится когда люди хорошо пишут PHP код, но открываешь JS и там ужас какой-нибудь.
Ну а SQL тебе нужен в любом случае, даже чистые бекендщики хоошо должны его знать. И у нас есть задачки, помогающие в нем разобраться.
>>523078
Цвет подчеркивания сильно не тот (там ближе к оранжевому). Верстаьщик не должен путать цвета и должен уметь пользоваться пипеткой или программой определения цветов.
Далее, если убрать width 500 и попробовать поменять ширину страницы то примечания слева съезжают. ПРоблема очевидно кроется в неправильном позиционировании:
> position: absolute;
> right: 90%;
Нет никаких гарантий что 90% ширины страницы это нужная ширина. Это неправильное решение. Давай попробуем сначала словами сформуоировать, как должно быть?
Примечание должно правым краем почти примыкать к левому краю текста, то есть к линии расположенной на 90px от левого края
Как это реализовать? Я вижу 2 варианта:
- прижать правый край примечания к левому краю страницы c помощью right (оно станет невидимо), затем вытянуть вправо с помощью отрицательного margin-right. Этот трюк, использование right + margin-right часто исплоьзуется когда надо использовать и проценты и пиксели (например, центрирование). В новом CSS3 можно будет писать вещи вроде right: calc(100% - 90px) и трюк окажется не нужен. подробнее: http://habrahabr.ru/post/243821/
Пока это не очень поддерживается, так что применять пока не стоит.
- прижать левый край примечания к левому краю страницы. Сделать примечание фиксированной ширины (90px). Задать выравнивание текста в нем вправо.
Второй способ мне кажется более надежным.
В остальном, неплохо.
>>522958
> там долго сидели. А скажу сразу
Тут ошибки нет, а пишет что есть. Это из-за завездочки в регулярке:
> [а-яё]× а [а-я]×
Звездочка значит что буквы перед «а» могут и отсутствовать.
> foreach($val as $index => $val) {
Не делай так, это здорово запутывает при чтении кода (одна переменная используется для разных целей)
Выражения для жы/шы можно объединить в одно с помощью квадратных скобок. Они же лишь одной буквой различаются.
Выражения для а/но можно объединить так: ... (а|но) ...
Так, вообще, неплохо.
>>523078
Цвет подчеркивания сильно не тот (там ближе к оранжевому). Верстаьщик не должен путать цвета и должен уметь пользоваться пипеткой или программой определения цветов.
Далее, если убрать width 500 и попробовать поменять ширину страницы то примечания слева съезжают. ПРоблема очевидно кроется в неправильном позиционировании:
> position: absolute;
> right: 90%;
Нет никаких гарантий что 90% ширины страницы это нужная ширина. Это неправильное решение. Давай попробуем сначала словами сформуоировать, как должно быть?
Примечание должно правым краем почти примыкать к левому краю текста, то есть к линии расположенной на 90px от левого края
Как это реализовать? Я вижу 2 варианта:
- прижать правый край примечания к левому краю страницы c помощью right (оно станет невидимо), затем вытянуть вправо с помощью отрицательного margin-right. Этот трюк, использование right + margin-right часто исплоьзуется когда надо использовать и проценты и пиксели (например, центрирование). В новом CSS3 можно будет писать вещи вроде right: calc(100% - 90px) и трюк окажется не нужен. подробнее: http://habrahabr.ru/post/243821/
Пока это не очень поддерживается, так что применять пока не стоит.
- прижать левый край примечания к левому краю страницы. Сделать примечание фиксированной ширины (90px). Задать выравнивание текста в нем вправо.
Второй способ мне кажется более надежным.
В остальном, неплохо.
>>522958
> там долго сидели. А скажу сразу
Тут ошибки нет, а пишет что есть. Это из-за завездочки в регулярке:
> [а-яё]× а [а-я]×
Звездочка значит что буквы перед «а» могут и отсутствовать.
> foreach($val as $index => $val) {
Не делай так, это здорово запутывает при чтении кода (одна переменная используется для разных целей)
Выражения для жы/шы можно объединить в одно с помощью квадратных скобок. Они же лишь одной буквой различаются.
Выражения для а/но можно объединить так: ... (а|но) ...
Так, вообще, неплохо.
Хорошо решено, считает верно, но неплохо бы избавиться от повтора этого кода:
> \t$creditSum = $creditSum - $payout;
> $totalPay = $totalPay + $payout;
Также было бы хорошо если программа говорила какой банк выгоднее.
>>524230
>>524805
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L39
> throw new Exception('Ошибка генерации токена.');
Это надо поставить после цикла, а то фактически у тебя получается только одна попытка генерации.
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L35
> if ($this->mapper->isTokenReserved($string) == false) {
мне кажется, генерацию и простановку токена стоило бы сделать 2 разными функциями, а не объединять
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientsMapper.php#L135
> $orderBy = $this->inspectParameter($orderBy, 'by');
Проще было сделать 2 функции (checkOrder, checkBy), они бы оказались проще и не пришлось бы использовать switch. В общем, в твоем решении особо ничего плохого нет, но можно было сделать проще.
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientsMapper.php#L146
Сборку запроса наверно можно было сделать чуть проще:
Использовать $orExpr = implode(' OR ', $parts); для вставки OR.
Еще можно генерировать запрос так:
WHERE CONCAT(name, ' ', surname, ...) LIKE :word1
AND CONCAT(....) LIKE :word2
Также, там длинная простыня, часть кода можно вынести в отдельные функции: разбиение фразы на слова, подсчет числа записей.
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L34
> $regexp = '/[-`а-яА-ЯёЁ\\s]{2,40}/u';
Нет привязки к началу и концу строки ^ и $
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L65
> $string = mb_strtolower(strval($sex));
Тут неправильно делать strtolower так как мы не знаем в каком регистре буквы в константе. Может у нас const MALE = 'MALE';
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L88
> if ($email != $abiturient->email) {
Проверку уникальности можно сделать проще, без лишнего запроса на выборку. Надо проверять по условию WHERE email = ... AND token <> ....
Хотя твой способ тоже годится конечно.
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/MainPageController.php#L16
> $this->render($abiturients, $numOfPages, $_GET);
лучше бы в пагинатор не передавать GET где может быть все, что угодно, а формировать массив параметров явно или хотя бы отбирать из GET разрешенные параметры через array_intersect_key.
>https://github.com/blackberryJam/abiturients/blob/master/app/Util/Paginator.php#L36
Тут какой-то переусложненный код. Тернарные операторы можно заменить на min/max, упростить и сделать код более линейным.
2 цикла, for ($i = 0; $i < $numOfPrevious; $i++) { и for ($i = 1; $i <= $numOfNext; $i++) { и код посередине можно объединить в один цикл.
> https://github.com/blackberryJam/abiturients/blob/master/app/Util/Paginator.php#L69
> $params = Util::evalQueryParams
По моему в твоем случае это делается проще:
$params['page'] = $page;
Или
$params = array_merge($params, $additional) если надо заменить несколько
> https://github.com/blackberryJam/abiturients/blob/master/templates/form.html.php#L73
Если ты вкладываешь input внутрь label то id и for можно не указывать.
В пагинации хорошо бы всегда иметь кнопки перехода к первой и последней страницам: 1 ... 3 4 (5) 6 7 ... 98
> https://github.com/blackberryJam/abiturients/blob/master/templates/searchTopMessage.html.php#L2
> Показаны только результаты поиска по запросу: <?=$string?>.
Это не XSS ли прямо как в моем уроке? А, у тебя есть htmlspecialchars,но в другом файле. Это неправильно, перенеси-ка сюда чтобы сразу было видно.
> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L11
Когда ты изучишь twig, узнаешь что там есть макросы и эту копипасту можно будет сократить в объеме. Также тут по моему не хватает htmlspecialchars для ссылки в href.
> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L66
> <td colspan=100%>
Что это? colspan это не ширина колонки.
Так вообще, пока неплохо. Я надеюсь в следующем задании ты познакомишься с фреймворком Slim и увидишь что он поудобнее твоего велосипеда. Ну и с шаблонизатором twig.
Хорошо решено, считает верно, но неплохо бы избавиться от повтора этого кода:
> \t$creditSum = $creditSum - $payout;
> $totalPay = $totalPay + $payout;
Также было бы хорошо если программа говорила какой банк выгоднее.
>>524230
>>524805
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L39
> throw new Exception('Ошибка генерации токена.');
Это надо поставить после цикла, а то фактически у тебя получается только одна попытка генерации.
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L35
> if ($this->mapper->isTokenReserved($string) == false) {
мне кажется, генерацию и простановку токена стоило бы сделать 2 разными функциями, а не объединять
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientsMapper.php#L135
> $orderBy = $this->inspectParameter($orderBy, 'by');
Проще было сделать 2 функции (checkOrder, checkBy), они бы оказались проще и не пришлось бы использовать switch. В общем, в твоем решении особо ничего плохого нет, но можно было сделать проще.
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientsMapper.php#L146
Сборку запроса наверно можно было сделать чуть проще:
Использовать $orExpr = implode(' OR ', $parts); для вставки OR.
Еще можно генерировать запрос так:
WHERE CONCAT(name, ' ', surname, ...) LIKE :word1
AND CONCAT(....) LIKE :word2
Также, там длинная простыня, часть кода можно вынести в отдельные функции: разбиение фразы на слова, подсчет числа записей.
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L34
> $regexp = '/[-`а-яА-ЯёЁ\\s]{2,40}/u';
Нет привязки к началу и концу строки ^ и $
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L65
> $string = mb_strtolower(strval($sex));
Тут неправильно делать strtolower так как мы не знаем в каком регистре буквы в константе. Может у нас const MALE = 'MALE';
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L88
> if ($email != $abiturient->email) {
Проверку уникальности можно сделать проще, без лишнего запроса на выборку. Надо проверять по условию WHERE email = ... AND token <> ....
Хотя твой способ тоже годится конечно.
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/MainPageController.php#L16
> $this->render($abiturients, $numOfPages, $_GET);
лучше бы в пагинатор не передавать GET где может быть все, что угодно, а формировать массив параметров явно или хотя бы отбирать из GET разрешенные параметры через array_intersect_key.
>https://github.com/blackberryJam/abiturients/blob/master/app/Util/Paginator.php#L36
Тут какой-то переусложненный код. Тернарные операторы можно заменить на min/max, упростить и сделать код более линейным.
2 цикла, for ($i = 0; $i < $numOfPrevious; $i++) { и for ($i = 1; $i <= $numOfNext; $i++) { и код посередине можно объединить в один цикл.
> https://github.com/blackberryJam/abiturients/blob/master/app/Util/Paginator.php#L69
> $params = Util::evalQueryParams
По моему в твоем случае это делается проще:
$params['page'] = $page;
Или
$params = array_merge($params, $additional) если надо заменить несколько
> https://github.com/blackberryJam/abiturients/blob/master/templates/form.html.php#L73
Если ты вкладываешь input внутрь label то id и for можно не указывать.
В пагинации хорошо бы всегда иметь кнопки перехода к первой и последней страницам: 1 ... 3 4 (5) 6 7 ... 98
> https://github.com/blackberryJam/abiturients/blob/master/templates/searchTopMessage.html.php#L2
> Показаны только результаты поиска по запросу: <?=$string?>.
Это не XSS ли прямо как в моем уроке? А, у тебя есть htmlspecialchars,но в другом файле. Это неправильно, перенеси-ка сюда чтобы сразу было видно.
> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L11
Когда ты изучишь twig, узнаешь что там есть макросы и эту копипасту можно будет сократить в объеме. Также тут по моему не хватает htmlspecialchars для ссылки в href.
> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L66
> <td colspan=100%>
Что это? colspan это не ширина колонки.
Так вообще, пока неплохо. Я надеюсь в следующем задании ты познакомишься с фреймворком Slim и увидишь что он поудобнее твоего велосипеда. Ну и с шаблонизатором twig.
> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L66
> <td colspan=100%>
Что это? colspan это не ширина колонки.
Это я так выводимое сообщение на всю ширину таблицы растянул.
>Так вообще, пока неплохо. Я надеюсь в следующем задании ты познакомишься с фреймворком Slim и увидишь что он поудобнее твоего велосипеда. Ну и с шаблонизатором twig.
То есть почти зачёт, после исправленных перечисленных тобой недочётов можно переходить к файлообменнику?
Я уже и JS начал учить, хочу там всё с аяксом красиво сделать.
Вот я и до тебя добрался. Начнем с проверки HTML-разметки.
> <div class="header-words">
><a class="header-word" href="HOME">Home</a>
Традиционно меню делают с помощью списка ul/li (типа меню это список ссылок). Также, можно делать его через тег <nav>
> We are <b>Webpaint</b></div>
Сейчас используют тег strong. Так как в HTML не должно быть кода отвечающего за оформление, то тег strong имеет значение «акцентированный текст»: http://htmlbook.ru/html/strong
<b> правда не удалили, ему в HTML5 дали новый, не связанный с внешним видом, смысл: http://habrahabr.ru/post/129147/
> class="button1"
Лучше сделать нормальное имя без цифры, например large-button
> <div class="pic-android"></div>
Я думаю этот пустой див можно либо заменить на padding + backgorund либо (если используется спрайт) на псевдоэлемент. А класс обозначающий картинку перенести на родителя.
> <b>Consectetur</b>
Это подзаголовок
> <h1>Our Features Works</h1>
h1 это единственнвй и главный заголовок. Тут явно заголовок второго уровня (так как он описывает не всю страницу а только секцию на ней). Я думаю, на этой странице главный заголовок это «We are Webpaint».
> <p><a id="link_portfolio"></a></p>
P значит абзац текста. Текста тут нет значит и p быть не должно быть. А атрибут id можно повесить на <section class="portfolio-buttons-and-works"> где ему самое место.
> <input type="radio" name="button" checked="checked" id="button1"></input>
У input нет закрывающего тега.
> <a href="#" class="all graphic">
all наверно можно не писать, если оно у всех картинок есть?
> <h4>Vestibulum id ligula porta felis euismod semper, malesuada euismod.</h4>
А вот это как раз обычный текст, по моему. Теги обозначают именно смысл текста в них. Ты не должен пытаться использовать h4 и h5 для задания размера шрифта. Это говорит о том что ты не очень пока понял смысл HTML-разметки.
> <a href="#rss"><div id="rss"></div></a>
Див-то зачем? И без него наверно можно сделать ведь? Опять же, я бы сделал тут списком, но можно и просто теги <a> поставить. Вместо id лучше использовать класс так как они удобнее и их можно повторять.
> <h5>@ 2013 Webpaint. All Rights Reserved.</h5>
Это не заголовок. hN это не тег для задания размера текста.
Теперь перйдем к CSS. Начнем с вопроса про шрифты.
Подключать их можно 2 способами: вручную (рекомендую, чтобы получше разобраться) и через Google Fonts (слишком просто для учебного задания).
Для начала прочти статью про font-face: http://habrahabr.ru/post/113136/
И это более новую версию: https://css-tricks.com/snippets/css/using-font-face/ (англ, но код ты поймешь)
Как видишь синтаксис получается непростой, так как разные браузеры используют разные форматы шрифта, а старый ИЕ вообще не умеет выбирать из нескольких вариантов и нам приходится его обманывать.
Вот тут информация про поддержку браузерами разных форматов шрифтов:
http://caniuse.com/#feat=woff2
http://caniuse.com/#feat=eot
http://caniuse.com/#feat=ttf
https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face
Заметь,я упомянул разные форматы. Это значит, тебе надо сконвертировать шрифт в них. Руками делать это гиблое дело, потому топай на http://www.fontsquirrel.com/tools/webfont-generator и создавай.
Заметь что там можно вырезать из шрифта лишние символы и сильно уменьшить его вес. Также этот сервис генерирует CSS для подключения шрифта. Попробуй им воспользоваться. Имей в виду что для генерируемого пользователем контента (комментарии) трудно угадать какие символы можно вырезать. Но у нас этой проблемы нет.
Также, тебе не нужен весь мегабайт шрифтов. Тебе нужны толкьо те начертания (того веса и наклона) которые реально используются на сайте. Особое внимание удели весам. Open Sans имеет по моему 5 или 6 вариантов разного веса (вес это степень жирности букв) и тебе надо выбрать правильные: https://www.google.com/fonts/specimen/Open+Sans
Имей в виду что не все шрифты можно свободно распространять. Не скачивай пиратские шрифты, особенно если работаешь с иностранными заказчиками. Вот к примеру одна российская студия преследует тех кто использует ее шрифты: http://www.artlebedev.ru/studio/legal/ Шрифты на Google Fonts разрешены к бесплатному использованию и с ними проблем быть на должно.
Для проверки что шрифт загружается из сети, ты можешь заменить его имя (временно) в CSS например на OpenSans2.
Также не забудь определить на html основной шрифт страницы (включая размер и цвет). Основной шрифт это шрифт которым набирается обычный текст, например статьи. Определяя его на html, ты тем самым задаешь его по умолчанию для всей страницы.
Что у тебя за странные отступы перед селектором в CSS? Обычно пишут так:
.class {
....x: y;
}
Или так:
.class { x: y; w: z; }
Также, сохрани css файл в utf-8.
> header {
> width: 100%;
> min-width: 900px;
У блочных элементов ширина 100% по умолчанию. min-width лучше указывать на html, чтобы это действовало на всю страницу а не на отдельные части
Насчет ширины — давай сделаем так. На совсем узкой странице пусть допустим ширина серединки будет 900px + 10px поля с краев. На более широкой странице ширина середины увеличивается до 1100px, а дальше растут уже поля с краев. Это достигается с помощью min (на html) и max-width (на wrapper).
Также, чтобы научиться адаптивному дизайну, попробуй сделать версию страницы для малекнькой (<= 800) ширины, когда страница перестраивается в виде вертикальной цепочки из блоков. Такие страницы удобно смотреть на смартфоне например. Для этого надо использовать media queries и @media. После того как это сделаешь, добавь meta viewport чтобы мобильные устройства знали что страница под них оптимизирована и не отображали ее в уменьшенном виде.
Для лого можно объединить теги div и a.
При наведении на меню оно окрашивается в какой-то не очень подходящий красный цвет. Я думаю, оттенок красного лучше взять с кнопки. Или хотя бы сделать его более светлым, он же на темном фоне.
> .top-dark-gray-block {
> height: 350px;
Старайся указывать как можно меньше фиксированных размеров. Идея CSS в том что мы стараемся все, что можно, определять автоматически. Тут высота блока должна определяться по содержимому + паддинги сверху и снизу.
Ну и править код в котором нет фиксированных размеров, тоже проще выходит.
> .first-line-top-dark-gray-block {
> width: 900px;
Вот это плохо, что ты копипастишь эти width 900px. Ты представляешь сколько труда придется приложить чтобы поменять это? Убирай-ка эту копипасту. Тем более, блочные элементы по умолчанию занимают всю ширину родителя и писать width тут вообще не надо. Почитай-ка: http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/
Логотип у тебя по моему меньше чем в макете. Кнопка See Portfolio не соответтвует размерами макету, возможно из-за отстутствия шрифта у меня.
> .first-line-top-dark-gray-block
Вот это все равно плохое имя для класса. Неправильно в общем называть классы по внешнему виду. Ведь при редизайне они потеряют свой смысл. Достаточно добавить одну строку и first-line перестанет быть first. Надо давать такие названия: top-menu, jumbotron (блок с большим текстом), advantages, advantages-block (блок с 4 колонками), portfolio, portfolio-categories, portfolio-item. Это делает твой код долговечнее и читабельнее.
> box-sizing: border-box;
Для расширения охвата браузеров добавь версии с вендорными префиксами, -webkit-box-sizing и -moz-box-sizing. Аналогично с border-radius и transition.
Например старый фаерфокс (до версии 29) не понимает box-sizing, а -moz-box-sizing должен понять.
> width: 25%;
Если будешь делать 3 колонки помни про округление и что в итоге ширина в сумме может получиться больеш 100%
Проверь отступы. На макете например под 4 колонками есть паддинг снизу, пикселей 70-80, у тебя нет.
text-before-portfolio и portfolio-buttons-and-works это одна секция, не две.
Вот я и до тебя добрался. Начнем с проверки HTML-разметки.
> <div class="header-words">
><a class="header-word" href="HOME">Home</a>
Традиционно меню делают с помощью списка ul/li (типа меню это список ссылок). Также, можно делать его через тег <nav>
> We are <b>Webpaint</b></div>
Сейчас используют тег strong. Так как в HTML не должно быть кода отвечающего за оформление, то тег strong имеет значение «акцентированный текст»: http://htmlbook.ru/html/strong
<b> правда не удалили, ему в HTML5 дали новый, не связанный с внешним видом, смысл: http://habrahabr.ru/post/129147/
> class="button1"
Лучше сделать нормальное имя без цифры, например large-button
> <div class="pic-android"></div>
Я думаю этот пустой див можно либо заменить на padding + backgorund либо (если используется спрайт) на псевдоэлемент. А класс обозначающий картинку перенести на родителя.
> <b>Consectetur</b>
Это подзаголовок
> <h1>Our Features Works</h1>
h1 это единственнвй и главный заголовок. Тут явно заголовок второго уровня (так как он описывает не всю страницу а только секцию на ней). Я думаю, на этой странице главный заголовок это «We are Webpaint».
> <p><a id="link_portfolio"></a></p>
P значит абзац текста. Текста тут нет значит и p быть не должно быть. А атрибут id можно повесить на <section class="portfolio-buttons-and-works"> где ему самое место.
> <input type="radio" name="button" checked="checked" id="button1"></input>
У input нет закрывающего тега.
> <a href="#" class="all graphic">
all наверно можно не писать, если оно у всех картинок есть?
> <h4>Vestibulum id ligula porta felis euismod semper, malesuada euismod.</h4>
А вот это как раз обычный текст, по моему. Теги обозначают именно смысл текста в них. Ты не должен пытаться использовать h4 и h5 для задания размера шрифта. Это говорит о том что ты не очень пока понял смысл HTML-разметки.
> <a href="#rss"><div id="rss"></div></a>
Див-то зачем? И без него наверно можно сделать ведь? Опять же, я бы сделал тут списком, но можно и просто теги <a> поставить. Вместо id лучше использовать класс так как они удобнее и их можно повторять.
> <h5>@ 2013 Webpaint. All Rights Reserved.</h5>
Это не заголовок. hN это не тег для задания размера текста.
Теперь перйдем к CSS. Начнем с вопроса про шрифты.
Подключать их можно 2 способами: вручную (рекомендую, чтобы получше разобраться) и через Google Fonts (слишком просто для учебного задания).
Для начала прочти статью про font-face: http://habrahabr.ru/post/113136/
И это более новую версию: https://css-tricks.com/snippets/css/using-font-face/ (англ, но код ты поймешь)
Как видишь синтаксис получается непростой, так как разные браузеры используют разные форматы шрифта, а старый ИЕ вообще не умеет выбирать из нескольких вариантов и нам приходится его обманывать.
Вот тут информация про поддержку браузерами разных форматов шрифтов:
http://caniuse.com/#feat=woff2
http://caniuse.com/#feat=eot
http://caniuse.com/#feat=ttf
https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face
Заметь,я упомянул разные форматы. Это значит, тебе надо сконвертировать шрифт в них. Руками делать это гиблое дело, потому топай на http://www.fontsquirrel.com/tools/webfont-generator и создавай.
Заметь что там можно вырезать из шрифта лишние символы и сильно уменьшить его вес. Также этот сервис генерирует CSS для подключения шрифта. Попробуй им воспользоваться. Имей в виду что для генерируемого пользователем контента (комментарии) трудно угадать какие символы можно вырезать. Но у нас этой проблемы нет.
Также, тебе не нужен весь мегабайт шрифтов. Тебе нужны толкьо те начертания (того веса и наклона) которые реально используются на сайте. Особое внимание удели весам. Open Sans имеет по моему 5 или 6 вариантов разного веса (вес это степень жирности букв) и тебе надо выбрать правильные: https://www.google.com/fonts/specimen/Open+Sans
Имей в виду что не все шрифты можно свободно распространять. Не скачивай пиратские шрифты, особенно если работаешь с иностранными заказчиками. Вот к примеру одна российская студия преследует тех кто использует ее шрифты: http://www.artlebedev.ru/studio/legal/ Шрифты на Google Fonts разрешены к бесплатному использованию и с ними проблем быть на должно.
Для проверки что шрифт загружается из сети, ты можешь заменить его имя (временно) в CSS например на OpenSans2.
Также не забудь определить на html основной шрифт страницы (включая размер и цвет). Основной шрифт это шрифт которым набирается обычный текст, например статьи. Определяя его на html, ты тем самым задаешь его по умолчанию для всей страницы.
Что у тебя за странные отступы перед селектором в CSS? Обычно пишут так:
.class {
....x: y;
}
Или так:
.class { x: y; w: z; }
Также, сохрани css файл в utf-8.
> header {
> width: 100%;
> min-width: 900px;
У блочных элементов ширина 100% по умолчанию. min-width лучше указывать на html, чтобы это действовало на всю страницу а не на отдельные части
Насчет ширины — давай сделаем так. На совсем узкой странице пусть допустим ширина серединки будет 900px + 10px поля с краев. На более широкой странице ширина середины увеличивается до 1100px, а дальше растут уже поля с краев. Это достигается с помощью min (на html) и max-width (на wrapper).
Также, чтобы научиться адаптивному дизайну, попробуй сделать версию страницы для малекнькой (<= 800) ширины, когда страница перестраивается в виде вертикальной цепочки из блоков. Такие страницы удобно смотреть на смартфоне например. Для этого надо использовать media queries и @media. После того как это сделаешь, добавь meta viewport чтобы мобильные устройства знали что страница под них оптимизирована и не отображали ее в уменьшенном виде.
Для лого можно объединить теги div и a.
При наведении на меню оно окрашивается в какой-то не очень подходящий красный цвет. Я думаю, оттенок красного лучше взять с кнопки. Или хотя бы сделать его более светлым, он же на темном фоне.
> .top-dark-gray-block {
> height: 350px;
Старайся указывать как можно меньше фиксированных размеров. Идея CSS в том что мы стараемся все, что можно, определять автоматически. Тут высота блока должна определяться по содержимому + паддинги сверху и снизу.
Ну и править код в котором нет фиксированных размеров, тоже проще выходит.
> .first-line-top-dark-gray-block {
> width: 900px;
Вот это плохо, что ты копипастишь эти width 900px. Ты представляешь сколько труда придется приложить чтобы поменять это? Убирай-ка эту копипасту. Тем более, блочные элементы по умолчанию занимают всю ширину родителя и писать width тут вообще не надо. Почитай-ка: http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/
Логотип у тебя по моему меньше чем в макете. Кнопка See Portfolio не соответтвует размерами макету, возможно из-за отстутствия шрифта у меня.
> .first-line-top-dark-gray-block
Вот это все равно плохое имя для класса. Неправильно в общем называть классы по внешнему виду. Ведь при редизайне они потеряют свой смысл. Достаточно добавить одну строку и first-line перестанет быть first. Надо давать такие названия: top-menu, jumbotron (блок с большим текстом), advantages, advantages-block (блок с 4 колонками), portfolio, portfolio-categories, portfolio-item. Это делает твой код долговечнее и читабельнее.
> box-sizing: border-box;
Для расширения охвата браузеров добавь версии с вендорными префиксами, -webkit-box-sizing и -moz-box-sizing. Аналогично с border-radius и transition.
Например старый фаерфокс (до версии 29) не понимает box-sizing, а -moz-box-sizing должен понять.
> width: 25%;
Если будешь делать 3 колонки помни про округление и что в итоге ширина в сумме может получиться больеш 100%
Проверь отступы. На макете например под 4 колонками есть паддинг снизу, пикселей 70-80, у тебя нет.
text-before-portfolio и portfolio-buttons-and-works это одна секция, не две.
Далее, вот этот вот элемент: <label for="button1">. Открой инспектор (ctrl + shift + i) и посмотри какую область он занимает на странице. Это происходит потому что это у тебя на дочернем элементе стоит margin-left 200px. Кстати, это тоже ошибка. Кнопки надо центрировать, а не подбирать отступ на глаз, который развалится как только мы добавим еще кнопку или поменяем текст. Вряд ли твои коллеги будут рады этому.
Тут надо просто сделать блок с text-align center, а внутри кнопки сделать инлайн-блоками. Чувствую, у тебя тут пробелы в знаниях имеются.
Почему инлайн-блоки, а не инлайн элементы? Потому что сейчас у тебя label по высоте меньше чем кнопка.
> border: 1px solid #FF6760;
по моему тут проще вообще отключить бордер
> transition: 0.5s;
Укажи анимируемые свойства явно.
> line-height: 3;
не очень понятно зачем тут это если есть паддинг
> input:nth-of-type(1):checked + label > span, .portfolio-buttons-and-works > input:nth-of-type(2):checked + label > span
По моему тут не нужны nth-of-type.
> input:nth-of-type(1):checked ~ .all, .portfolio-buttons-and-works > input:nth-of-type(2):checked ~ .all.graphic
Я думаю вместо номеров удобнее и читабельнее исплоьзовать класс на инпуте, например portfolio-btn-all:checked
> .work {
> width: 225px;
> float: left;
Флоат по моему правильнее применять не к картинке а к ссылке, а то как-то странно, ты флоатом вырываешь картинку из содержащего ее инлайн-элемента. Ширину картинки можно задать в HTML, чтобы браузер до ее загрузки знал ее размер.
> font-size: 0;
Что за грязные трюки?
Социальные иконки надо выводить без img. Ты просто выводишь ссылки в виде квадратиков, и им задаешь background с отрицательным отступом, почитай:
https://learn.javascript.ru/css-sprite
http://webo.in/articles/habrahabr/08-all-about-css-sprites/
http://habrahabr.ru/post/159027/
При создании спрайтов оставляй отступы между картинками, так как при изменении масштаба браузер округляет размеры и может захватить кусочек соседней картинки.
Также для них надо сделать эффект при наведении. Например потемнение или осветление.
> #bottom-dark-gray-block-h5-1:before {
> content: url(../img/kap.png);
Эти мелкие иконки тоже надо засунуть в спрайт. И темные иконки с андроидом в блоке преимуществ тоже в спрайт.
> .social-icons {
> margin-left: 365px;
Используй text-align для центрирования.
> <a href="#rss"><div id="rss">
div можно выпилить. Ты всегда можешь сделать <a> блоком или инлайн-блоком или чем угодно.
У тебя есть скругление при наведении на картинку портфолио. Но там какое-то странно скругление, как будто оно обрезано как-то.
Далее, вот этот вот элемент: <label for="button1">. Открой инспектор (ctrl + shift + i) и посмотри какую область он занимает на странице. Это происходит потому что это у тебя на дочернем элементе стоит margin-left 200px. Кстати, это тоже ошибка. Кнопки надо центрировать, а не подбирать отступ на глаз, который развалится как только мы добавим еще кнопку или поменяем текст. Вряд ли твои коллеги будут рады этому.
Тут надо просто сделать блок с text-align center, а внутри кнопки сделать инлайн-блоками. Чувствую, у тебя тут пробелы в знаниях имеются.
Почему инлайн-блоки, а не инлайн элементы? Потому что сейчас у тебя label по высоте меньше чем кнопка.
> border: 1px solid #FF6760;
по моему тут проще вообще отключить бордер
> transition: 0.5s;
Укажи анимируемые свойства явно.
> line-height: 3;
не очень понятно зачем тут это если есть паддинг
> input:nth-of-type(1):checked + label > span, .portfolio-buttons-and-works > input:nth-of-type(2):checked + label > span
По моему тут не нужны nth-of-type.
> input:nth-of-type(1):checked ~ .all, .portfolio-buttons-and-works > input:nth-of-type(2):checked ~ .all.graphic
Я думаю вместо номеров удобнее и читабельнее исплоьзовать класс на инпуте, например portfolio-btn-all:checked
> .work {
> width: 225px;
> float: left;
Флоат по моему правильнее применять не к картинке а к ссылке, а то как-то странно, ты флоатом вырываешь картинку из содержащего ее инлайн-элемента. Ширину картинки можно задать в HTML, чтобы браузер до ее загрузки знал ее размер.
> font-size: 0;
Что за грязные трюки?
Социальные иконки надо выводить без img. Ты просто выводишь ссылки в виде квадратиков, и им задаешь background с отрицательным отступом, почитай:
https://learn.javascript.ru/css-sprite
http://webo.in/articles/habrahabr/08-all-about-css-sprites/
http://habrahabr.ru/post/159027/
При создании спрайтов оставляй отступы между картинками, так как при изменении масштаба браузер округляет размеры и может захватить кусочек соседней картинки.
Также для них надо сделать эффект при наведении. Например потемнение или осветление.
> #bottom-dark-gray-block-h5-1:before {
> content: url(../img/kap.png);
Эти мелкие иконки тоже надо засунуть в спрайт. И темные иконки с андроидом в блоке преимуществ тоже в спрайт.
> .social-icons {
> margin-left: 365px;
Используй text-align для центрирования.
> <a href="#rss"><div id="rss">
div можно выпилить. Ты всегда можешь сделать <a> блоком или инлайн-блоком или чем угодно.
У тебя есть скругление при наведении на картинку портфолио. Но там какое-то странно скругление, как будто оно обрезано как-то.
Почитай про colspan: http://htmlbook.ru/html/td/colspan
там надо указать число колонок, а не проценты.
> То есть почти зачёт, после исправленных перечисленных тобой недочётов можно переходить к файлообменнику?
> Я уже и JS начал учить, хочу там всё с аяксом красиво сделать.
Исправь замечания и сдай снова на проверку. делать файлообменник можно не дожидаясь меня. Аякс будет на файлообменнике (добавление комментария).
Тебе нужен белый (выделенный) IP от провайдера, кроме сервера дома. Проще наверно найти платный или бесплатный хостинг, их очень много и выбор большой. Закачать туда свои файлы. Ну и купить домен или взять бесплатный или пользоваться тем который дает хостинг.
>>524474
Провайдерское оборудование увидит другой мак, подумает что это кто-то подключился к твоему каналу или ты перепродаешь интернет (бред конечно) и отключит тебе интернет на всякий случай.
>>524479
> У тебя в универе была высшая математика? Что, сразу после лекций гнали на экзамен решать интегралы? Или может все-таки были практические занятия?
По моему только лекции + экзамен потом. ПРичем лекции такие что все равно надо самому разбираться.
Насчет практических занятий, они у нас есть: задачки. Теория у нас тоже есть. А видеокурсы — это то же самое что сидеть и подглядывать как старшекурсники решают уравнения.
Я считаю видеокурсы хорошо подходят для профессий где надо просто смотреть и повторять, например охранник, рабочий на конвеере, рабочий-строитель. Но не для программиста. Это несерьезно. Важно понимать что делает тот или иной оператор или функция, а не как его набирать в текстовом редакторе и куда нажать мышкой.
> Но видеокурсы делают не для программистов, а для тех, кто хочет им стать, но не написал за всю жизнь ни строки кода, и не имеет ни малейшего представления о программировании
И рискует им так и не стать.
> Посмотреть, как оно работает, получить общее представление, и уже за подробностями лезть в ублюдочную техническую документацию, которую как я начинаю подозревать пишут даже не люди, а генерируют боты.
Это приемлемо.
>>526187
Спасибо за подробное объяснение моих ошибок, с завтрашнего для буду все исправлять. Сегодня и так 14й час за ноутбуком сижу.
О Боги, да здесь же работы на годы! Все больше накатывает чувство стыда от того, что мой друг студент-программист сказал, что этот макет отнял бы у него максимум 4 часа.
Почему аутисты? Текст банально удобнее так как ты можешь его осмотреть в общем, можешь читать по диагонали, на слух (по моему) банально неудобнее.
>>524483
> Задротская нечитабельная херня.
Просто это рассчитано на тех уто уже знает сети, там в самом начале стоит предупрежедние.
> Я спросил про основные термины из области системного администрирования, ты мне подсунул какую-то парашу.
да, не то
>>524493
Я наверно немного опоздал но все же.
> что такое "открытые системы",
Это концепция что устройства разных производителей можно подключить к одной сети. Сейчас это кажется естественным и очевидным, но в 70-х каждый производитель компьютера изобретал свои форматы файлов, форматы дискет, свое сетевое оборудование, свои разъемы, свои клавиатуры, свои принтеры. И сам писал программы к своему компьютеру. Потому современному человеку не очень понятно что значит «открытый» и как может быть по-другому. Это как если бы например пользователи айфонов сидели в одном интернете, а поьзоатели андроидов в другом.
«модель» здесь значит «описание». «модель взаимодействия открытых систем» значит описание принципов, как устройства и программы разных производителей могут работать в одной сети.
>>524502
Там все же не очень понятно объясняется. Это лекции в интуите предполагают видимо уже какие-то начальные знания.
>>525121
Вот еще кое-что:
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Почему аутисты? Текст банально удобнее так как ты можешь его осмотреть в общем, можешь читать по диагонали, на слух (по моему) банально неудобнее.
>>524483
> Задротская нечитабельная херня.
Просто это рассчитано на тех уто уже знает сети, там в самом начале стоит предупрежедние.
> Я спросил про основные термины из области системного администрирования, ты мне подсунул какую-то парашу.
да, не то
>>524493
Я наверно немного опоздал но все же.
> что такое "открытые системы",
Это концепция что устройства разных производителей можно подключить к одной сети. Сейчас это кажется естественным и очевидным, но в 70-х каждый производитель компьютера изобретал свои форматы файлов, форматы дискет, свое сетевое оборудование, свои разъемы, свои клавиатуры, свои принтеры. И сам писал программы к своему компьютеру. Потому современному человеку не очень понятно что значит «открытый» и как может быть по-другому. Это как если бы например пользователи айфонов сидели в одном интернете, а поьзоатели андроидов в другом.
«модель» здесь значит «описание». «модель взаимодействия открытых систем» значит описание принципов, как устройства и программы разных производителей могут работать в одной сети.
>>524502
Там все же не очень понятно объясняется. Это лекции в интуите предполагают видимо уже какие-то начальные знания.
>>525121
Вот еще кое-что:
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Не в таблице, а в массиве наверно?
Вот так: $x = $m[0][1];
Ты задачи на массивы все решил?
>>525441
Насчет первой задачи, я сам смотрю на нее и не очень понимаю почему там например написано 34% - 10. Мне кажется там должно быть 34% от внутренней ширины без учета полей. Вообще это была задача на знание того как у блоков вычисляется ширина auto и как их можно прижать влево/вправо маргинами.
> Вариант 1 с дивами-обертками:
Ок, будем считать что верно.
> Вариант 2 с box-sizing:
А на что влияет box-sizing? Он никак не взаимодействует с margin и учитывает разве что 1px у бордера, то есть практически не влияет на верстку.
> потому что префиксы браузеров -moz-, -webkit- и им подобные не любит валидатор.
Охват браузеров все же важнее валидатора, да и код с одним дивом лучше чем с двумя.
Но валидатор может помочь найти ошибки в твоем коде и потому полезен.
> font: 14px/1.2 #000 arial;
В конец списка шрифтов надо писать стандартный sans, sans-serif, monospace или cursive для тех у кого нет ариала.
В остальном верно.
> Это почему-то не работает:
Нельзя указывать цвет в font
> font-size: 40px;
Вместе с fnt-size всегда указывай line heght, иначе оно наследуется от родителя
> font-family: "Times New Roman";
Нужен стандартный шрифт в конце: http://htmlbook.ru/css/font-family
> При чем тут вообще em? Чтобы показать, что стили любого элемента можно переопределить?
Да
> Не понял задание.
Задание на умение переопределять стили и HTML мнемоники.
> 4 задание
Там не 10px между блоками, смотри сам: https://jsfiddle.net/3jok8w7k/1/
Почитай-ка подказки к задаче.
> ? А, у них там принято писать <br/> под xhtml, поэтому разметка ломается.
Ага до сих пор в параллельной реальности (в которой используют XHTML) живут
> Не понял, как должен по заданию себя вести синий блок при малой ширине браузера.
Занимать все доступное место по ширине, как у тебя и сделано
line-height и стандартного шрифта не хватает, а так все верно.
Не в таблице, а в массиве наверно?
Вот так: $x = $m[0][1];
Ты задачи на массивы все решил?
>>525441
Насчет первой задачи, я сам смотрю на нее и не очень понимаю почему там например написано 34% - 10. Мне кажется там должно быть 34% от внутренней ширины без учета полей. Вообще это была задача на знание того как у блоков вычисляется ширина auto и как их можно прижать влево/вправо маргинами.
> Вариант 1 с дивами-обертками:
Ок, будем считать что верно.
> Вариант 2 с box-sizing:
А на что влияет box-sizing? Он никак не взаимодействует с margin и учитывает разве что 1px у бордера, то есть практически не влияет на верстку.
> потому что префиксы браузеров -moz-, -webkit- и им подобные не любит валидатор.
Охват браузеров все же важнее валидатора, да и код с одним дивом лучше чем с двумя.
Но валидатор может помочь найти ошибки в твоем коде и потому полезен.
> font: 14px/1.2 #000 arial;
В конец списка шрифтов надо писать стандартный sans, sans-serif, monospace или cursive для тех у кого нет ариала.
В остальном верно.
> Это почему-то не работает:
Нельзя указывать цвет в font
> font-size: 40px;
Вместе с fnt-size всегда указывай line heght, иначе оно наследуется от родителя
> font-family: "Times New Roman";
Нужен стандартный шрифт в конце: http://htmlbook.ru/css/font-family
> При чем тут вообще em? Чтобы показать, что стили любого элемента можно переопределить?
Да
> Не понял задание.
Задание на умение переопределять стили и HTML мнемоники.
> 4 задание
Там не 10px между блоками, смотри сам: https://jsfiddle.net/3jok8w7k/1/
Почитай-ка подказки к задаче.
> ? А, у них там принято писать <br/> под xhtml, поэтому разметка ломается.
Ага до сих пор в параллельной реальности (в которой используют XHTML) живут
> Не понял, как должен по заданию себя вести синий блок при малой ширине браузера.
Занимать все доступное место по ширине, как у тебя и сделано
line-height и стандартного шрифта не хватает, а так все верно.
Пункты меню надо расставить подальше друг от друга.
> .menu li {
> list-style-type: none;
Это можно поставить на ul, оно наследуется
> По умолчанию
> margin-before: 1em;
> padding-start: 40px;
Более того, раньше ИЕ использовал для отступа одно свойтво, а остальные браузеры другое.
> .menu a:visited,
> color: inherit;
Не уверен что это хорошо, ты отключаешь одну из удобных функций, возможность видеть где ты уже был. Хотя в меню иногда так делают, не уверен что это удобно.
> Тут должен начаться педантичный холивар,
> какой способ лучше использовать: паддинги,
> overflow или clear.
Паддинги не удерживают флоаты, оверфлоу не для этого и имеет побочные эффекты в виде обрезания всего что выходит за края, потому наш выход это клеарфикс:
http://nicolasgallagher.com/micro-clearfix-hack/ (англ)
http://webknowledge.ru/novaya-mikro-versiya-haka-clearfix/ (рус)
> 7)
> Откуда-то берется один лишний пиксель.
Это не фаерфокс случаем? http://davidwalsh.name/firefox-buttons
Заметь что эта штука там для благих целей: показывать выделенную кнопку. Но верстку может сломать.
Дробные числа не советую, разные браузеры округляют по разному, это лишние проблемы на твою голову: http://habrahabr.ru/post/31392/
Суть этого задания дать понять что инпут и кнопка используют разный box-sizing (что интересно так было всегда даже когда этого свойства не было. Несколько лет назад у меня не получалось сделать форму ровной, я начал мерять размеры элементов и обнаружил этот факт)
Надо для кнопки задать высоту. У тебя она не задана и в разных браузерах может получиться разной.
Между кнопкой и инпутом больше чем 10px
> 8 задача
> верстка должна позволять без изменения CSS дописать или убрать любое число абзацев, списков, заголовков, картинок и примечаний
Один анон сделал классы .note1, .note2 пришлось добавить намек что блоков может быть больше.
> Не понимаю, что имеется ввиду. Намек на выпадение плавающего блока?
Это значит что если мы засунем туда стандартный текст вида
<h1>...</h1>
<p>...</p>
<ul><li>...</li></ul>
Все должно работать. А у тебя? https://jsfiddle.net/vhm7wnh7/1/
Твой вариант не пожойдет, так как с ним кто-то должен сидеть и руками переделывать все теги в тексте. А нам надо просто чтобы мы могли вставить в текст див с классом и получить примечание.
Почитай также подсказки к задаче.
> <div class="paragraph">
Ты только что изобрел тег <p>. Зачем?
> Решается заданием padding у параграфа.
Нет, padding добавлять надо на контейнере или body. Иначе он будет применяться не ко всем тегам в содержимом.
Пункты меню надо расставить подальше друг от друга.
> .menu li {
> list-style-type: none;
Это можно поставить на ul, оно наследуется
> По умолчанию
> margin-before: 1em;
> padding-start: 40px;
Более того, раньше ИЕ использовал для отступа одно свойтво, а остальные браузеры другое.
> .menu a:visited,
> color: inherit;
Не уверен что это хорошо, ты отключаешь одну из удобных функций, возможность видеть где ты уже был. Хотя в меню иногда так делают, не уверен что это удобно.
> Тут должен начаться педантичный холивар,
> какой способ лучше использовать: паддинги,
> overflow или clear.
Паддинги не удерживают флоаты, оверфлоу не для этого и имеет побочные эффекты в виде обрезания всего что выходит за края, потому наш выход это клеарфикс:
http://nicolasgallagher.com/micro-clearfix-hack/ (англ)
http://webknowledge.ru/novaya-mikro-versiya-haka-clearfix/ (рус)
> 7)
> Откуда-то берется один лишний пиксель.
Это не фаерфокс случаем? http://davidwalsh.name/firefox-buttons
Заметь что эта штука там для благих целей: показывать выделенную кнопку. Но верстку может сломать.
Дробные числа не советую, разные браузеры округляют по разному, это лишние проблемы на твою голову: http://habrahabr.ru/post/31392/
Суть этого задания дать понять что инпут и кнопка используют разный box-sizing (что интересно так было всегда даже когда этого свойства не было. Несколько лет назад у меня не получалось сделать форму ровной, я начал мерять размеры элементов и обнаружил этот факт)
Надо для кнопки задать высоту. У тебя она не задана и в разных браузерах может получиться разной.
Между кнопкой и инпутом больше чем 10px
> 8 задача
> верстка должна позволять без изменения CSS дописать или убрать любое число абзацев, списков, заголовков, картинок и примечаний
Один анон сделал классы .note1, .note2 пришлось добавить намек что блоков может быть больше.
> Не понимаю, что имеется ввиду. Намек на выпадение плавающего блока?
Это значит что если мы засунем туда стандартный текст вида
<h1>...</h1>
<p>...</p>
<ul><li>...</li></ul>
Все должно работать. А у тебя? https://jsfiddle.net/vhm7wnh7/1/
Твой вариант не пожойдет, так как с ним кто-то должен сидеть и руками переделывать все теги в тексте. А нам надо просто чтобы мы могли вставить в текст див с классом и получить примечание.
Почитай также подсказки к задаче.
> <div class="paragraph">
Ты только что изобрел тег <p>. Зачем?
> Решается заданием padding у параграфа.
Нет, padding добавлять надо на контейнере или body. Иначе он будет применяться не ко всем тегам в содержимом.
Это кстати пример бардака, терминалы находятся в одной сети с кучей других устройств. Не знаю, банкомат это или просто терминал для оплаты но это пренебрежение всеми нормами безопасности. Достаточно «Вовану» скачать троян на комп и его автор получает доступ ко всем терминалам.
Должна быть выделенная изолированная сеть.
>>525588
Причем из-за того что мат. операции не выдают исключений, заметить ошибку становится только труднее.
>>525754
> Бросаем кубик.
Верно
> кубики
правильно
> кредит
Хорошо бы убрать копипасту:
> $creditBalance = $creditBalance - $monthlyPayment;
> \techo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal}
Дублирование кода это главное зло.
> вклад на миллион
Все верно
> средний балл
Верно
> рост
Правильно
> могу лт выучить php
Тут все хорошо. Насчет 5.4, эта версия уже считается старьем так что используй смело.
> стихи
> $word2[mt_rand(0,6)]
нехорошо, что надо руками считать числа. Надо чтобы само сичталось. Также посмотри функцию array_rand в мануале.
Это кстати пример бардака, терминалы находятся в одной сети с кучей других устройств. Не знаю, банкомат это или просто терминал для оплаты но это пренебрежение всеми нормами безопасности. Достаточно «Вовану» скачать троян на комп и его автор получает доступ ко всем терминалам.
Должна быть выделенная изолированная сеть.
>>525588
Причем из-за того что мат. операции не выдают исключений, заметить ошибку становится только труднее.
>>525754
> Бросаем кубик.
Верно
> кубики
правильно
> кредит
Хорошо бы убрать копипасту:
> $creditBalance = $creditBalance - $monthlyPayment;
> \techo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal}
Дублирование кода это главное зло.
> вклад на миллион
Все верно
> средний балл
Верно
> рост
Правильно
> могу лт выучить php
Тут все хорошо. Насчет 5.4, эта версия уже считается старьем так что используй смело.
> стихи
> $word2[mt_rand(0,6)]
нехорошо, что надо руками считать числа. Надо чтобы само сичталось. Также посмотри функцию array_rand в мануале.
> Я кстати, не совсем понял, что значит на уровне ядра, лол
На уровне ядра — значит все функции (их в PHP очень много, сотни) работы со строками правильно режут строки на буквы.
Сейчас PHP не поддерживает специально никакие кодировки а строки рассматривает как набор байт (то есть абстрактных чисел), а не букв. Строки в памяти хранятся в том же виде и кодировке, в какой вписаны в коде. strlen возвращает число байт в строке. Урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Более того, разница будет например при сравнении строк. Сейчас строки сравниваются по кодам символов и например буква «ё» меньше чем «а» так как идет в юникоде раньше. Вот мой урок про сравнение строк: https://gist.github.com/codedokode/ea09d0224a4df0c4442f
Как видишь, там много разных интересных особенностей.
Сортировка тоже сейчас работает не по алфавитным правилами, а по значениям байтов, которые не для всех языков и букв идут в нужном порядке (для латинницы в английском работает).
PHP сам не знает какую кодировку ты используешь для программы. Это нигде не задается. Если у тебя все в utf-8, все хорошо. Если не все в utf-8 — начинаются проблемы и необходимость ставить барьеры для перекодировки, и легко сделать где-то ошибку.
Как я помню, поддержка требовала перелопатить весь код php и от нее отказались в итоге.
Другие языки, напрмер, JS, java, python, знают в какой кодировке они хранят строки.
> В чем отличие между "на уровне ядра" и в качестве врубленного по умолчанию расширения?
У тебя правильно со строками работают толко mb функции, а все остальные — нет.
Вот история от разработчиков, пытавшихся сделать поддержку unicode в ядре на англ. : http://www.slideshare.net/andreizm/the-good-the-bad-and-the-ugly-what-happened-to-unicode-and-php-6
Про Юникод что-то написано в вики: https://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4
> И добавят ли его в php7 на уровне ядра?
Нет скорее всего
> Что мешает добавить функции mb_ в сам php?
Надо переделать сотни других существующих функций. Включая расширения.
>>525849
Нету.
> Я кстати, не совсем понял, что значит на уровне ядра, лол
На уровне ядра — значит все функции (их в PHP очень много, сотни) работы со строками правильно режут строки на буквы.
Сейчас PHP не поддерживает специально никакие кодировки а строки рассматривает как набор байт (то есть абстрактных чисел), а не букв. Строки в памяти хранятся в том же виде и кодировке, в какой вписаны в коде. strlen возвращает число байт в строке. Урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Более того, разница будет например при сравнении строк. Сейчас строки сравниваются по кодам символов и например буква «ё» меньше чем «а» так как идет в юникоде раньше. Вот мой урок про сравнение строк: https://gist.github.com/codedokode/ea09d0224a4df0c4442f
Как видишь, там много разных интересных особенностей.
Сортировка тоже сейчас работает не по алфавитным правилами, а по значениям байтов, которые не для всех языков и букв идут в нужном порядке (для латинницы в английском работает).
PHP сам не знает какую кодировку ты используешь для программы. Это нигде не задается. Если у тебя все в utf-8, все хорошо. Если не все в utf-8 — начинаются проблемы и необходимость ставить барьеры для перекодировки, и легко сделать где-то ошибку.
Как я помню, поддержка требовала перелопатить весь код php и от нее отказались в итоге.
Другие языки, напрмер, JS, java, python, знают в какой кодировке они хранят строки.
> В чем отличие между "на уровне ядра" и в качестве врубленного по умолчанию расширения?
У тебя правильно со строками работают толко mb функции, а все остальные — нет.
Вот история от разработчиков, пытавшихся сделать поддержку unicode в ядре на англ. : http://www.slideshare.net/andreizm/the-good-the-bad-and-the-ugly-what-happened-to-unicode-and-php-6
Про Юникод что-то написано в вики: https://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4
> И добавят ли его в php7 на уровне ядра?
Нет скорее всего
> Что мешает добавить функции mb_ в сам php?
Надо переделать сотни других существующих функций. Включая расширения.
>>525849
Нету.
Очень хорошие условия. Но чому-то отталкивающе действуют.
У миддла есть не только знания но и опыт. Знание Юи это не миддловские знания.
>>525927
> <div class="clear-dummy"></div>
Сделай-ка это клеарфиксом, как написано в подсказке под задачей, чтобы не полдить лишние дивы.
> font-size: 14px;
Вместе с font-size указывай line-height
> <div class="description">
Я думаю, тут можно обойтись без этого дива. Попробуй его убрать.
> 10)
> Если бы я знал хотя бы высоту этого блока
то это было бы задание не для нашего треда, а для /web
> Напрашивается какой-нибудь ::before, но тогда вопрос, как зафиксировать положение этого псевдоэлемента по горизонтали.
Абсолютное позиционирование без указания top/bottom. Если не укзать положение то элеимент располагается там же где он был бы в потоке.
> То есть непонятно как ее пристыковать к нижнему краю изображения
Абсолютное позиционирование конечно
http://softwaremaniacs.org/blog/2005/08/03/css-layout-positioning/
http://htmlbook.ru/samlayout/blochnaya-verstka/pozitsionirovanie-elementov
Кстати, раз ты не смог с первого раза сделать задачу, тебе дополнительное задание: сделай чтобы при наведении мыши на картинку надпись плавно сворачивалась, а при уведении восстанавливалась. Тебе поможет transition.
У миддла есть не только знания но и опыт. Знание Юи это не миддловские знания.
>>525927
> <div class="clear-dummy"></div>
Сделай-ка это клеарфиксом, как написано в подсказке под задачей, чтобы не полдить лишние дивы.
> font-size: 14px;
Вместе с font-size указывай line-height
> <div class="description">
Я думаю, тут можно обойтись без этого дива. Попробуй его убрать.
> 10)
> Если бы я знал хотя бы высоту этого блока
то это было бы задание не для нашего треда, а для /web
> Напрашивается какой-нибудь ::before, но тогда вопрос, как зафиксировать положение этого псевдоэлемента по горизонтали.
Абсолютное позиционирование без указания top/bottom. Если не укзать положение то элеимент располагается там же где он был бы в потоке.
> То есть непонятно как ее пристыковать к нижнему краю изображения
Абсолютное позиционирование конечно
http://softwaremaniacs.org/blog/2005/08/03/css-layout-positioning/
http://htmlbook.ru/samlayout/blochnaya-verstka/pozitsionirovanie-elementov
Кстати, раз ты не смог с первого раза сделать задачу, тебе дополнительное задание: сделай чтобы при наведении мыши на картинку надпись плавно сворачивалась, а при уведении восстанавливалась. Тебе поможет transition.
> input[type="radio"] {
> display: none;
Это влияет на все кнопки на странице. Сделай чтобы действовало только на кнопки внутри твоего виджета иначе его нельзя добавить к существующей форме.
> Уголки вылезают наружу при выделении.
Ты поверх скругленного label выводишь квадратный серый span вот он и закрывает уголки. Увеличь масштаб и увидь.
Ну и пока у тебя не очень похоже на рисунок, паддингов не хватает по горизонтали, тесно, тени нет на выделенной кнопке.
> Все-таки логичнее было бы использовать label с атрибутом for.
Чем логичнее? Лишний код писать надо.
ну и тут https://jsfiddle.net/dug3ju1b/1/ двойные линии
Там квадратный спан их закрывает.
>>525938
Для маленькой ширины сделать можно вертикальную версию.
>>525955
Все верно
>>526051
У меня без. Кстати, интуиция подсказывает мне, что ставя громкость программно (а не аналогово) на минимум, я уменьшаю динамический диапазон и качество звука. Но уши мне ороже.
>>526064
Оно работает на массивах, а не объектах и это конечно не очень хорошо.
>>526118
http://uleming.github.io/gitbook/4_%D0%9E%D1%82%D0%BC%D0%B5%D0%BD%D0%B0_%D0%B2_git_-_%D0%A1%D0%B1%D1%80%D0%BE%D1%81,_%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%9E%D1%82%D0%BA%D0%B0%D1%82.html
git revert SHA должно сработать
Не знаю зачем там книги, мне кажется гит не такая штука по которой надо огромную книгу прочесть.
>>526194
Ну так одно дело когда ты делаешь в первый раз, другое дело когда не в первый. и одно дело когда делаешь для не знающего HTML заказчика и совсем другое дело — для нашего треда.
Так что не на годы, на пару недель максимум.
>>526214
Ну сходил бы проверил. Или ты боишься что паспорт отберут и в подвале закроют?
Там квадратный спан их закрывает.
>>525938
Для маленькой ширины сделать можно вертикальную версию.
>>525955
Все верно
>>526051
У меня без. Кстати, интуиция подсказывает мне, что ставя громкость программно (а не аналогово) на минимум, я уменьшаю динамический диапазон и качество звука. Но уши мне ороже.
>>526064
Оно работает на массивах, а не объектах и это конечно не очень хорошо.
>>526118
http://uleming.github.io/gitbook/4_%D0%9E%D1%82%D0%BC%D0%B5%D0%BD%D0%B0_%D0%B2_git_-_%D0%A1%D0%B1%D1%80%D0%BE%D1%81,_%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%9E%D1%82%D0%BA%D0%B0%D1%82.html
git revert SHA должно сработать
Не знаю зачем там книги, мне кажется гит не такая штука по которой надо огромную книгу прочесть.
>>526194
Ну так одно дело когда ты делаешь в первый раз, другое дело когда не в первый. и одно дело когда делаешь для не знающего HTML заказчика и совсем другое дело — для нашего треда.
Так что не на годы, на пару недель максимум.
>>526214
Ну сходил бы проверил. Или ты боишься что паспорт отберут и в подвале закроют?
>Задания на яваскрипт (простые)
а есть еще сложные??
>не работает font: 40px/1.5 #333 "Times New Roman";
>потому что нельзя указывать цвет в font
Что? А почему тогда работает font: 14px/1.2 #000 arial; ?
Ну ладно, мне все равно привычнее писать правила по-отдельности: font-size, font-family, line-height и т.д.
Вопрос не по теме: я недавно пересел на эту вашу убунту, и последнее время стал дико тормозить то ли рабочий стол (xfce), то ли проводник (thunar, иногда вылетает, особенно если быстро кликнуть несколько раз кнопку переходу в папку выше).
Может кто сталкивался, как там его лечить.
Потому что кликаю правой кнопкой по значку на рабочем столе, и жду секунд пять, пока появится контекстное меню. Винчестер скрипит в это время, будто я запускаю yoba-игру.
Нету таких, сами в ахуе.
Читай руководство, смотри код демок, которые идут вместе с фреймворком. Поищи простые проекты на гитхабе, написанные на yii.
На ютубе есть пара видеообзоров, практически нулевого качества. Но если хочешь составить общее представление о фреймворке, то может и сгодится для начала.
Тут какой-то заикающийся колхозник с дешевым микрофоном и денвером.
https://www.youtube.com/watch?v=sPPNbGTz_wA&list=PLqJ6zVC9hND8GqR31EcKVlDAeUh6m6z0m
Вот небольшой обзор от более-менее компетентных кодеров, но опять-таки ценности в нем мало.
https://www.youtube.com/user/BioWareSonic/videos
Все это по первому yii, по второму вообще ничего нет.
Привыкай читать техническую документацию (мне самому от этого дико печет), хороших материалов вообще нет.
Вообще мы уже в другом треде.
Ищешь регляркой слова, в которых есть буквы из разных алфавитов, а затем через preg_replace заменяшь неправильные буквы на буквы в скобках.
Погружаюсь в SQL, решаю задачки на sql-ex.ru
Теория там написана сложным для меня языком, наверно я дебил, и она в большинстве случаев мне не помогает.
Сейчас решаю задачу, видел, что некоторые запихивают в FROM скобки с SELECTом. Почему при таком вложении возникает ошибка? Где вообще почитать правила вложения в FROM? В примере я пытаюсь присвоить переменную avg_p первым скобкам и avg_l вторым чтобы позже сложить SUM'ом значения из этих двух переменных в одну. Если интересно, это задание №26 с вышеупомянутого сайта.
SELECT SUM(AVG_Price)
FROM (
SELECT AVG(price) AS AVG_Price
FROM pc p
JOIN product pr ON p.model=pr.model
WHERE maker='A') avg_p, (SELECT AVG(price)
FROM laptop l
JOIN product pr ON l.model=pr.model
WHERE maker='A'
) avg_l
No column name was specified for column 1 of 'avg_l'.
Это копия, сохраненная 29 августа 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.