Это копия, сохраненная 15 июля 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Помогаем друг другу как можем, ждем загулявшего ОПа.
Предыдущий тред https://2ch.hk/pr/res/487138.html
В архиваче http://arhivach.org/thread/88638/
Добро пожаловать в нашу элитную частную академию, уютно расположившуюся на просторах сети. В этом доступном только избранным заведении мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>479598
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
У нас есть уроки по основам 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) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Тред не легитимный. Сидим в старом.
Игорь Борисов в треде, я спокоен.
А все, разобрался.
>>494859
А может книгу? Единственная про ООП в PHP. Но хорошая http://rutracker.org/forum/viewtopic.php?t=4212311
CREATE TABLE IF NOT EXISTS meter
(
id int AUTO_INCREMENT PRIMARY KEY,
one varchar,
two varchar,
three varchar,
four varchar
);\t
INSERT INTO meter (id, one, two, three, four) VALUES
(1, 11, \t'...', \t'...',\t'...'),
(2, 22, \t'...', \t'...',\t'...'),
(3, 33, \t'...', \t'...',\t'...'),
(4, 11, \t'...', \t'...',\t'...'),
(5, 22, \t'...', \t'...',\t'...'),
(6, 33, \t'...', \t'...',\t'...'),
1. Контакт написан на бутстрап?
2. Как происходит обмен сообщениями без перезагрузки страницы, это яваскрипт или аякс?
1. Нет, бутстрап - это всего-лишь сеточка на css и красивые кнопочки, это умеет делать любая макака с опытом более недели работы, бутстрап это для начинающих
2. аякс - это Async Javascript And XML, улавливаешь?
Аякс - это технология, использующая яваскрипт (на клиенте).
> Async Javascript And XML
Это раньше, сейчас просто AJAX без расшифровки (потому что XML используется очень редко, обычно JSON).
Оп, тебе платять за это говно?
Как кааак блять создав динамическую ссылку page=yoba записать в нее данные! fopen??
Я нихуя не понял что ты хочешь.
>>495609
Из официального
> MVC на сервере (PHP) и клиенте (JS) реализуется немного по-разному. backbone это для яваскрипта, Zend это для PHP.
> Начать советую с фреймворка попроще, вроде Yii2. После него можешь за симфони 2 браться. А Zend 1 уже довлоьно старый, сейчас Zend 2 есть, но он по популярности уступает симфони 2.
Автоинкремент опускается, потому что подставляется автоматически. В твоем случае будет
INSERT
INTO meter (one, two, three, four)
VALUES (11, '...', '...', '...')
Спасибо! А с backbone начинать не стоит? У меня просто книжка по нему есть.
Ну мне в принципе не очень важно, насколько популярно, главное чтобы работало.
Ждем Zend 3, говорят он должен юзать возможности php7 и под него оптимизирован.
Рапортирую всем нубам. Первая работа за которую получил деньги плагин на wp, вторая интеграция и немного контент-менеджмента на том же вп. Сейчас устроился на работу буду писать исключительно back end для magento и php, то есть от меня минимальное знание front-end нужно, но нужно знать линукс, установка, настройка, поднять апач и виртуалхосты на нем, ngix, git. Framework-и какие-нибудь в обязательном порядке и не знаю. Спрашивайте если чо
Как можно в netbeans включить автодополнение для стандартных функций php? Да еще что б рядом показывалось что функция принимает и возвращает с кратким ее описанием. До этого ставил из реп арча фулл-версию, все это было. Сейчас вынужденно перекатился на убунту, так там в репах седьмая версия только, решил скачать с сайта версию для пых-пых кодеров, а там вон оно что оказалось. Помогите, котаны =)
p.s. само автодополнение работает, но оно только для конструкций языка, как я понял, а вот функции показывать не хочет, даже не выделяет их никак, словно они пользовательские.
В общем, есть связь многие-ко-многим, и при её реализации в одной из таблиц, а точнее в таблице улицы, происходит дублирование данных. Нужно без всяких хитровыебанных способов сделать так, чтобы такого не было.
Обычная связь многие-ко-многим через третью таблицу, не вижу здесь никакого дублирования.
Нечитая внимательно и быстро индийское решение:
Убери из вспомогательной таблицы КодУлицыПредприятия и сделай там первичным ключом КодУлицы и КодПредприятия.
Тогда дубляжей не должно быть.
Блядский access, кто его пользует, в институтах ябут наверное?
Хуево, значит придется переделывать - в третьей таблице (связь улицы и предприятия) менять коды улиц, затем из таблицы с улицами удалять все лишнее. Надо подумать над запросом.
А Access точно поддерживает составные ключи? В универе когда-то писал на нем курсач, помню, что SQL там сильно урезанный.
>Ничего не изменилось
Ты точно сделал составной ключ? И вообще поидее ты должен сначала создать улицу а потом соединить её с предприятием.
Черт, я даже не знаю, выделил два поля, выбрал ключ.
>И вообще поидее ты должен сначала создать улицу а потом соединить её с предприятием.
А вот здесь поподробнее
Ну какбы если ты создал улицу Горького например, у неё Код = 1 например и ты опять создал улицу Горького, в итоге у тебя их 2, первая улица с Кодом = 1, вторая с Кодом = 2.
И ты должен поидее знать Код улицы прежде чем "связать" их с предприятием.
Ну это логично, только вот как это в базе данных сделать я понятия не имею.
>а точнее в таблице улицы, происходит дублирование данных
Код должен быть первичным ключом и он должен быть уникальным.
Т.е. «unique key», но в данном случае — даже «primary key», первичный ключ. Они уникальные.
Тогда в том месте, где происходило дублирование, БД выкинет ошибку, и надо будет внести исправления в код, чтобы не дублировалось и не ломалось.
Вручную в Улицы вводи данные, Потом в Предприятия. Потом в таблицу посредник.
Я не знаю всех фич access, но может там можно как-то в более удобном виде все сделать, чтобы всякие меню выпадали и Иисус спасибо говорил
>>496403
Тут дело в том что под уникальностью подрузамевается название улицы, а это сделать гораздо труднее
>>496404
Ул. Горького
Горького
гОрького
горького1
...
и т.д.
Сомнительный вариант, его можно обойти, думаю первичного ключа здесь хватит с лихвой
?php
error_reporting(-1);
$dollars = 200; / Число долларов /
$exchangeRate = 32.24; / Курс обмена /
$roubles = 0; / А вот эту строчку надо дописать самому /
echo "$dollars долларов можно обменять на $roubles рублей";
Анон молю помоги с решением, никак не могу понять
бамп вопросу
Долляры помножить на рейты, нет?
$(function(){
\t\t
\t\t\tvar content = $("div.content");
\t\t\t $("button").on("click", function() {
\t\t\t content.animate("font-size": "24px");
\t\t\t});
\t\t});
Как сделать так что бы при повторном нажатии на ту же кнопку, результаты этой анимации сбросились? То есть шрифт вернулся к начальному значению, важно что бы это делалось именно этой же кнопкой.
ТогглКласс.
`echo <<<МЕТКА
Строка1<br>
Строка2<br>
Строка3<br>
МЕТКА;`
Стоит ли использовать?
Это как бы не официальный тред, созданный какими-то шутниками. ОП тут не сидит.
Суть в том, что <br> тут не нужен.
В перле так хуячили.
Есть урок на тему DI https://gist.github.com/codedokode/e1d31a31b37d5f635057
>>496727
Кошмар какой-то. Алсо ты уверен что там косые кавычки? Они в PHP выполняют внешнюю команду: http://php.net/manual/ru/language.operators.execution.php
>>496760
> \t$sin = sin(deg2rad($angle));
> $x = round($sin × 180 / pi() × $radius);
А зачем ты синус на 180 умножаешь? Умножать на 180 надо для преобразования из радиан в градусы (но удобнее использовать deg2rad/rad2deg)
Чтобы найти координату точки на круге достаточно радиус умножить на синус/косинус угла.
Спасибо, работает
Материал годный, интересный. Задачи норм. Но его манера речи и постоянное специальное неверное произношение английских слов - пехапе и тому подобное дико вымораживают. Хотя тут дело вкуса, может кому и норм. Но я был бы дико счастлив есил бы курсы по php и js вел чувак из курсов 3d - спокойная речь, без выкриков, коверканий и прочей хероты. Сейчас вот прямо смотрю, но сука через немогу, поскольку лучше материала пока не видел.
На английском или русском, для нубов.
https://laravel.ru/docs/v4/quick
Возможно. Просто так так это мой первый флеймворк, после ASP MVC, нужны разъяснения зачем мне "миграции", маршрутизации и прочее из быстрого старта?
Я накатил одноименный плагин для пхпсторма , избавлен ли я от всех эти настроек?
Устанановил NetBeans 8.0.2 и Апачи, я дальше хуй знает , что делать, по твоим гайдам хуйня для виндоуса, у меня линукс, помоги няша.
php из моей ссылки в ньюфаг-треде не забыл поставить?
Надеюсь нет.
И читай что пишет тебе апач - /var/www/html/
Закинь туда любой из своих .php файликов, и открой через браузер, 127.0.0.1/something.php
Если пхп установлен - должен прискакать интерпретатор и проинтерпретировать код. Иначе ты увидишь только свой исходник, а не результат его работы.
Error opening file '/var/run/apache2/2': Permission denied
Пиздец какой то и как теперь закинуть свою пипиху в папку с апаче?
Щито ты делаешь, блять? Где это пишется, после каких действий?
У тебя есть файл yoba.php
Ты делаешь sudo cp yoba.php /var/www/html/
И браузером открываешь 127.0.0.1/yoba.php
У меня есть файл 2.php , который содержит ту хуйню с кубиком.
Есть NetBeans и есть 127.0.0.1 при котором появляется апачи.
>/var/www/html/
Я думал сюда надо закинуть 2.php файл
и потом через НетБенс открыть.
>Ты делаешь sudo cp yoba.php /var/www/html/
Скрин
>И браузером открываешь 127.0.0.1/yoba.php
Скрин
Да я туп анон, но не бросай.
А не лучше сразу с 5 начать? Миграции, маршрутизации итп это везде есть, не эксклюзив. Тебе надо разве что с элокуентом разобраться и в целом что где у фреймфорка лежит и куда что на писать. А остальное просто.
Про плагин не знаю ничего.
годно выглядит, тоже хочу перекатиться на linux, долго осваивать, няша?
ты не тот анон, которому нужно за 2 месяца освоить Zend?
Забудь пока про нетбинс. Ты копируешь криво. cp же пишет что 2.php - no such file. Свежеоткрытый терминал по-дефолту находится в домашнем каталоге, в /home/username/, а твой 2.php лежит где-то в другом месте, хз куда ты его сохранил через нетбинс.
Либо делай по полному пути, sudo cp /home/юзернейм/хзчто/нетбинс/2.php /var/www/html/, либо попробуй скопировать через файловый менеджер. Если спросит пароль - введи тот, что вводил для судо. Если скажет permission denied - запусти файловый менеджер от рута или через sudo.
Собстна ситуация. Кун 25 лет, до 24 лет программировал разве что только скрипты на линух да в универе бэйсик для общего развития, имею высшее техническое, но весьма далекое от компьютеров и программирования. Собственно не поздновато ли браться за веб-программирование? Думаю осилить пока html5, css, php, js и наверно mysql. Начну пожалуй с codeacademy курсов да archive-ipq-co.narod.ru . Хороший план или не очень, что говорит ваш опыт изучения данных технологий?
Никогда не поздно.
Появился первый вопрос.
http://ideone.com/9O7hYR
Почему на шестой строчке выводится просто 15, а не ожидаемо 16.
Почему 18 и 20 строки выводят 8 и 1. Как происходит счет в них?
6 - Потому что сначала используется старое значение, а потом инкрементируется, сравни с ++$a
18 - побитовое "и" гугли
20 - наверное логическое и гугли
А мне норм. Только сейчас смотрел HTML/CSS 2014. Визибилити хид-ден. А вот посетителей он слегка задирает чет. Неуважение прям. Они там бедные по 25-30 т. платят, а он их говном поливает, лал.
https://ideone.com/
Для JS http://jsfiddle.net/ http://codepen.io/pen/
>>497218
/etc/apache2/sites-available/default[.conf]
покажи
Уже совсем запутался.
Вот вывод в блоке контента где должны выводится посты в формате название поста + пост
В бд создал таблицу с четырмя столбцами соответсвенно id, title, date, content
В таблице есть значения.
На экран выводит ошибку Warning: Invalid argument supplied for foreach()
Их тут двое.
<VirtualHost :80>
\t# The ServerName directive sets the request scheme, hostname and port that
\t# the server uses to identify itself. This is used when creating
\t# redirection URLs. In the context of virtual hosts, the ServerName
\t# specifies what hostname must appear in the request's Host: header to
\t# match this virtual host. For the default virtual host (this file) this
\t# value is not decisive as it is used as a last resort host regardless.
\t# However, you must set it for any further virtual host explicitly.
\t#ServerName www.example.com
\tServerAdmin webmaster@localhost
\tDocumentRoot /var/www/html
\t# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
\t# error, crit, alert, emerg.
\t# It is also possible to configure the loglevel for particular
\t# modules, e.g.
\t#LogLevel info ssl:warn
\tErrorLog ${APACHE_LOG_DIR}/error.log
\tCustomLog ${APACHE_LOG_DIR}/access.log combined
\t# For most configuration files from conf-available/, which are
\t# enabled or disabled at a global level, it is possible to
\t# include a line for only one particular virtual host. For example the
\t# following line enables the CGI configuration for this host only
\t# after it has been globally disabled with "a2disconf".
\t#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
и
<IfModule mod_ssl.c>
\t<VirtualHost _default_:443>
\t\tServerAdmin webmaster@localhost
\t\tDocumentRoot /var/www/html
\t\t# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
\t\t# error, crit, alert, emerg.
\t\t# It is also possible to configure the loglevel for particular
\t\t# modules, e.g.
\t\t#LogLevel info ssl:warn
\t\tErrorLog ${APACHE_LOG_DIR}/error.log
\t\tCustomLog ${APACHE_LOG_DIR}/access.log combined
\t\t# For most configuration files from conf-available/, which are
\t\t# enabled or disabled at a global level, it is possible to
\t\t# include a line for only one particular virtual host. For example the
\t\t# following line enables the CGI configuration for this host only
\t\t# after it has been globally disabled with "a2disconf".
\t\t#Include conf-available/serve-cgi-bin.conf
\t\t# SSL Engine Switch:
\t\t# Enable/Disable SSL for this virtual host.
\t\tSSLEngine on
\t\t# A self-signed (snakeoil) certificate can be created by installing
\t\t# the ssl-cert package. See
\t\t# /usr/share/doc/apache2/README.Debian.gz for more info.
\t\t# If both key and certificate are stored in the same file, only the
\t\t# SSLCertificateFile directive is needed.
\t\tSSLCertificateFile\t/etc/ssl/certs/ssl-cert-snakeoil.pem
\t\tSSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
\t\t# Server Certificate Chain:
\t\t# Point SSLCertificateChainFile at a file containing the
\t\t# concatenation of PEM encoded CA certificates which form the
\t\t# certificate chain for the server certificate. Alternatively
\t\t# the referenced file can be the same as SSLCertificateFile
\t\t# when the CA certificates are directly appended to the server
\t\t# certificate for convinience.
\t\t#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt
\t\t# Certificate Authority (CA):
\t\t# Set the CA certificate verification path where to find CA
\t\t# certificates for client authentication or alternatively one
\t\t# huge file containing all of them (file must be PEM encoded)
\t\t# Note: Inside SSLCACertificatePath you need hash symlinks
\t\t#\t\t to point to the certificate files. Use the provided
\t\t#\t\t Makefile to update the hash symlinks after changes.
\t\t#SSLCACertificatePath /etc/ssl/certs/
\t\t#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt
\t\t# Certificate Revocation Lists (CRL):
\t\t# Set the CA revocation path where to find CA CRLs for client
\t\t# authentication or alternatively one huge file containing all
\t\t# of them (file must be PEM encoded)
\t\t# Note: Inside SSLCARevocationPath you need hash symlinks
\t\t#\t\t to point to the certificate files. Use the provided
\t\t#\t\t Makefile to update the hash symlinks after changes.
\t\t#SSLCARevocationPath /etc/apache2/ssl.crl/
\t\t#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl
\t\t# Client Authentication (Type):
\t\t# Client certificate verification type and depth. Types are
\t\t# none, optional, require and optional_no_ca. Depth is a
\t\t# number which specifies how deeply to verify the certificate
\t\t# issuer chain before deciding the certificate is not valid.
\t\t#SSLVerifyClient require
\t\t#SSLVerifyDepth 10
\t\t# SSL Engine Options:
\t\t# Set various options for the SSL engine.
\t\t# o FakeBasicAuth:
\t\t#\t Translate the client X.509 into a Basic Authorisation. This means that
\t\t#\t the standard Auth/DBMAuth methods can be used for access control. The
\t\t#\t user name is the `one line' version of the client's X.509 certificate.
\t\t#\t Note that no password is obtained from the user. Every entry in the user
\t\t#\t file needs this password: `xxj31ZMTZzkVA'.
\t\t# o ExportCertData:
\t\t#\t This exports two additional environment variables: SSL_CLIENT_CERT and
\t\t#\t SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
\t\t#\t server (always existing) and the client (only existing when client
\t\t#\t authentication is used). This can be used to import the certificates
\t\t#\t into CGI scripts.
\t\t# o StdEnvVars:
\t\t#\t This exports the standard SSL/TLS related `SSL_' environment variables.
\t\t#\t Per default this exportation is switched off for performance reasons,
\t\t#\t because the extraction step is an expensive operation and is usually
\t\t#\t useless for serving static content. So one usually enables the
\t\t#\t exportation for CGI and SSI requests only.
\t\t# o OptRenegotiate:
\t\t#\t This enables optimized SSL connection renegotiation handling when SSL
\t\t#\t directives are used in per-directory context.
\t\t#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
\t\t<FilesMatch "\.(cgi|shtml|phtml|php)$">
\t\t\t\tSSLOptions +StdEnvVars
\t\t</FilesMatch>
\t\t<Directory /usr/lib/cgi-bin>
\t\t\t\tSSLOptions +StdEnvVars
\t\t</Directory>
\t\t# SSL Protocol Adjustments:
\t\t# The safe and default but still SSL/TLS standard compliant shutdown
\t\t# approach is that mod_ssl sends the close notify alert but doesn't wait for
\t\t# the close notify alert from client. When you need a different shutdown
\t\t# approach you can use one of the following variables:
\t\t# o ssl-unclean-shutdown:
\t\t#\t This forces an unclean shutdown when the connection is closed, i.e. no
\t\t#\t SSL close notify alert is send or allowed to received. This violates
\t\t#\t the SSL/TLS standard but is needed for some brain-dead browsers. Use
\t\t#\t this when you receive I/O errors because of the standard approach where
\t\t#\t mod_ssl sends the close notify alert.
\t\t# o ssl-accurate-shutdown:
\t\t#\t This forces an accurate shutdown when the connection is closed, i.e. a
\t\t#\t SSL close notify alert is send and mod_ssl waits for the close notify
\t\t#\t alert of the client. This is 100% SSL/TLS standard compliant, but in
\t\t#\t practice often causes hanging connections with brain-dead browsers. Use
\t\t#\t this only for browsers where you know that their SSL implementation
\t\t#\t works correctly.
\t\t# Notice: Most problems of broken clients are also related to the HTTP
\t\t# keep-alive facility, so you usually additionally want to disable
\t\t# keep-alive for those clients, too. Use variable "nokeepalive" for this.
\t\t# Similarly, one has to force some clients to use HTTP/1.0 to workaround
\t\t# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
\t\t# "force-response-1.0" for this.
\t\tBrowserMatch "MSIE [2-6]" \
\t\t\t\tnokeepalive ssl-unclean-shutdown \
\t\t\t\tdowngrade-1.0 force-response-1.0
\t\t# MSIE 7 and newer should be able to use keepalive
\t\tBrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
\t</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Их тут двое.
<VirtualHost :80>
\t# The ServerName directive sets the request scheme, hostname and port that
\t# the server uses to identify itself. This is used when creating
\t# redirection URLs. In the context of virtual hosts, the ServerName
\t# specifies what hostname must appear in the request's Host: header to
\t# match this virtual host. For the default virtual host (this file) this
\t# value is not decisive as it is used as a last resort host regardless.
\t# However, you must set it for any further virtual host explicitly.
\t#ServerName www.example.com
\tServerAdmin webmaster@localhost
\tDocumentRoot /var/www/html
\t# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
\t# error, crit, alert, emerg.
\t# It is also possible to configure the loglevel for particular
\t# modules, e.g.
\t#LogLevel info ssl:warn
\tErrorLog ${APACHE_LOG_DIR}/error.log
\tCustomLog ${APACHE_LOG_DIR}/access.log combined
\t# For most configuration files from conf-available/, which are
\t# enabled or disabled at a global level, it is possible to
\t# include a line for only one particular virtual host. For example the
\t# following line enables the CGI configuration for this host only
\t# after it has been globally disabled with "a2disconf".
\t#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
и
<IfModule mod_ssl.c>
\t<VirtualHost _default_:443>
\t\tServerAdmin webmaster@localhost
\t\tDocumentRoot /var/www/html
\t\t# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
\t\t# error, crit, alert, emerg.
\t\t# It is also possible to configure the loglevel for particular
\t\t# modules, e.g.
\t\t#LogLevel info ssl:warn
\t\tErrorLog ${APACHE_LOG_DIR}/error.log
\t\tCustomLog ${APACHE_LOG_DIR}/access.log combined
\t\t# For most configuration files from conf-available/, which are
\t\t# enabled or disabled at a global level, it is possible to
\t\t# include a line for only one particular virtual host. For example the
\t\t# following line enables the CGI configuration for this host only
\t\t# after it has been globally disabled with "a2disconf".
\t\t#Include conf-available/serve-cgi-bin.conf
\t\t# SSL Engine Switch:
\t\t# Enable/Disable SSL for this virtual host.
\t\tSSLEngine on
\t\t# A self-signed (snakeoil) certificate can be created by installing
\t\t# the ssl-cert package. See
\t\t# /usr/share/doc/apache2/README.Debian.gz for more info.
\t\t# If both key and certificate are stored in the same file, only the
\t\t# SSLCertificateFile directive is needed.
\t\tSSLCertificateFile\t/etc/ssl/certs/ssl-cert-snakeoil.pem
\t\tSSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
\t\t# Server Certificate Chain:
\t\t# Point SSLCertificateChainFile at a file containing the
\t\t# concatenation of PEM encoded CA certificates which form the
\t\t# certificate chain for the server certificate. Alternatively
\t\t# the referenced file can be the same as SSLCertificateFile
\t\t# when the CA certificates are directly appended to the server
\t\t# certificate for convinience.
\t\t#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt
\t\t# Certificate Authority (CA):
\t\t# Set the CA certificate verification path where to find CA
\t\t# certificates for client authentication or alternatively one
\t\t# huge file containing all of them (file must be PEM encoded)
\t\t# Note: Inside SSLCACertificatePath you need hash symlinks
\t\t#\t\t to point to the certificate files. Use the provided
\t\t#\t\t Makefile to update the hash symlinks after changes.
\t\t#SSLCACertificatePath /etc/ssl/certs/
\t\t#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt
\t\t# Certificate Revocation Lists (CRL):
\t\t# Set the CA revocation path where to find CA CRLs for client
\t\t# authentication or alternatively one huge file containing all
\t\t# of them (file must be PEM encoded)
\t\t# Note: Inside SSLCARevocationPath you need hash symlinks
\t\t#\t\t to point to the certificate files. Use the provided
\t\t#\t\t Makefile to update the hash symlinks after changes.
\t\t#SSLCARevocationPath /etc/apache2/ssl.crl/
\t\t#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl
\t\t# Client Authentication (Type):
\t\t# Client certificate verification type and depth. Types are
\t\t# none, optional, require and optional_no_ca. Depth is a
\t\t# number which specifies how deeply to verify the certificate
\t\t# issuer chain before deciding the certificate is not valid.
\t\t#SSLVerifyClient require
\t\t#SSLVerifyDepth 10
\t\t# SSL Engine Options:
\t\t# Set various options for the SSL engine.
\t\t# o FakeBasicAuth:
\t\t#\t Translate the client X.509 into a Basic Authorisation. This means that
\t\t#\t the standard Auth/DBMAuth methods can be used for access control. The
\t\t#\t user name is the `one line' version of the client's X.509 certificate.
\t\t#\t Note that no password is obtained from the user. Every entry in the user
\t\t#\t file needs this password: `xxj31ZMTZzkVA'.
\t\t# o ExportCertData:
\t\t#\t This exports two additional environment variables: SSL_CLIENT_CERT and
\t\t#\t SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
\t\t#\t server (always existing) and the client (only existing when client
\t\t#\t authentication is used). This can be used to import the certificates
\t\t#\t into CGI scripts.
\t\t# o StdEnvVars:
\t\t#\t This exports the standard SSL/TLS related `SSL_' environment variables.
\t\t#\t Per default this exportation is switched off for performance reasons,
\t\t#\t because the extraction step is an expensive operation and is usually
\t\t#\t useless for serving static content. So one usually enables the
\t\t#\t exportation for CGI and SSI requests only.
\t\t# o OptRenegotiate:
\t\t#\t This enables optimized SSL connection renegotiation handling when SSL
\t\t#\t directives are used in per-directory context.
\t\t#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
\t\t<FilesMatch "\.(cgi|shtml|phtml|php)$">
\t\t\t\tSSLOptions +StdEnvVars
\t\t</FilesMatch>
\t\t<Directory /usr/lib/cgi-bin>
\t\t\t\tSSLOptions +StdEnvVars
\t\t</Directory>
\t\t# SSL Protocol Adjustments:
\t\t# The safe and default but still SSL/TLS standard compliant shutdown
\t\t# approach is that mod_ssl sends the close notify alert but doesn't wait for
\t\t# the close notify alert from client. When you need a different shutdown
\t\t# approach you can use one of the following variables:
\t\t# o ssl-unclean-shutdown:
\t\t#\t This forces an unclean shutdown when the connection is closed, i.e. no
\t\t#\t SSL close notify alert is send or allowed to received. This violates
\t\t#\t the SSL/TLS standard but is needed for some brain-dead browsers. Use
\t\t#\t this when you receive I/O errors because of the standard approach where
\t\t#\t mod_ssl sends the close notify alert.
\t\t# o ssl-accurate-shutdown:
\t\t#\t This forces an accurate shutdown when the connection is closed, i.e. a
\t\t#\t SSL close notify alert is send and mod_ssl waits for the close notify
\t\t#\t alert of the client. This is 100% SSL/TLS standard compliant, but in
\t\t#\t practice often causes hanging connections with brain-dead browsers. Use
\t\t#\t this only for browsers where you know that their SSL implementation
\t\t#\t works correctly.
\t\t# Notice: Most problems of broken clients are also related to the HTTP
\t\t# keep-alive facility, so you usually additionally want to disable
\t\t# keep-alive for those clients, too. Use variable "nokeepalive" for this.
\t\t# Similarly, one has to force some clients to use HTTP/1.0 to workaround
\t\t# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
\t\t# "force-response-1.0" for this.
\t\tBrowserMatch "MSIE [2-6]" \
\t\t\t\tnokeepalive ssl-unclean-shutdown \
\t\t\t\tdowngrade-1.0 force-response-1.0
\t\t# MSIE 7 and newer should be able to use keepalive
\t\tBrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
\t</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Я закинул в /var/www/html/ свой php файлик с какой то игрой про кубики, открываю 127.0.0.1/qwer.php и вот такой пик.
>The requested URL /qwer.php was not found on this server.
Apache/2.4.7 (Ubuntu) Server at 127.0.0.1 Port 80
В первом (default.conf) под DocumentRoot /var/www/html допиши
<Directory /var/www/user>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
Вторая (тут третья) строчка похуй, но позже пригодится, а вот Options... возможно поможет.
Покажи ls -l /var/www/html/
>>497509
Есть у меня некий класс, который работает с какой-то внешней сущностью, по API например. И чисто логически у этой внешней сущности выделяются например пользователи и заказы.
Я пишу некий базовый класс, который реализует подключение и набор "корневых" методов:
RemoteDB->getState()
RemoteDB->getImport()
RemoteDB->send()
...
Пишу классы реализующие эти сущности, пользователей и заказов
order(111)->create()->update()->delete()...
user(1)->create()->update()->delete()
Реализовываю все как в Сяшечке:
RemoteDB->order(111)->create();
RemoteDB->user(1)->create();
но! RemoteDB->order(111)
тут в конструктор класса проброса заказа падает ссылка на RemoteDB, что бы из метода create() я мог вызвать "технический" метод RemoteDB->send()
Криво это как то. Есть идеи?
Как стилизовать
<input type="range"> ?
Я хочу убрать линию и поменять ползунок на свое изображение?
Я так понял вамп это локалка, а пхпдесигнер редактор для пхп?
Через CSS, очевидно.
Нужно поиграться со свойствами background, background-image.
Вбей в гугл "как изменять стили ползунков", выдает множество статей с примерами.
http://atmpl.ru/publ/style_for_elements/stili_dlja_polzunkov_atributa_type_range/25-1-0-59
http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html
>>497540
Зачем ему тащить два js-фреймворка, если ему нужно поправить две строчки в стилях?
И не нужно забывать, что фрейворки сделаны для удобства опытных программистов, фреймворки не избавляют от знания нативного языка, яваскрипта в данном случае.
>Но я тебе и тут подскажу
лол
Грубо говоря да.
А зачем ты скачиваешь, не понимая, что это такое?
Вампсервер, как и другие сборки - это набор программ, включающий в себя php, apache и mysql.
Php - это программа-интерпретатор, которая переводит человекопонятный текст программы типа echo 'hello world' в машинный код.
Процессор твоего компьютера не знает, что такое echo 'hello' и phpinfo(). Он понимает только последовательность нулей и единичек.
Php-интерпретатор занимается переводом текста, написанного на php, в машинный язык.
Apache - это веб-сервер. Веб-сервер занимается тем, что принимает запросы от клиентов (браузеров в частности), и если запрос корректный, отдает в качестве ответа текст запрашиваемой веб-страницы. Я утрирую для лучшего понимания.
То есть когда ты вбиваешь в браузере http://www.site.ru/greeting/helloworld.php, браузер сначала обращается к dns-серверу с вопросом: "Дорогой сервер! Мне тут юзер вбил вот такой адрес www.site.ru. Покопайся в своей базе и найди айпи-адрес комьютера, на котором хранится соответствующий сайт, если он вообще существует". Днс-сервер отвечает: "Да, есть такой сайт. Тебе нужно обратиться по айпи 127.0.0.1, чтобы получить эту веб-страницу". Браузер говорит "спс))" и идет по адресу 127.0.0.1
Представим, что это номера домов. Находит значит наш браузер дом с этим адресом, стучится в дверь. Открывается окошко, высовывается бабка-вахтерша. Это и есть апач. Она говорит: "Что надо?"
Браузер говорит: "да мне сказали, что у вас в папке greeting есть файл helloworld.php. Дайте мне его пожалуйста, если можно!"
Бабка Апач говорит: "ща подожди пару милисекунд, я посмотрю в кладовке". Идет в кладовку, смотрит: да, есть такой файл. Есть ли права доступа? Есть. Надо отдавать.
Так, а что такое .php? Это файл скрипта php. Значит, надо отдать его Петровичу-php, пусть сначала его разберет, и вернет мне результат.
Идет бабка Апач в соседнюю комнату, и говорит: "Петрович, слышь, тут файл посмотреть надыть".
Петрович берет очки и говорит: "Так, тэг <!DOCTYPE html> это не мое, держи строку. <html> не мое, забирай, <head> и тайтл..." Бабка хватает и не глядя бросает в окно. Под окном стоит браузер и ловит в корзину.
Петрович берет следующую строку "<?php echo 'hello world! 2 + 2 = '. (2+2); ?> О! Это код какой-то программы. Ща я его переведу в машинный код, отдам процессору, тот посчитает и вернет результат". Петрович перевел это дело как 011101001001010111 и отдал процессору. Процессор вернул строку 'hello world! 2+2 = 4', php-петрович отдал его бабке апачу, та швырнула в окно, где браузер на лету подхватывает и потихоньку отрисовывает в памяти веб-страницу.
И так до конца файла. html отдается как есть, php просчитывается.
Когда файл полностью отдан браузеру, соединение закрывается, и браузер показывает страницу юзеру.
mysql - это система управления базами данных. Включает сервер, клиент (консольку), еще несколько полезных фиговин.
Клиентом на сей раз является php.
У тебя в php-программе стоит код
$dbh = new PDO();
$sql = "SELECT x FROM table_name LIMIT 10 DESC";
$sth = $dbh->prepare($sql);
$sth->execute();
$result = $sth->fetchAll();
Что здесь написано? Когда ты создаешь объект соединения с базой данных, php-программа соединяется с базой данных.
Дальше, метод execute исполняет sql-команду. Как исполняет? Сам php не работает с базой, он отдает эту строку серверу mysql, который выполняет ее (если может) и возвращает результат (или ошибку).
Сборки типа вамп, замп, ламп не рекомендуется использовать. Во-первых, ты должен сам уметь поставить весь необходимый софт, во-вторых они идут с какими-то неизвестными преднастройками, что может потом вызвать проблемы. Денвер например как я слышал везде проставляет кодировку cp-1251, nuf said. Заебешься потом кракозябры вычищать.
Зачем тебе "пхпдесигнер7"? Это среда разработки для опытных программистов, которым необходимы сложные инструменты для работы. Ты наверняка никогда не слышал слов "дебаггинг" и "рефакторинг". Тебе с головой хватит простых редакторов типа notepad++ или sublime text.
И если устанавливать мощную ide, то большинство пользуется phpStorm или netBeans.
О "пхпдесигнер7" ничего не могу сказать, не пользовался. Но выглядит как говно, судя по скринам.
Грубо говоря да.
А зачем ты скачиваешь, не понимая, что это такое?
Вампсервер, как и другие сборки - это набор программ, включающий в себя php, apache и mysql.
Php - это программа-интерпретатор, которая переводит человекопонятный текст программы типа echo 'hello world' в машинный код.
Процессор твоего компьютера не знает, что такое echo 'hello' и phpinfo(). Он понимает только последовательность нулей и единичек.
Php-интерпретатор занимается переводом текста, написанного на php, в машинный язык.
Apache - это веб-сервер. Веб-сервер занимается тем, что принимает запросы от клиентов (браузеров в частности), и если запрос корректный, отдает в качестве ответа текст запрашиваемой веб-страницы. Я утрирую для лучшего понимания.
То есть когда ты вбиваешь в браузере http://www.site.ru/greeting/helloworld.php, браузер сначала обращается к dns-серверу с вопросом: "Дорогой сервер! Мне тут юзер вбил вот такой адрес www.site.ru. Покопайся в своей базе и найди айпи-адрес комьютера, на котором хранится соответствующий сайт, если он вообще существует". Днс-сервер отвечает: "Да, есть такой сайт. Тебе нужно обратиться по айпи 127.0.0.1, чтобы получить эту веб-страницу". Браузер говорит "спс))" и идет по адресу 127.0.0.1
Представим, что это номера домов. Находит значит наш браузер дом с этим адресом, стучится в дверь. Открывается окошко, высовывается бабка-вахтерша. Это и есть апач. Она говорит: "Что надо?"
Браузер говорит: "да мне сказали, что у вас в папке greeting есть файл helloworld.php. Дайте мне его пожалуйста, если можно!"
Бабка Апач говорит: "ща подожди пару милисекунд, я посмотрю в кладовке". Идет в кладовку, смотрит: да, есть такой файл. Есть ли права доступа? Есть. Надо отдавать.
Так, а что такое .php? Это файл скрипта php. Значит, надо отдать его Петровичу-php, пусть сначала его разберет, и вернет мне результат.
Идет бабка Апач в соседнюю комнату, и говорит: "Петрович, слышь, тут файл посмотреть надыть".
Петрович берет очки и говорит: "Так, тэг <!DOCTYPE html> это не мое, держи строку. <html> не мое, забирай, <head> и тайтл..." Бабка хватает и не глядя бросает в окно. Под окном стоит браузер и ловит в корзину.
Петрович берет следующую строку "<?php echo 'hello world! 2 + 2 = '. (2+2); ?> О! Это код какой-то программы. Ща я его переведу в машинный код, отдам процессору, тот посчитает и вернет результат". Петрович перевел это дело как 011101001001010111 и отдал процессору. Процессор вернул строку 'hello world! 2+2 = 4', php-петрович отдал его бабке апачу, та швырнула в окно, где браузер на лету подхватывает и потихоньку отрисовывает в памяти веб-страницу.
И так до конца файла. html отдается как есть, php просчитывается.
Когда файл полностью отдан браузеру, соединение закрывается, и браузер показывает страницу юзеру.
mysql - это система управления базами данных. Включает сервер, клиент (консольку), еще несколько полезных фиговин.
Клиентом на сей раз является php.
У тебя в php-программе стоит код
$dbh = new PDO();
$sql = "SELECT x FROM table_name LIMIT 10 DESC";
$sth = $dbh->prepare($sql);
$sth->execute();
$result = $sth->fetchAll();
Что здесь написано? Когда ты создаешь объект соединения с базой данных, php-программа соединяется с базой данных.
Дальше, метод execute исполняет sql-команду. Как исполняет? Сам php не работает с базой, он отдает эту строку серверу mysql, который выполняет ее (если может) и возвращает результат (или ошибку).
Сборки типа вамп, замп, ламп не рекомендуется использовать. Во-первых, ты должен сам уметь поставить весь необходимый софт, во-вторых они идут с какими-то неизвестными преднастройками, что может потом вызвать проблемы. Денвер например как я слышал везде проставляет кодировку cp-1251, nuf said. Заебешься потом кракозябры вычищать.
Зачем тебе "пхпдесигнер7"? Это среда разработки для опытных программистов, которым необходимы сложные инструменты для работы. Ты наверняка никогда не слышал слов "дебаггинг" и "рефакторинг". Тебе с головой хватит простых редакторов типа notepad++ или sublime text.
И если устанавливать мощную ide, то большинство пользуется phpStorm или netBeans.
О "пхпдесигнер7" ничего не могу сказать, не пользовался. Но выглядит как говно, судя по скринам.
так а как правильно сделать?
Нубь выходит на связь.
В общем есть такой код по задаче на составление стихов
http://ideone.com/DSOsSZ
Почему не срабатывают операции конкатенации и в результате я получаю три раздельных строчки?
Т.е. строчки где, первая это вырандомленые слова, вторая это пробелы, а третье это одинокое "Я".
>>497443
Задача 14. В JS как то всё с типами переменных запутанно. Конкретно стал вязнуть и усложнять код в этой задаче, пришлось заглянул немного в библиотеку lodash.
https://github.com/tokotun/JS/blob/master/lesson_14.html
https://github.com/tokotun/JS/blob/master/lesson_14.js
Принт не помог, результат был тот же. Убрал вообще функцию, вроде работает, да вот только бывает отчего то пропадают слова на рандоме. С чем это может быть связано?
>>497699
Я не понял твой вопрос, но у тебя там минимум две ошибки.
Во-первых, в качестве верхнего предела случайного числа ты берешь длину массива. Нужно брать (длина - 1), потому что элементы в массиве нумеруются с нуля.
Например у тебя есть массив $array = ['a', 'b', 'c']. Его длина count($array) равняется 3. Но элемента с индексом 3 нет. 'a' идет под номером 0, 'b' имеет индекс 1, а 'c' - индекс 2. Нумерация не с единицы, а с нуля.
Индекс последнего элемента не count($array), а длина минус единица, то есть count($array) - 1.
Идеоне тебе об этом говорит в блоке ошибок: PHP Notice: Undefined offset: 4 in /home/CDyLgy/prog.php on line 16
Undefined offset 4 - ты обращаешься к элементу номер 4, но такого не существует.
И функция randomim (что за странное имя? давай осмысленные имена) уже выводит какой-то текст,
у тебя внутри функции стоит echo $a[$random], а потом вне функции ты еще раз выводишь данные. Выводи их уже в одном месте.
Вместо echo внутри функции напиши return. Это значит, что после того как функция отработает, она вернет некое значение.
Пиши return $a[$random].
Этот >>497709 либо не компетентен, либо тролит.
Ларавель все называют дико прогрессивным и клевым фреймворком, почему тогда все рекомендуют начинать с зенда2(мне дико не понравился в свое время и даже не стал в него вникать) или Yii? Может я что-то упустил? А вообще, всем добра, ОПу особенно. Хорошие треды. Полезные.
Доправил вариант с функцией, действительно надо было через return делать. Добра тебе анон!
Умею немножко php, но хочется больше. Пробовал сделать что-нибудь большое, но в одиночку дюже скучно. Где найти команду, которая делает интересный сервис/игру, чтоб присоединиться и получать опыт в процессе разработки?
>Ларавель все называют дико прогрессивным и клевым
Это можно назвать синдромом восторженного неофита, что-то противоположное синдрому утенка.
Не делал. И даже если начну делать, не доделаю, если буду делать один. По этому ищу команду.
Ну хз, сходи в соц, хикканы обычно там ищут пати.
Тред знакомств правда оккупирован озабоченными уродцами, которые мечтают присунуть шлюховатой девственнице-фотомодели.
Но раз у тебя серьезное дело, то может кто и отзовется.
А по сути есть что сказать? Клишированые фразочки это, конечно, здорово, но хотелось бы конкретики от тех кто разбирается во фреймворках, смехуечков я в /b почитаю.
В Нотепадет как с этим? Если нажимать на файрфокс то просто пустая страница.
Есть ВАМП, надо с ним как то настроить или что?
Оп жду твоих замечаний и наставлений.
Вамп нужно запустить для начала. Двойной щелчок по значку на рабочем столе. В трее возле часов должен появиться зеленый значок.
Сохранять файлы нужно в корневую директорию сервера.
У тебя наверное это что-то типа c:\wamp\www\
Файлы нужно сохранять либо в эту папку, либо создавать в ней другие папки, например
c:\wamp\www\example.com
Тогда ты сможешь обратиться к своему файлу в браузере так:
localhost/helloworld.php
localhost/example.com/helloworld.php
>при Запуске он кидает меня на пустую страницу браузера
Кто он? При каком запуске? В notepad++ из меню действительно можно открывать файлы в браузере, но это работает только с html, не с php-скриптами.
Потому что так ты открываешь страницу как файл. Обрати внимание, что в адресной строке браузера будет стоять file:///путь_к_файлу/название_файла
Чтобы php-скрипт отработал, его нужно запускать через сервер.
То есть пиши руками в адресной строке браузера localhost/путь_к_файлу.
Еще раз повторю, файлы должны лежать в c:\wamp\www либо во вложенных директориях.
Я поместил в www и через браузер со ссылкой на этот файл.
Мне выдает вот что.
А при работе через пхпдесигнер мне выдает третий пик с
<?php
error_reporting(-1);
echo "Бросаем кубик.....\n"; echo mt_rand(0, 6);
echo "выпало $random\n";
Хотя он работает на ideone.
Так же пхпдесигнер я могу там работать со всякими переменными, но с такой хуйней вроде скрипта что ли, выдает ошибки.
1. Кормим скрипту ссылку на какую-нибудь страницу. (назовем её сайтом 1 уровня).
2. скрипт с помощью http://simplehtmldom.sourceforge.net/manual_faq.htm обходит страницу и собирает с неё все ссылки на другие сайты (сайты 2 уровня).
3. Получаю массив ссылок на сайты.
4. Далее обхожу эти что бы собрать с них все ссылки. (на сайты 3 уровня).
Затуп собственно в чем. Если на этапе сбора ссылок(2 уровня) в мой массив попала битая ссылка, или ссылка на уже не отвечающий сервак, то скрипт выдает ошибку при обходе массива и попытке собрать контент с сайтов 2 уровня. И всё. Никакого результата я не получаю. Если на сайте вменяемое число ссылок, то вероятность того, что скрипт грохается возрастает до небес. Мне нужно что бы при обходе массива сыылок 2 уровня, при невозможности подключиться к серверу скрипт просто пропускал текущую итерацию цикла без всяких эроров и остановок и двигался дальше, как это можно реализовать удачно и просто??
Спасибо за внимание.
Исключения использовать?
У тебя файл называется new(пробел)1.php, а в браузере ты пишешь new1.php
Папка у тебя называется Notepad с большой буквы, а в браузере ты пишешь notepad с маленькой.
Переименуй new 1.php в new_1.php, а Notepad в notepad.
На третьем скрине у тебя написано, в чем ошибка. Английский знаешь?
Call to undefined function eroor_reporting - вызов неизвестной функции eroor_reporting.
Ты опечатался в файле smotrl.php на третьей строке, нужно не eroor_reporting, а error_reporting.
C нотепадом все сработало как убрал рандом.
Вот пик.
А вот с пхп десигнером никак не разберусь.
Цифру выдает, но иероиглифы какие то вместо букв.
Он в качестве иде использует какой-то phpdesigner, вопрос был как сменить кодировку там.
Посоны, проверьте про гамбургеры задание. И еще скажите как реализовать функцию bind. Я не втыкаю что-то.
Сделай себе добро - поставь ПохапеШторм. Качай с офсайта, юзай ключ с русракера(у меня подошел идеально). Все что нужно в нем есть, программа годная. Базарю, еще захочешь. А то паришь себе мозги в какой-то параше.
Все. Удобный интерфейс, встроенный терминал, среда для работы с бд, рефакторинг, куча настроек для удобного кодинга, работа с контролем версий, дебагер. Короче не выя..йся. Имхо, лучшая идешка для похапе.
https://github.com/V3N0m21/StudentList
Есть пара вопросов
spl_autoload_register(function ($class) {
\t#$file = $path."/".$class.".php";
\t#if (file_exists($file)) {
\trequire $class . '.php';
\t#echo $file.'<br>';
\t#echo "/var/www/StudentList/" . $class. '.php'."<br>";
\t#}
https://github.com/V3N0m21/StudentList/blob/master/lib/init.php#L3
Вот это у меня не работает вообще никак, он почему-то не находит файл класса, хоть я указывал полный путь, хоть через __DIR__, да и вообще мне кажется он должен находится без указания пути, потому что файлы находятся в одной папке.
И еще вопрос по
>У тебя в SQL collate не прописан (как и кодировка что плохо) и потому видимо применяются какие-то настройки по умолчанию которые у меня задают поиск с чувствительностью к регистру.
Я так и не смог добиться чтоб collate кидался в дамп, поэтому прописал его в дампе руками.
Нубь снова на связи.
Вот есть такой код для решения задачи про кредиты из трех банков.
http://ideone.com/nH1A4T
На 25 строчке я пытаюсь записать конечный результат в массив созданный ранее, перед функцией на 3 строчке, чтобы в конце вывести предположительно наиболее выгодный банк. Но по не совсем понятным мне причинам данные в массив не заносятся.
Подскажите добро аноны где я накосячил?
Форматируй код как следует, это же читать невозможно.
Например, если у тебя есть функция, то строки внутри нее нужно сносить вправо на четыре пробела. То же самое касается циклов и условных конструкций.
http://www.php-fig.org/psr/psr-2/ru/
> Теперь передаю в конструктор 2 переменные вместо обьекта. На фабрике сделал такое условие.
Можно было проще сделать, просто сделать фабрику такого вида:
> function addElement(obj, functionConstructor) {
И все что идет после 2-го аргумента передавать в конструктор. То есть использовать так:
addElements(grid, PowerLine, 10, 20);
> if (arr instanceof Object) {
Вот это плохой тест, так как в JS почти все это объекты, а все объекты имеют в цепочке прототипов Object в конце:
[] instanceof Object; //true
(function () {}) instanceof Object; // true
Ну с этим ты я думаю познакомишься на задаче где надо определить тип переменной.
> Это предупреждение игнорировать?
Да, но я бы советовал посмотреть, нет ли для твоего редактора/IDE плагина jslint и начать его использовать. Он помогает обнаруживать опечатки, ошибки и потому полезен. На существующих проектах его не всегда получится использовать (может сильно ругаться), а на тех которые ты делаешь с нуля, пригодится. Также, его можно настраивать файлом .jshintrc в корне проекта.
> Этот код читаем?
Вполне, хотя для 2 вариантов наверно проще было использовать true/false (а для большего количества — константы).
В общем, думаю, задача решена.
XML довольно важная тема, так как это очень распространенный формат.
> пару слов об xml
XML это формат для обмена данными (например интернет-магазин через XML может передавать данные о товарах и ценах в яндекс-маркет) и хранения данных (например конфиг с настройками программы может использовать формат XML). XML поход на HTML внешне, но в общем это отдельный не связанный с ним язык, отличия такие:
1) элементы и атрибуты XML не имеют никакого преопределенного смысла, ты сам решаешь что обозначает тот или иной тег
2) HTML используется для разметки веб-страниц (то есть тегами мы показываем что тут ссылка, тут заголовок, тут картинка), XML для произвольных данных
3) В XML все теги должны закрываться, есть самозакрывающиеся теги ( <x/> ), регистр букв в именах важен
4) В XML есть неймспейсы
Можно ли обойтись без XML? Можно изобрести свой формат, но вот что ты теряешь: другие разработчики не слышали про твой формат, а про XML слышали, для XML есть готовые парсеры/генераторы для многих языков, валидаторы, редакторы с подсветкой и автодополнением, визуализаторы, схемы. То есть для XML существует огромная инфраструктура для работы с ним и изобретать в таких условиях велосипед будет только неграмотный разработчик.
Благодаря популярности и инфраструктуре XML используется в перевую очередь в различных API для обмена данными между системами.
Неймспейсы нужны для того чтобы можно было объединить несколько документов в одном. Допустим 2 разработчика используют XML для описания товаров. Вася тегом <total> обозначает число товаров на складе, а Петя — цену товара. Если мы соединим вместе документы в Петином и Васином формате, получится неразбериха:
<data>
<total>6</total>
<total>300</total>
</data>
Неймспейсы решают эту проблему. Петя помещает все свои элементы в неймспейс http://petr.example.com/product, а Вася в http://vasya.example.com/goods и теги больше не путаются:
<data xmlns:vasya="http://vasya.example.com/goods" xmlns:petr="http://petr.example.com/product">
<vasya:total>6</vasya:total>
<petr:total>300</petr:total>
</data>
Ну разве не умно? Если каждый будет использовать для неймспейса свой домен то они гарантированно будут уникальными (хотя это не обязательно, это просто традиция). Некоторые по ссылке размещают схему документа, но это не обязательно (ссылка вообще не обязана быть рабочей). Неймспейсы могут применяться как к элементам так и к аттрибутам. Их можно не использовать, если тебе не нужен этот функционал. Почитать: http://gberman.narod.ru/xmllections/ns/namespace.htm
Схемы XML. Схема — это машинночитаемое описание формата. Помнишь, я написал, что в XML смысл и правила использования тегов и атрибутов ты задаешь сам? Схема позволяет тебе описать эти правила, описать какие теги можно использовать, какие у них атрибуты, какие значения, как их можно вкладывать. Схема может использоваться для автоматической проверки данных на правильность, а также как документация (которую прочтет человек и поймет что к чему). То есть если какая-то система принимает данные в XML, разработчики обычно выкладывают схему с описанием данных.
Пример DTD для файлов принимаемых яндекс-маркетом: http://partner.market.yandex.ru/pages/help/shops.dtd
Пример схем какого-то росреестра: https://rosreestr.ru/site/fiz/postavit-nedvizhimost-na-kadastrovyy-uchet-/xml-skhemy/
Для схемы есть несколько альтернативных форматов (учить их наизусть не надо, просто глянь примеры):
DTD Schema: https://ru.wikipedia.org/wiki/DTD
XML Schema (XSD): https://ru.wikipedia.org/wiki/XML_Schema http://citforum.ru/internet/xml/scheme/
Relax-NG: https://ru.wikipedia.org/wiki/RELAX_NG
Схемы, как ты надеюсь уже понял, тоже огромный плюс XML. Имея схему ты можешь легко проверить соответствует твой XML требованиям системы или нет. Есть визуальные редкаторы для таких схем.
Еще есть такая интересная технология, как XSLT. Это язык преобразования XML-документа в другой XML- или HTML-документ. Правила преобразования также описываются в формате XML.
Также, есть такая вещь как XPath. Это язык запросов для поиска элементов в документе.
Для работы с XML в PHP есть расширения: DOM, SimpleXML (надстройка над DOM, с ограничениями), и потоковые XML Reader и XML Writer. DOM строит полную структуру документа в памяти и годится для небольших файлов (до десятка мегабайт). Потоковые библиотеки позволяют работать с гигантскими файлами (например картографическими файлами проекта Open Street Map, который создает открытую карту мира: https://www.openstreetmap.org/relation/2555133 . Файл с Россией весит там 2.5Гб в сжатом виде).
Задачки
1) Пользователь вводит адрес в одной из столиц (Москва или Спб — выбери сам), скрипт определяет район города и ближайшее метро.
Делается это с помощью геокодера Яндекса: http://api.yandex.ru/maps/doc/geocoder/desc/concepts/input_params.xml
Пример запроса: http://geocode-maps.yandex.ru/1.x/?geocode=Москва,+Тверская+улица,+дом+7
Первым запросом ты определяешь координаты по адресу (и существует ли адрес). Вторым обратным запросом, определяешь район и метро по координатам. Для запросов используется формат XML, так что использовать придется DOM или SimpleXML (и наверно XPath для поиска узлов). Для отправки запросов тебе нужен HTTP клиент, в минимальном варианте достаточно file_get_contents или curl (но лучше конечно использовать нормальный клиент вроде Guzzle). На бесплатном хостинге запросы наружу отправлять нельзя, так что наверно лучше запускать скрипт из командной строки или на своем компьютере.
Не пиши скрипт простыней, разбивай на маленькие функции.
2) Дана HTML-страница: http://spb.hh.ru/applicant/searchvacancyresult.xml?areaId=231¬WithoutSalary=&orderBy=0&text=xml&professionalAreaId=0&desireableCompensation=&compensationCurrencyCode=RUR
Надо загрузить ее HTML-код в DOM ( http://php.net/manual/en/domdocument.loadhtml.php ), распарсить ее, например, с помощью Xpath, и получить массив объектов JobOffer с полями: title (название вакансии), minSalary, maxSalary (0, если не указана), company (название компании), address, publishDate (дата публикации в вие объекта DateTime).
То есть HTML волшебным образом превращается в массив объектов, с которыми можно нормально работать, например, вывести список с помощью echo.
Не нравится парсить вакансии? Парсь торренты:
www.nyaa.eu/?page=search&cats=0_0&filter=0&term=watamote , надо создать массив объектов TorrentFile с полями category (одна из констант), title, torrentUrl (ссылка скачивания торрент-файла), size (числом), seeders, leechers, downloadCount
Честно предупрежу, HTML на сайте hh.ru адский и торренты вроде проще. Ну и для скрейпинга страниц удобнее использовать имитирующие jQuery библиотеки вроде phpQuery или Simple DOM HTML, но для изучения XML лучше будет использовать именно DOM и XPath.
Навыки полученные при решении задач наверняка тебе пригодятся в будущем при работе с XML.
....
XML довольно важная тема, так как это очень распространенный формат.
> пару слов об xml
XML это формат для обмена данными (например интернет-магазин через XML может передавать данные о товарах и ценах в яндекс-маркет) и хранения данных (например конфиг с настройками программы может использовать формат XML). XML поход на HTML внешне, но в общем это отдельный не связанный с ним язык, отличия такие:
1) элементы и атрибуты XML не имеют никакого преопределенного смысла, ты сам решаешь что обозначает тот или иной тег
2) HTML используется для разметки веб-страниц (то есть тегами мы показываем что тут ссылка, тут заголовок, тут картинка), XML для произвольных данных
3) В XML все теги должны закрываться, есть самозакрывающиеся теги ( <x/> ), регистр букв в именах важен
4) В XML есть неймспейсы
Можно ли обойтись без XML? Можно изобрести свой формат, но вот что ты теряешь: другие разработчики не слышали про твой формат, а про XML слышали, для XML есть готовые парсеры/генераторы для многих языков, валидаторы, редакторы с подсветкой и автодополнением, визуализаторы, схемы. То есть для XML существует огромная инфраструктура для работы с ним и изобретать в таких условиях велосипед будет только неграмотный разработчик.
Благодаря популярности и инфраструктуре XML используется в перевую очередь в различных API для обмена данными между системами.
Неймспейсы нужны для того чтобы можно было объединить несколько документов в одном. Допустим 2 разработчика используют XML для описания товаров. Вася тегом <total> обозначает число товаров на складе, а Петя — цену товара. Если мы соединим вместе документы в Петином и Васином формате, получится неразбериха:
<data>
<total>6</total>
<total>300</total>
</data>
Неймспейсы решают эту проблему. Петя помещает все свои элементы в неймспейс http://petr.example.com/product, а Вася в http://vasya.example.com/goods и теги больше не путаются:
<data xmlns:vasya="http://vasya.example.com/goods" xmlns:petr="http://petr.example.com/product">
<vasya:total>6</vasya:total>
<petr:total>300</petr:total>
</data>
Ну разве не умно? Если каждый будет использовать для неймспейса свой домен то они гарантированно будут уникальными (хотя это не обязательно, это просто традиция). Некоторые по ссылке размещают схему документа, но это не обязательно (ссылка вообще не обязана быть рабочей). Неймспейсы могут применяться как к элементам так и к аттрибутам. Их можно не использовать, если тебе не нужен этот функционал. Почитать: http://gberman.narod.ru/xmllections/ns/namespace.htm
Схемы XML. Схема — это машинночитаемое описание формата. Помнишь, я написал, что в XML смысл и правила использования тегов и атрибутов ты задаешь сам? Схема позволяет тебе описать эти правила, описать какие теги можно использовать, какие у них атрибуты, какие значения, как их можно вкладывать. Схема может использоваться для автоматической проверки данных на правильность, а также как документация (которую прочтет человек и поймет что к чему). То есть если какая-то система принимает данные в XML, разработчики обычно выкладывают схему с описанием данных.
Пример DTD для файлов принимаемых яндекс-маркетом: http://partner.market.yandex.ru/pages/help/shops.dtd
Пример схем какого-то росреестра: https://rosreestr.ru/site/fiz/postavit-nedvizhimost-na-kadastrovyy-uchet-/xml-skhemy/
Для схемы есть несколько альтернативных форматов (учить их наизусть не надо, просто глянь примеры):
DTD Schema: https://ru.wikipedia.org/wiki/DTD
XML Schema (XSD): https://ru.wikipedia.org/wiki/XML_Schema http://citforum.ru/internet/xml/scheme/
Relax-NG: https://ru.wikipedia.org/wiki/RELAX_NG
Схемы, как ты надеюсь уже понял, тоже огромный плюс XML. Имея схему ты можешь легко проверить соответствует твой XML требованиям системы или нет. Есть визуальные редкаторы для таких схем.
Еще есть такая интересная технология, как XSLT. Это язык преобразования XML-документа в другой XML- или HTML-документ. Правила преобразования также описываются в формате XML.
Также, есть такая вещь как XPath. Это язык запросов для поиска элементов в документе.
Для работы с XML в PHP есть расширения: DOM, SimpleXML (надстройка над DOM, с ограничениями), и потоковые XML Reader и XML Writer. DOM строит полную структуру документа в памяти и годится для небольших файлов (до десятка мегабайт). Потоковые библиотеки позволяют работать с гигантскими файлами (например картографическими файлами проекта Open Street Map, который создает открытую карту мира: https://www.openstreetmap.org/relation/2555133 . Файл с Россией весит там 2.5Гб в сжатом виде).
Задачки
1) Пользователь вводит адрес в одной из столиц (Москва или Спб — выбери сам), скрипт определяет район города и ближайшее метро.
Делается это с помощью геокодера Яндекса: http://api.yandex.ru/maps/doc/geocoder/desc/concepts/input_params.xml
Пример запроса: http://geocode-maps.yandex.ru/1.x/?geocode=Москва,+Тверская+улица,+дом+7
Первым запросом ты определяешь координаты по адресу (и существует ли адрес). Вторым обратным запросом, определяешь район и метро по координатам. Для запросов используется формат XML, так что использовать придется DOM или SimpleXML (и наверно XPath для поиска узлов). Для отправки запросов тебе нужен HTTP клиент, в минимальном варианте достаточно file_get_contents или curl (но лучше конечно использовать нормальный клиент вроде Guzzle). На бесплатном хостинге запросы наружу отправлять нельзя, так что наверно лучше запускать скрипт из командной строки или на своем компьютере.
Не пиши скрипт простыней, разбивай на маленькие функции.
2) Дана HTML-страница: http://spb.hh.ru/applicant/searchvacancyresult.xml?areaId=231¬WithoutSalary=&orderBy=0&text=xml&professionalAreaId=0&desireableCompensation=&compensationCurrencyCode=RUR
Надо загрузить ее HTML-код в DOM ( http://php.net/manual/en/domdocument.loadhtml.php ), распарсить ее, например, с помощью Xpath, и получить массив объектов JobOffer с полями: title (название вакансии), minSalary, maxSalary (0, если не указана), company (название компании), address, publishDate (дата публикации в вие объекта DateTime).
То есть HTML волшебным образом превращается в массив объектов, с которыми можно нормально работать, например, вывести список с помощью echo.
Не нравится парсить вакансии? Парсь торренты:
www.nyaa.eu/?page=search&cats=0_0&filter=0&term=watamote , надо создать массив объектов TorrentFile с полями category (одна из констант), title, torrentUrl (ссылка скачивания торрент-файла), size (числом), seeders, leechers, downloadCount
Честно предупрежу, HTML на сайте hh.ru адский и торренты вроде проще. Ну и для скрейпинга страниц удобнее использовать имитирующие jQuery библиотеки вроде phpQuery или Simple DOM HTML, но для изучения XML лучше будет использовать именно DOM и XPath.
Навыки полученные при решении задач наверняка тебе пригодятся в будущем при работе с XML.
....
Теперь исправим ошибки в твоем посте:
> Изложу здесь конспект
Лучше излагать своими словами, потому что фразы вроде «Это назначение определенного логического или семантического смысла участкам данных.» читаются тяжело и непонятно, понимаешь ты их или просто скопировал. Пиши лучше от себя.
> В случае с html как разновидностью языка разметки, чтобы выделить определенным форматированием
Так было в первых версиях HTML, сейчас внешний вид задается в CSS, а разметка определяет назначение того или иного элемента: картинка, ссылка, абзац, заголовок, цитата.
> Хотя это описание элемента можно и переопределить через css-стили, все же принято этого не делать, поскольку теряется семантика.
Ее там и не было, так как <b> задавал только внешний вид, а не смысл элемента. Сейчас теги задают назначение элемента, а CSS его внешний вид. Тег <b> для жирного шрифта сейчас считается устаревшим и обозначает другую вещь.
> Они ссылаются на DTD от w3.org <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">, которого вроде бы достаточно для большинства случаев.
xmlns:xs — это не ссылка на DTD, а неймспейс. Неймспейсы принято делать в виде ссылок (это не обязательно, но ссылка позволяет гарантировать уникальность). В данном случае это обозначение значит что элементы с префиксом xs: это элементы из XML Schema.
Ссылка на DTD Schema (которой соответствует документ) пишется в нем так:
<!DOCTYPE people_list SYSTEM "http://example.com/example.dtd">
Ссылка на XML Schema или Relax NG в документе не пишется, но некоторые размещают схему по ссылке в корневом неймспейсе, вот по такой: <document xmlns="http://....">. Это не обязательно, так как идентификатор неймспейса не обязан быть рабочей ссылкой вообще.
> Если нам понадобится намутить что-то свое, в принципе можно кроме этой схемы w3.org подключить и свой DTD в случае необходимости.
XML Schema и DTD Schema это альтернативные способы описать формат XML. Ты можешь для своего формата сделать описание любым из этих (или обоими) способами.
> Применяется XML в случае, когда нужно передать большой фрагмент данных
Когда надо передать данные между разными системами или сохранить в файле. Объем данных не важен.
> но базу книг брать неоткуда, да и не хочется ее содержать на своем сервере.
Лучше все равно иметь свою базу, а не зависет от других.
> Я подозреваю, что большинство интернет-магазинов бытовой техники, электроники, чего угодно, имеют общую базу, из которой получают данные именно в виде xml.
Нет, традиционные SQL базы данных гораздо удобнее для хранения. XML используется когда данными надо обмениваться так как мы можем придумать свой формат и описать в виде схемы.
Теперь исправим ошибки в твоем посте:
> Изложу здесь конспект
Лучше излагать своими словами, потому что фразы вроде «Это назначение определенного логического или семантического смысла участкам данных.» читаются тяжело и непонятно, понимаешь ты их или просто скопировал. Пиши лучше от себя.
> В случае с html как разновидностью языка разметки, чтобы выделить определенным форматированием
Так было в первых версиях HTML, сейчас внешний вид задается в CSS, а разметка определяет назначение того или иного элемента: картинка, ссылка, абзац, заголовок, цитата.
> Хотя это описание элемента можно и переопределить через css-стили, все же принято этого не делать, поскольку теряется семантика.
Ее там и не было, так как <b> задавал только внешний вид, а не смысл элемента. Сейчас теги задают назначение элемента, а CSS его внешний вид. Тег <b> для жирного шрифта сейчас считается устаревшим и обозначает другую вещь.
> Они ссылаются на DTD от w3.org <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">, которого вроде бы достаточно для большинства случаев.
xmlns:xs — это не ссылка на DTD, а неймспейс. Неймспейсы принято делать в виде ссылок (это не обязательно, но ссылка позволяет гарантировать уникальность). В данном случае это обозначение значит что элементы с префиксом xs: это элементы из XML Schema.
Ссылка на DTD Schema (которой соответствует документ) пишется в нем так:
<!DOCTYPE people_list SYSTEM "http://example.com/example.dtd">
Ссылка на XML Schema или Relax NG в документе не пишется, но некоторые размещают схему по ссылке в корневом неймспейсе, вот по такой: <document xmlns="http://....">. Это не обязательно, так как идентификатор неймспейса не обязан быть рабочей ссылкой вообще.
> Если нам понадобится намутить что-то свое, в принципе можно кроме этой схемы w3.org подключить и свой DTD в случае необходимости.
XML Schema и DTD Schema это альтернативные способы описать формат XML. Ты можешь для своего формата сделать описание любым из этих (или обоими) способами.
> Применяется XML в случае, когда нужно передать большой фрагмент данных
Когда надо передать данные между разными системами или сохранить в файле. Объем данных не важен.
> но базу книг брать неоткуда, да и не хочется ее содержать на своем сервере.
Лучше все равно иметь свою базу, а не зависет от других.
> Я подозреваю, что большинство интернет-магазинов бытовой техники, электроники, чего угодно, имеют общую базу, из которой получают данные именно в виде xml.
Нет, традиционные SQL базы данных гораздо удобнее для хранения. XML используется когда данными надо обмениваться так как мы можем придумать свой формат и описать в виде схемы.
А где актуальный SQL дамп базы данных? Я не могу без него протестировать нормально.
> $class1 = "active";
Это неудачный способ. Вот я смотрю на index.php и пытаюсь понять, что такое class1? Что за класс? Что значит номер 1? Понять это невозможно не прочитав весь код. Не надо так делать, надо чтобы с первого взгляда все было очевидно.
Я думаю, лучше сделать одну переменную под названием «текущий таб», activeTab и присваивать ей обозначение выделенного таба, напрмиер 'main' или 'edit'
Далее, что это за странный класс https://github.com/Si0n/register3/blob/master/lib/DataMapper.php ?
XXXMapper — это (как следует из названия) класс который отображает (map по английски) таблицы БД на объекты, то есть загружает и сохраняет объекты в базу. StudentMapper загружает студентов. А что загружает DataMapper? Название не годится. Также, работа с одной таблицей должна быть собрана в одном классе. С таблицей students должен работать только StudentMapper, а ты размазываешь код работы с этой таблицей по двум классам. Так быть не должно.
Я тебе советую: переименовать DataMapper например в StudentValidator (проверяльщик студентов), перенести функции работы с базой в StudentMapper, удалить addStudentAndCookie и поля private $student, private $pdo, private $cookiePassword, private $email.
Старайся придумывать хорошие названия для классов, функций, переменных, которые описывают что они делают или хранят. Тогда тому, кто читает твой код, будет проще его понять.
> if ($this->sex == 'F') {
Для случаев когда есть несколько вариантов значения (женский пол/мужской, местный/приезжий), стоит завести константы. С константами сразу ясно что значит буква и какие еще варианты есть (а если ты используешь IDE, то заработает автодополнение):
class Student
{
const GENDER_FEMALE = 'F';
...
const RESIDENCE_LOCAL = 'L';
...
if ($this->sex == Student::GENDER_FEMALE) {
....
}
> $sql = "SELECT * FROM students ORDER BY $order LIMIT $offset, 4";
Что тут делает 4? Тестировал и забыл удалить? Тут наверно должна быть передаваемая снаружи переменная.
Также, ты подставляешь прямо в запрос переменные $order и $offset. $offset можно передать через плейсхолдеры. $order так передать нельзя, потому надо сделать проверку по белому списку разрешенных значений. Иначе нельзя гарантировать что функция безопасна и что тут нет SQL инъекции.
Не вставляй переменные прямо в запрос, используй плейсхолдеры, а когда не возможно, то используй проверку по списку разрешенных значений. Нужно чтобы эта функция работала безопасно, что бы мы в нее снаружи не передавали.
Также, смотри, в этом файле есть очень длинные строки с запросами. Перенеси их чтобы они были не длиннее 80-120 символов (в редакторах можно настроить вывод линейки справа чтобы было видно в каком месте переность).
SQL запросы удобно переносить по ключевым словам:
SELECT ...
FROM ....
WHERE ...
AND ...
LIMIT ...
> SELECT COUNT ... ORDER BY GroupNumber
Сортировка не имеет смысла при подсчете числа записей, оно не зависит от сортировки.
> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/scripts/register.php
Я не вижу смысла преобразовывать объект в массив когда мы можем сразу использовать в шаблоне объект-студента. Давай удалим этот массив $stud. Объекты лучше.
> $offset = 4; //Количество результатов на страницу
Это лучше обозначить как perPage или recordsPerPage
> $page = ($p -1) × $offset;
А page переименовать в offset
> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/reg.php#L36
Ты читал мой урок про формы? https://github.com/codedokode/pasta/blob/master/forms.md
После успешной обработки POST-запроса надо сделать редирект на обычную страницу, чтобы при нажатии F5 запрос не отправлялся повторно. Можно редиректить назад на ту же форму, можно еще куда-то.
На главной странице, если зайти незарегистрированным, выдается ошибка:
> Notice: Undefined variable: headerMessage in D:\www\host1\sion3\template\main.php on line 2
На странице регистрации почему-то нет вкладок сверху.
«Пол» и «Место жительства» надо сделать горизонтально, посмотри как там в примере в документации сделана галочка:
Пол: (×) Мужской ( ) Женский
> <label for="inputPassword3"
Почитай что обозначает атрибут for у тега label и исправь это.
> aria-describedby="sizing-addon1"
Что это? Зачем?
> <input type="radio" name="sex" value="M" checked>Мужской
Надо при редактировании выделать выбранный пункт, а не всегда один и тот же
Также, я тебе советую найти время и прорешать наши HTML/CSS задачки из Оп-поста, они полезные.
Заголовки в таблице лучше наверно сделать не кнопками, а обычными ссылками, чтобы они меньше выделялись.
При повторном клике на заголовок направление сортировки должно меняться на противоположное (по возрастанию/по убыванию). Обозначать это можно стрелочкой или треугольничком.
А где актуальный SQL дамп базы данных? Я не могу без него протестировать нормально.
> $class1 = "active";
Это неудачный способ. Вот я смотрю на index.php и пытаюсь понять, что такое class1? Что за класс? Что значит номер 1? Понять это невозможно не прочитав весь код. Не надо так делать, надо чтобы с первого взгляда все было очевидно.
Я думаю, лучше сделать одну переменную под названием «текущий таб», activeTab и присваивать ей обозначение выделенного таба, напрмиер 'main' или 'edit'
Далее, что это за странный класс https://github.com/Si0n/register3/blob/master/lib/DataMapper.php ?
XXXMapper — это (как следует из названия) класс который отображает (map по английски) таблицы БД на объекты, то есть загружает и сохраняет объекты в базу. StudentMapper загружает студентов. А что загружает DataMapper? Название не годится. Также, работа с одной таблицей должна быть собрана в одном классе. С таблицей students должен работать только StudentMapper, а ты размазываешь код работы с этой таблицей по двум классам. Так быть не должно.
Я тебе советую: переименовать DataMapper например в StudentValidator (проверяльщик студентов), перенести функции работы с базой в StudentMapper, удалить addStudentAndCookie и поля private $student, private $pdo, private $cookiePassword, private $email.
Старайся придумывать хорошие названия для классов, функций, переменных, которые описывают что они делают или хранят. Тогда тому, кто читает твой код, будет проще его понять.
> if ($this->sex == 'F') {
Для случаев когда есть несколько вариантов значения (женский пол/мужской, местный/приезжий), стоит завести константы. С константами сразу ясно что значит буква и какие еще варианты есть (а если ты используешь IDE, то заработает автодополнение):
class Student
{
const GENDER_FEMALE = 'F';
...
const RESIDENCE_LOCAL = 'L';
...
if ($this->sex == Student::GENDER_FEMALE) {
....
}
> $sql = "SELECT * FROM students ORDER BY $order LIMIT $offset, 4";
Что тут делает 4? Тестировал и забыл удалить? Тут наверно должна быть передаваемая снаружи переменная.
Также, ты подставляешь прямо в запрос переменные $order и $offset. $offset можно передать через плейсхолдеры. $order так передать нельзя, потому надо сделать проверку по белому списку разрешенных значений. Иначе нельзя гарантировать что функция безопасна и что тут нет SQL инъекции.
Не вставляй переменные прямо в запрос, используй плейсхолдеры, а когда не возможно, то используй проверку по списку разрешенных значений. Нужно чтобы эта функция работала безопасно, что бы мы в нее снаружи не передавали.
Также, смотри, в этом файле есть очень длинные строки с запросами. Перенеси их чтобы они были не длиннее 80-120 символов (в редакторах можно настроить вывод линейки справа чтобы было видно в каком месте переность).
SQL запросы удобно переносить по ключевым словам:
SELECT ...
FROM ....
WHERE ...
AND ...
LIMIT ...
> SELECT COUNT ... ORDER BY GroupNumber
Сортировка не имеет смысла при подсчете числа записей, оно не зависит от сортировки.
> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/scripts/register.php
Я не вижу смысла преобразовывать объект в массив когда мы можем сразу использовать в шаблоне объект-студента. Давай удалим этот массив $stud. Объекты лучше.
> $offset = 4; //Количество результатов на страницу
Это лучше обозначить как perPage или recordsPerPage
> $page = ($p -1) × $offset;
А page переименовать в offset
> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/reg.php#L36
Ты читал мой урок про формы? https://github.com/codedokode/pasta/blob/master/forms.md
После успешной обработки POST-запроса надо сделать редирект на обычную страницу, чтобы при нажатии F5 запрос не отправлялся повторно. Можно редиректить назад на ту же форму, можно еще куда-то.
На главной странице, если зайти незарегистрированным, выдается ошибка:
> Notice: Undefined variable: headerMessage in D:\www\host1\sion3\template\main.php on line 2
На странице регистрации почему-то нет вкладок сверху.
«Пол» и «Место жительства» надо сделать горизонтально, посмотри как там в примере в документации сделана галочка:
Пол: (×) Мужской ( ) Женский
> <label for="inputPassword3"
Почитай что обозначает атрибут for у тега label и исправь это.
> aria-describedby="sizing-addon1"
Что это? Зачем?
> <input type="radio" name="sex" value="M" checked>Мужской
Надо при редактировании выделать выбранный пункт, а не всегда один и тот же
Также, я тебе советую найти время и прорешать наши HTML/CSS задачки из Оп-поста, они полезные.
Заголовки в таблице лучше наверно сделать не кнопками, а обычными ссылками, чтобы они меньше выделялись.
При повторном клике на заголовок направление сортировки должно меняться на противоположное (по возрастанию/по убыванию). Обозначать это можно стрелочкой или треугольничком.
Переменная, объявленная внутри функции - это локальная переменная. Ты не можешь без специальных ухищрений перезаписать из функции глобальную переменную.
Попробуй Запустить такой код, увидишь что получится:
$x = 0;
function foo(){
$x = 1;
}
foo();
echo $x;
Переменная $x внутри foo не имеет никакого отношения к глобальной переменной. Чтобы ее получить доступ к глобальной переменной, можно использовать замыкания:
$x = 0;
function foo() use ($x){
$x++;
}
Вот это сработает.
Но в этой простой задаче явно можно обойтись без замыканий и прочих усложнений. Подумай как.
>>497926
Гейство какое-то.
Но это хорошо, что ты вернулся. Без тебя полный пиздец.
Там вроде какой то свой язык , да?
Просто наткнулся тут на вакансию, где стажера на Ruby ищут, требований вообще практически никаких нет, говорят мол всему научат. Заинтересовало, если честно.
Не сработает, замыкания используются только в анонимных функциях.
Ага, я как-то в рубиконтору кинул резюме. Тоже писали что нужно только азы программирования знать, а дальше всему научат. На деле оказалось, что обучение платное, включает в себя кучу штрафов за невыполнение или неправильное выполнение домашних заданий, тесты каждую неделю - штраф за провал контроля и повторная неделя, которая опять оплачивается. В общем, на всю эту фигню со штрафами строго пофиг, так как был уверен, что справлюсь, но вот монет на оплату у меня не было тогда, потому дропнул их. До сих пор на мыло спамят своими рекламками и предложениями. Алсо, чем-то вся их манера общения напоминает сектантов. Я серьезно. Такие дела.
break выбрасывает только из цикла, лучше использовать return, который и выполнение функции прервет, и вернет результат.
ты можешь написать
function BankPay(){
.....
if(условие) return $paymentTotal;
}
Тогда ты получишь желаемый массив
$BankPayList[$BankName] = BankPay($BankName, .....);
Блять, хуево. Ну я наверное все же напишу им, узнаю что как. Если пургу будут гнать, то нахуй.
Вообще мельком глянул, вроде интересный язык. В первую очередь понравилась ориентированность на веб php тоже поэтому выбрал.
Конечно, попробуй. Может это у меня в городе такая контора долбанутая просто. Про сам язык я не особо в теме, у ОПа спроси.
Секрет.
В учебнике из Оп поста последняя глава про ООП.
>>495512
Не понял вопрос, что значит «записать в ссылку данные»?
>>495568
https://learn.javascript.ru/bind
https://learn.javascript.ru/objects-more
>>495668
Можешь и его изучить, но Yii2 сложнее и интереснее.
>>496298
Тут http://stackoverflow.com/a/3619540 пишут что надо создать проект и выставить ему тип «php» и другие советы есть.
> access, кто его пользует,
Те же кто и excel, то есть нормальные люди которым нужна БД без программирования.
>>496389
Тебе надо изучить базы данных, нормализацию, access, а потом браться за дело. Ну как может код улицы не соответствовать названию?
>>496605
Удалить стиль font-size. Алсо код странный, нельзя это сделать CSS анимацией?
>>496727
Это heredoc: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.heredoc
Оп жду твоих замечаний и наставлений.
да, хотя для HTML лучше Sublime или WebStorm с плагином Emmet, или Brackets (но он тормозить может).
>>496965
Какой дистрибутив? В Убунту/дебиан все ставится через apt-get install mysql php5 apache2 + плагины, в других дистрах их пакетным менеджером, под маком есть апач и php, но древний и потому их ставят через системы вроде homebrew.
>>497047
Этот способ работает только для опытных программистов. Новичок может нахвататься неправильных примеров, дурного кода, также может вырасти человек который копипастит код не понимая как он работает. Чтение документации не избежать, если хочешь стать хорошим разработчиком.
>>497124
Маленький код через ideone, JS/HTML через codepen/jsfiddle, SQL через sqlfiddle, большие проекты через гитхаб
>>497158
Миграция это код, вносящий изменения в структуру базы данных, например добавляющий колонку в таблицу (руками правят структуру базы только неквалифицированные и ищущие проблем разработчики). С помощью миграций ты можешь передать информацию об измеениях коллегам, вести историю, применять изменения на всех серверах.
В дотнете они тоже есть: http://metanit.com/sharp/mvc5/5.12.php
Роутер должен быть и в ASP, это компонент который анализирует URL запроса и решает какой контроллер/действие вызвать.
Роуты есть в дотнете: https://msdn.microsoft.com/ru-ru/library/cc668201(v=vs.100).aspx
> Я накатил одноименный плагин для пхпсторма , избавлен ли я от всех эти настроек?
Как установка плагина избавляет от необходимости изучать фреймворк? Программирование так не работает. Чтобы программировать, надо понимать что ты делаешь, каждую строчку, не получится вместо этого установить программу или плагин.
да, хотя для HTML лучше Sublime или WebStorm с плагином Emmet, или Brackets (но он тормозить может).
>>496965
Какой дистрибутив? В Убунту/дебиан все ставится через apt-get install mysql php5 apache2 + плагины, в других дистрах их пакетным менеджером, под маком есть апач и php, но древний и потому их ставят через системы вроде homebrew.
>>497047
Этот способ работает только для опытных программистов. Новичок может нахвататься неправильных примеров, дурного кода, также может вырасти человек который копипастит код не понимая как он работает. Чтение документации не избежать, если хочешь стать хорошим разработчиком.
>>497124
Маленький код через ideone, JS/HTML через codepen/jsfiddle, SQL через sqlfiddle, большие проекты через гитхаб
>>497158
Миграция это код, вносящий изменения в структуру базы данных, например добавляющий колонку в таблицу (руками правят структуру базы только неквалифицированные и ищущие проблем разработчики). С помощью миграций ты можешь передать информацию об измеениях коллегам, вести историю, применять изменения на всех серверах.
В дотнете они тоже есть: http://metanit.com/sharp/mvc5/5.12.php
Роутер должен быть и в ASP, это компонент который анализирует URL запроса и решает какой контроллер/действие вызвать.
Роуты есть в дотнете: https://msdn.microsoft.com/ru-ru/library/cc668201(v=vs.100).aspx
> Я накатил одноименный плагин для пхпсторма , избавлен ли я от всех эти настроек?
Как установка плагина избавляет от необходимости изучать фреймворк? Программирование так не работает. Чтобы программировать, надо понимать что ты делаешь, каждую строчку, не получится вместо этого установить программу или плагин.
В Линуксе все еще проще, там Апач, php и mysql ставятся через пакетный менеджер, какой именно, зависит от дистрибутива.
>>497221
Прежде чем ему разбираться с ORM ему надо понять что такое ORM. У нас и урок есть на эту тему: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
>>497223
Я думаю что не очень, главное больше пользоваться консолью и освоить bash для начала.
>>497218
Читал гайд по командной строке? Надо сначала перейти в папку в файлом или писать полный путь к нему: https://gist.github.com/codedokode/10539568
Джве недели на освоение линукса типа Бубунты\Минт. При чем работать можно с первого дня. Оче интуитивно понятные системы + по убунте, которую выбрал я, куча документации и решений вопросов(аскубунту всякие).
преинкремент $x++ возвращает старое значение $x
& описан тут
http://php.net/manual/ru/language.operators.bitwise.php
http://habrahabr.ru/post/134557/
&& тут http://php.net/manual/ru/language.operators.logical.php
>>497320
Для какой цели ты его пилишь? Чтобы научиться писать хороший код на современном PHP? Тогда тебе надо все переделать.
- расширение mysql давно устарело, переходи на PDO
- процедурная лапша устарела, изучай ООП
- почитывай phptherightway
- не полагайся на порядок в котором идут колонки таблицы, используй имена
- не смешивай HTML код и логику в одно файле, использу шаблоны
Я бы тебе советовал сделать задачу про список абитуриентов сначала, там подробные комментарии даны: https://github.com/codedokode/pasta/blob/master/student-list.md
Если же тебя интересует ответ только на твой вопрос то открой мануал по mysql_query и прочти что она возвращает.
Лучше не править default.conf а добавить свой конфиг username.conf в sites-available и там добавить новый вирутал хост.
Прописать его в /etc/hosts
Включить через a2ensite username
>>497436
Не знаю что это.
>>497441
> Часть I. Усовершенствования
пользовательскоГо интерфейса
> Глава 2.новые структурные теги и атрибуты
А ты знаешь HTML4? так как книга видимо расситана на тех кто знает.
Алсо не могу удержаться:
> Для начала, поскольку нам понадобится библиотека jQuery, мы загружаем ее непосредственно перед закрывающим тегом <body>
Почему перед закрывающим? Всю жизнь скрипты подключали в head.
Алсо не надо подключать jquery с сайта гугла (почему? никакого профита, риск уронить сайт возрастает, единственный кто выигрывает это гугл и NSA следящие за пользователями), лучше закачать ее к себе.
Лучше не править default.conf а добавить свой конфиг username.conf в sites-available и там добавить новый вирутал хост.
Прописать его в /etc/hosts
Включить через a2ensite username
>>497436
Не знаю что это.
>>497441
> Часть I. Усовершенствования
пользовательскоГо интерфейса
> Глава 2.новые структурные теги и атрибуты
А ты знаешь HTML4? так как книга видимо расситана на тех кто знает.
Алсо не могу удержаться:
> Для начала, поскольку нам понадобится библиотека jQuery, мы загружаем ее непосредственно перед закрывающим тегом <body>
Почему перед закрывающим? Всю жизнь скрипты подключали в head.
Алсо не надо подключать jquery с сайта гугла (почему? никакого профита, риск уронить сайт возрастает, единственный кто выигрывает это гугл и NSA следящие за пользователями), лучше закачать ее к себе.
>Я не вижу смысла преобразовывать объект в массив когда мы можем сразу использовать в шаблоне объект-студента. Давай удалим этот массив $stud. Объекты лучше.
Я согласен, что объект лучше, но если заходит незарегистрированный посетитель - <?=htmlProtect($student->getName() ?> будет выдавать ошибку в инпуте формы ввода данных. Вот для этого и создал $stud чтобы в этом случае там были не неизвестные переменные, а пустые строки.
>Почему перед закрывающим? Всю жизнь скрипты подключали в head.
Ну там типа скрипт будет выполняться когда html разметка загрузится. Хотя если юзать $(document).ready, то в принципе похуй.
>не надо подключать jquery с сайта гугла
Вообще-то профиты есть. Во-первых, очень многие подключают ее с сайта гугла, следовательно пользователю не придется ее перекачивать на каждом сайте. Во-вторых, серверов этих куча и канал у них шире и даже если jquery у пользователя не скачан, то скачается он намного быстрее с сайта гугла, чем с твоего сайта.
> Я пишу некий базовый класс, который реализует подключение и набор "корневых" методов:
> RemoteDB->getState()
> RemoteDB->getImport()
> RemoteDB->send()
Выглядит сомнительно. Зачем вызывать 3 метода подряд вместо одного?
> Пишу классы реализующие эти сущности, пользователей и заказов
Зачем там цепочки? Что тебе мешает упростить интерфейс? Зачем удалять только что созданного юзера?
> RemoteDB->order(111)->create();
Почему не $remoteApi->createOrder(111) ? Что должна возвращать ->order(111)?
Объясни что делают методы так как у меня ощущение что то ли я тебя не понимаю то ли ты не понимаешь ООП.
>>497544
Вамп это сборка содержащая Apache, MysqL и PHP и начинающим лучше ставить их вручную.
> пхпдесигнер редактор для пхп?
Я могу ошибаться но по моему это очень древний редактор, я о таком слышал много лет назад.
>>497558
Такие вещи надо тестировать. В моем не очень новом Хроме ползунок весь закрашен белым.
То есть да, лучше делать это через CSS, но тестировать надо более тщательно.
>>497579
Я хочу прокомментировать, по моему, не надо объяснять технические вещи через аналогии (Ip адреса через номера домов) так как все эти аналогии дырявые и неточные. Лучше просто сказать что IP это уникальный номер который свой у каждого компьютера в интернете. Если говорить кратко и простыми словами, то все понятно и без аналогий. Я считаю аналогии только запутывают.
Протокол HTTP это язык, с помощью которого браузер шлет запросы на сервер. Им можно получить страницу с сервера, скачать файл. отправить форму с данными.
> Петрович перевел это дело как 011101001001010111 и отдал процессору. Процессор вернул строку 'hello world! 2+2 = 4'
это очень неточно, так как 1) php код компилируется в машинный только при использовании JIT (например в HHVM) 2) процессор не может вернуть строку, он работает с числами и указателями.
То есть хорошо что ты пытаешься помочь, но я все же не могу оставить неточности незамеченными.
Насчет IDE, ничего плохого нет, только лучше брать современные IDE. Автокомплит, проверка кода помогают начинающему, а тем же notepad++ ты код не отформатируешь и ошибки он не покажет, и совета по улучшению не даст, и отладчика в нем нет. Я думаю, не надо избегать профессиональных инструментов.
> Я пишу некий базовый класс, который реализует подключение и набор "корневых" методов:
> RemoteDB->getState()
> RemoteDB->getImport()
> RemoteDB->send()
Выглядит сомнительно. Зачем вызывать 3 метода подряд вместо одного?
> Пишу классы реализующие эти сущности, пользователей и заказов
Зачем там цепочки? Что тебе мешает упростить интерфейс? Зачем удалять только что созданного юзера?
> RemoteDB->order(111)->create();
Почему не $remoteApi->createOrder(111) ? Что должна возвращать ->order(111)?
Объясни что делают методы так как у меня ощущение что то ли я тебя не понимаю то ли ты не понимаешь ООП.
>>497544
Вамп это сборка содержащая Apache, MysqL и PHP и начинающим лучше ставить их вручную.
> пхпдесигнер редактор для пхп?
Я могу ошибаться но по моему это очень древний редактор, я о таком слышал много лет назад.
>>497558
Такие вещи надо тестировать. В моем не очень новом Хроме ползунок весь закрашен белым.
То есть да, лучше делать это через CSS, но тестировать надо более тщательно.
>>497579
Я хочу прокомментировать, по моему, не надо объяснять технические вещи через аналогии (Ip адреса через номера домов) так как все эти аналогии дырявые и неточные. Лучше просто сказать что IP это уникальный номер который свой у каждого компьютера в интернете. Если говорить кратко и простыми словами, то все понятно и без аналогий. Я считаю аналогии только запутывают.
Протокол HTTP это язык, с помощью которого браузер шлет запросы на сервер. Им можно получить страницу с сервера, скачать файл. отправить форму с данными.
> Петрович перевел это дело как 011101001001010111 и отдал процессору. Процессор вернул строку 'hello world! 2+2 = 4'
это очень неточно, так как 1) php код компилируется в машинный только при использовании JIT (например в HHVM) 2) процессор не может вернуть строку, он работает с числами и указателями.
То есть хорошо что ты пытаешься помочь, но я все же не могу оставить неточности незамеченными.
Насчет IDE, ничего плохого нет, только лучше брать современные IDE. Автокомплит, проверка кода помогают начинающему, а тем же notepad++ ты код не отформатируешь и ошибки он не покажет, и совета по улучшению не даст, и отладчика в нем нет. Я думаю, не надо избегать профессиональных инструментов.
Для выбора случайного ключа (не значения) из массива ест еще функция array_rand.
>>497708
> var type = {}.toString.call(t).slice(8, -1);
Надо переписать понятнее и надежнее. Откуда берется 8? Это неочевидно. Как эта конструкция работает?
> && value % 1 === 0
что это делает?
> && value <= MAX_SAFE_INTEGER;
что это делает?
>>497718
> либо не компетентен, либо тролит.
Он прав, в том что echo это не функция, а конструкция языка. Хотя это мало поможет анону в понимании причин ошибок.
Как там возможно заставить генератор выдавать значение без прямого обращения .next().value?
Я простыл (все выходные проболел) и была работа еще.
> каждый даун (включая меня) дает советы новичкам.
Это скорее хорошо чем плохо.
>>497726
> почему тогда все рекомендуют начинать с зенда2(мне дико не понравился в свое время и даже не стал в него вникать) или Yii?
ZF2 и Symfony 2 это крутые фреймсорки, лучше начать с фреймворков среднего уровня, Yii2 или тот жеLavarel. Или вообще с микрофрейморков: Silex, Slim.
> Ларавель все называют дико прогрессивным и клевым фреймворком,
У меня есть серьезные подозрения что у него просто больше пиара. Ничего особенного в нем нет, просто фреймворк примерно того же уровня что и Yii2, тоже с некоторым стремлением к велосипедам и не лучшим практикам, обилие статических методов. Так что перекатывайся после него на Симфони 2.
>>497736
Если не сделал то тебе рановато может быть браться за настоящие проекты так как ты очень многого не знаешь. Если тебе не интересно делать список студентов, напиши чт тебе интересно. Хочешь пошаговую RPG запилить может быть? Конечно там бы JS пригодился но можно пока и без него.
>лучше начать с фреймворков среднего уровня, Yii2 или тот жеLavarel
Может у тебя ссылка где-нибудь есть на годный туториал для новиса по Yii2?
Он хотел сказать что те кто пишут восторженные отзывы могут не иметь особого опыта с фреймворками и потому к их мнению стоит отнестись с долей скепсиса.
Что спорить, давайте померяем.
Вакансии:
Yii 88 http://hh.ru/search/vacancy?text=yii&only_with_salary=false&area=1&enable_snippets=true&clusters=true&salary=
Lavarel 1 http://hh.ru/search/vacancy?text=lavarel&only_with_salary=false&area=1&enable_snippets=true&clusters=true&salary=
(может зависит от региона?)
Фриланс ру https://www.fl.ru/projects/
Lavarel 5 заказов
Yii 2 страницы заказов
Upwork, он же одеск:
lavarel 0 https://www.upwork.com/o/jobs/browse/?q=lavarel&nbs=1
Yii 98 https://www.upwork.com/o/jobs/browse/?q=yii&nbs=1
При том в плане пиар активности лаварель если не обгоняет Юи, то наравен с ним. То есть по моим ощущениям говорят о нем намного больше чем на нем кодят. Учитесь сравнивать объективно.
Он хотел сказать что те кто пишут восторженные отзывы могут не иметь особого опыта с фреймворками и потому к их мнению стоит отнестись с долей скепсиса.
Что спорить, давайте померяем.
Вакансии:
Yii 88 http://hh.ru/search/vacancy?text=yii&only_with_salary=false&area=1&enable_snippets=true&clusters=true&salary=
Lavarel 1 http://hh.ru/search/vacancy?text=lavarel&only_with_salary=false&area=1&enable_snippets=true&clusters=true&salary=
(может зависит от региона?)
Фриланс ру https://www.fl.ru/projects/
Lavarel 5 заказов
Yii 2 страницы заказов
Upwork, он же одеск:
lavarel 0 https://www.upwork.com/o/jobs/browse/?q=lavarel&nbs=1
Yii 98 https://www.upwork.com/o/jobs/browse/?q=yii&nbs=1
При том в плане пиар активности лаварель если не обгоняет Юи, то наравен с ним. То есть по моим ощущениям говорят о нем намного больше чем на нем кодят. Учитесь сравнивать объективно.
http://ideone.com/2bxDi9
Ох, как же мучительно вспоминается все. Такая регрессия оказывается, если не пользоваться знаниями.
Оп относится скептически к якобы популярности, а так не против чтобы его изучали, почему нет.
>>497837
А почему у тебя редактор код не подсвечивает и не раскрашивает? неудобно же наверно.
ЧТобы запускать скрипты надо настроить Апач, вот набор ответов на вопросы: https://gist.github.com/codedokode/10774100
Что такое командная строка: https://gist.github.com/codedokode/10539568
Через if
>>497865
Ты используешь в echo несуществующую переменную.
>>497872
Чтобы работала кодировка надо сохранять файл в utf-8 без BOM, и добавить либо метатег meta charset либо кодировку указать в заголовке Content-Type. В твоем случае лучше всего в начале написать
header("Content-Type: text/plain; charset=utf-8");
Этот заголовок HTTP (HTTP это язык на котром общаются браузер и Апач, а заголовки это такие штуки которые содержат информаию об ответе, но на экран не выводятся) говорит браузеру что скрипт выводят обычный текст, не HTML, в кодировке utf-8.
Код нужно выкладывать на jsfiddle.
Ты дал ссылку на страницу робота, он ничего не сохраняет. Если у тебя код сохранен в кукис, это не значит, что мы его сможем увидеть.
Функция bind описана в учебнике
https://learn.javascript.ru/bind
https://learn.javascript.ru/objects-more
Алсо там же есть готовый код но ссылку на него я не дам.
>>497915
>Вот это у меня не работает вообще никак, он почему-то не находит файл класса, хоть я указывал полный путь, хоть через __DIR__, да и вообще
Поставь var dump туда и смотри какой файл ищется, также выведи var_dump(getcwd()) чтобы знать текущий каталог.
В линуксе важен регистр букв в именах файлов.
> Я так и не смог добиться чтоб collate кидался в дамп, поэтому прописал его в дампе руками.
ну ок, может это у меня что-то не так, хотя странно.
>>497927
Форматировать можно сайтом phpformatter.com, во многих IDe есть горячие клавиши: https://gist.github.com/codedokode/8759492
Для нотепада что-то такое гуглится:
http://superuser.com/a/583890
http://softwarerecs.stackexchange.com/questions/1496/auto-indentation-plugin-for-notepad
Функция bind описана в учебнике
https://learn.javascript.ru/bind
https://learn.javascript.ru/objects-more
Алсо там же есть готовый код но ссылку на него я не дам.
>>497915
>Вот это у меня не работает вообще никак, он почему-то не находит файл класса, хоть я указывал полный путь, хоть через __DIR__, да и вообще
Поставь var dump туда и смотри какой файл ищется, также выведи var_dump(getcwd()) чтобы знать текущий каталог.
В линуксе важен регистр букв в именах файлов.
> Я так и не смог добиться чтоб collate кидался в дамп, поэтому прописал его в дампе руками.
ну ок, может это у меня что-то не так, хотя странно.
>>497927
Форматировать можно сайтом phpformatter.com, во многих IDe есть горячие клавиши: https://gist.github.com/codedokode/8759492
Для нотепада что-то такое гуглится:
http://superuser.com/a/583890
http://softwarerecs.stackexchange.com/questions/1496/auto-indentation-plugin-for-notepad
https://jsfiddle.net/m4dfoeqz/6/ ссылка на фиддл.
Просто главния проблемма там была не в том, что код не работает, а в одной конкретной вещи.
>Через if
ну я вот до такой конструкции дошел: пик 1.
вроде бы цикл не ломает, выглядит конечно как кусок говна с повторяющимися действиями. Сейчас буду всё это править
>>497875
>Как это сделать в пхпдесигнере, спроси в гугле.
Вот, пожалуйста: пик2, все просто там.
>Мы тут такой хуйней не пользуемся.
Я пользуюсь :(
Неплохая, но сложнее PHP и менее востребованная рынком в России. Алсо мне больше Питон нравится, там синтаксис проще и строже (и он еще менее востребован рынком).
>>498006
Для незарегистрированного посетителя можно создать пустой объект с значениями по умолчанию.
>>498007
> Ну там типа скрипт будет выполняться когда html разметка загрузится
Какая от этого выгода? Поучается какое-то время все JS кнопки не будут нажиматься?
> Хотя если юзать $(document).ready
Я негативно в общем к этому отношусь, это подавалось как способ отделить JS от HTML и сделать яваскрипт ненавязчивым, но на практике если сайт больше нескольких страниц, то это загромождает код и делает его менее понятным.
<button onclick="doSmth()" по моему намного очевиднее чем написанный где-то в другом файле код, особенно когда у тебя на сайте десятки страниц и тысячи строк кода.
> Во-первых, очень многие подключают ее с сайта гугла,
Только не все одну и ту же версию. Алсо сейчаскаждый второй сайт ставит кеширующие заголовки и кеш постоянно вытесняется.
> Во-вторых, серверов этих куча и канал у них шире
Только находиться они могут за границей и пинг будет больше (хотя тут надо мерять). Алсо jQuery обычно маленькая доля от общего веса сайта, какой смысл ее оптимизировать (тем более что не факт что это будет быстрее)? Почему ты один файл грузишь с CDN а остальные нет? Ты реально занимаешься оптимизацией или просто бездумно копируешь то что увидедл в туториале (автор которого так же бездумно что-то копирует)?
Алсо используя сторонний CDN ты увеличиваешь риск уронить сайт. Зависший CDN превратит твой сайт на полминуты в белую страницу. Не забывай также что роскомнадзор не дремлет и может в любой момент заблокировать буржуйский тлетворный контент.
> то скачается он намного быстрее с сайта гугла, чем с твоего сайта.
это зависит от пинга, не только от ширины канала. Не у всех CDN есть точки в России (у Гугла правда скорее всего есть).
Что я хочу сказать, что стоит хотя бы проверить есть ли реально выгода, потому что она не очень очевидна, а вот уменьшения надежности сайта очевидно зависит от числа исопльзуемых серверов.
Неплохая, но сложнее PHP и менее востребованная рынком в России. Алсо мне больше Питон нравится, там синтаксис проще и строже (и он еще менее востребован рынком).
>>498006
Для незарегистрированного посетителя можно создать пустой объект с значениями по умолчанию.
>>498007
> Ну там типа скрипт будет выполняться когда html разметка загрузится
Какая от этого выгода? Поучается какое-то время все JS кнопки не будут нажиматься?
> Хотя если юзать $(document).ready
Я негативно в общем к этому отношусь, это подавалось как способ отделить JS от HTML и сделать яваскрипт ненавязчивым, но на практике если сайт больше нескольких страниц, то это загромождает код и делает его менее понятным.
<button onclick="doSmth()" по моему намного очевиднее чем написанный где-то в другом файле код, особенно когда у тебя на сайте десятки страниц и тысячи строк кода.
> Во-первых, очень многие подключают ее с сайта гугла,
Только не все одну и ту же версию. Алсо сейчаскаждый второй сайт ставит кеширующие заголовки и кеш постоянно вытесняется.
> Во-вторых, серверов этих куча и канал у них шире
Только находиться они могут за границей и пинг будет больше (хотя тут надо мерять). Алсо jQuery обычно маленькая доля от общего веса сайта, какой смысл ее оптимизировать (тем более что не факт что это будет быстрее)? Почему ты один файл грузишь с CDN а остальные нет? Ты реально занимаешься оптимизацией или просто бездумно копируешь то что увидедл в туториале (автор которого так же бездумно что-то копирует)?
Алсо используя сторонний CDN ты увеличиваешь риск уронить сайт. Зависший CDN превратит твой сайт на полминуты в белую страницу. Не забывай также что роскомнадзор не дремлет и может в любой момент заблокировать буржуйский тлетворный контент.
> то скачается он намного быстрее с сайта гугла, чем с твоего сайта.
это зависит от пинга, не только от ширины канала. Не у всех CDN есть точки в России (у Гугла правда скорее всего есть).
Что я хочу сказать, что стоит хотя бы проверить есть ли реально выгода, потому что она не очень очевидна, а вот уменьшения надежности сайта очевидно зависит от числа исопльзуемых серверов.
Да я сам на своем сайте держу jquery, просто говорить, что совсем уж плюсов никаких нет - как минимум некорректно. Да и сомневаюсь, что кто-то всерьез будет замерами скорости загрузки заниматься ради нескольких килобайт.
И вообще ребят, подскажите как можно легко и элегантно решить задачу сбора со странички всех ссылок и емейлов? Я попробовал с помощью http://simplehtmldom.sourceforge.net/ и не очень взлетело, ведь она преобразует html в большущий и тяжеловесный массив, что его даже невозможно сдампить без зависания браузера. А когда на сайте 100 ссылок на другие, то там вообще сервак отваливается, когда ты пытаешься собрать html с каждого из них. Склоняюсь теперь к простому парсу регулярками, чистого html. Но я полагаю что должны быть такие задачи уже кем-то решены, и не обязательно писать свой кривой велосипед, может подскажете?
>>497863 - кун.
>>498045
твой код пока очень хрупкий:
1) сетевые операции могут падать и зависать, у тебя не предусмотрено решения
2) не надо писать все простыней, надо разбирать на функции
3) для разбора ссылок не надо колхозить велосипед а надо использовать parse_url или стороннюю библиотеку
4) если ты не будешь себя хорошо вести, админ тебя забанит после N запросов. Никто не любит халявщиков которые только накручивают трафик, и не дают никакой пользы
5) слишком много скобок в одной строке
>>498043
Там не нужно использовать ES6 генераторы, там хватит обычных замыканий. Но можешь попробовать с генераторами решить конечно, правда это не во всех браузерах работать будет.
>>498048
> Да и сомневаюсь, что кто-то всерьез будет замерами скорости загрузки заниматься ради нескольких килобайт.
Тогда зачем ради этих килобайт усложнять свой сайт и выносить один из скриптов наружу? Единственный профит тут у гугла который может следить за посещениями сайтов (а по просьбе товарища майора еще и подсовывать на этот сайт нужный код).
http://archive-ipq-co.narod.ru/l1/loops.html
Не могу решить там исправить задачу про кредит на айфон. Может кто-нибудь помочь?
я работаю за еду помощником в микроконторе. Я писал тут зимой свои стори, и пару месяцев назад, как на работу устроился. Собственно это мой рабочий таск над которым я уже два дня ковыряюсь.
На код в учебнике не смотрел вообще специально, чтобы написать с нуля самому, глянул уже после и понял, что у меня корявенько написано, конечно. В общем, зацените. Алсо, в идеоне хтмл не поддерживается потому лютая рвота вместо красивого вывода, но ежели кто в свою идешку кинет код, там все нормально будет. Рейт, в общем. Заранее спасибо.
Ну так ты код вбрасывай, я тебе ошибку укажу. Или ты хочешь что бы я тебе решение дал?
Так ты, наверное, задай конкретный вопрос, в чем заковыка-то, а то пространное "НИ МАГУ РИШИТЬ" ни к чему не приведет.
passed
я добавил
if ($creditBalance < 0) {
\t\t$monthlyPayment = 5000 - $creditBalance;
\t\t}
Разве это не должно было исправить задачу?
>Разве это не должно было исправить задачу?
Каким образом? У тебя уже баланс в минус ушел, а ты исправляешь ежемесячную выплату, вместо долга, да еще и непонятной формулой.
Не надо заводить баланс в минус.
Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
спасибо
http://ideone.com/CqJpEf
Для того чтобы распознать телефон составил вот такой регулярный запрос:
$regexp = '/(^\\+)?8(\\(| |\\-)?911(\\)| |\\-)?[0-9]{7}[^a-zA-Zа-яёА-ЯЁ]+/';
Как я это понимаю:
/ //разделитель
(^\\+)? //проверяет в начале(т.к. ^) наличие плюса(\\+), который может быть, а может и не быть (?)
8 //ищет строго восьмерку в начале
(\\(| |\\-)? //проверяет на этой позиции наличие открывающейся скобки или пробела или малого тире, которые могут быть, а могут и не быть
911 //ищет строго очередность 911
(\\)| |\\-)? //проверяет на этой позиции наличие закрывающейся скобки или пробела или малого тире, которые могут быть, а могут и не быть
[0-9]{7} // Проверяет наличие семи цифр, возможно тут проблема, т.к. не учитываются возможные пробелы и тире
[^a-zA-Zа-яёА-ЯЁ]+ //Проверяет отсутствие каких либо букв.
/ //разделитель
Вероятно проблема в [0-9]{7} части. Подскажите как можно было бы проверить наличие семи цифр которые могут быть перемешанны с пробелами и тире? Может даже приведите пример рабочей регулярки для решения этой задачи, но не обьясняя как она работает, чтобы я сам прочитал как она работает. А то хотя казалось бы на странице про регулярки полно примеров, да и в интернете полно материала, но они все равно ставят меня в какой то ступор.
Дело в том что твое условие срабатывает после того как гипотетический анон переплатил.
Вот моё решение для примера
http://ideone.com/uEGql9
Как видишь в цикле for, есть еще два условных цикла if.
Первый как тебя и интересует. Он работает по двум сценариям. Основному, при котором сумма долга($creditBalance) больше суммы выплаты($monthlyPayment). И альтернативному, который срабатывает при обратном условии. В нем то я выплату приравниваю оставшемуся кредиту и в последствии отнимаю эту выплату из оставшегося кредита, таким образом приравнивая его 0, без переплаты.
Я сам нуб, но думаю что ОПу и местным олдфагам тут особенно не в чем меня поправлять.
>>498269
Может мне закинуть все выполненные задания для проверки? Не хотелось бы спамить в тред, но вдруг я упускаю самый цимес в заданиях.
И можно все таки пару слов по заданию на нахождение телефона в регулярках, а то Gramar Nazi задание запросто пошло, а телефоны что то в самом начале не идут.
Мне нужно, чтобы перебрасывало с filename на filename.txt
Почему не работает
RewriteRule ^(.x)$ $1.txt
(.x) ведь означает переменную, которая подставится вместо $N во втором выражении?
Не работает, вылетает с 500 ошибкой.
AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
Подозреваю, что попадаем в бесконечный цикл (.txt.txt.txt.txt....). Чо делать? Я так догадываюсь, что цикл редиректов остановится только когда выражение слева будет равно выражению справа. Значит, надо влепить какое-то исключающее условие в левое выражение.
Допустим, расширение .txt должно повторяться строго один раз, в нормальной регулярке я бы написал (\.txt){1} Не знаю, как это подсунуть в правило RewriteRule.
Кроме того, это не подходит. У меня любой загруженный пользователем файл переименовывается путем добавления .txt
Но что будет, если юзер загрузит свой helloworld.txt? Он у меня на сервере сохранится как helloworld.txt.txt, значит .txt в данном случае нужно два раза. Правило (\.txt){1} не подходит.
А если под $a есть уже другая переменная? как ее связать с другой переменной , подзабыл.
echo $a = mt_rand ( 1 , 99 ) ;
И вот хочу, что бы вместо $a = "человек"
Так не получается , просто цифру выкидывает.
Подскажи
Что ты хочешь то не могу понять? Вывести случайное количество человек? Ну тогда используй конкатенирование с помощью точки.
$a = mt_rand (1, 99);
echo $a . 'человек';
<?php
$a = "Человек";
$b = "Робот";
$a = mt_rand (1, 99);
$b = mt_rand ( 1 , 99);
echo $a . 'Человек выбросил <br>';
echo $b . 'Робот выбросил';
if ($a < $b && $a > $b)
{
if ($a < $b);
echo "Победа Человека";
То есть мне надо при победе человека, что бы так было и написано или при победе робота, второй день только изучаю, допиши плз
>if ($a < $b && $a > $b)
Вроде высняет кто выиграл
if ($a < $b);
echo "Победа Человека";
Дальше если Человек выбросил больше, то должно же отобразиться.
А у меня просто так
<?php
$a = "Человек";
$b = "Робот";
$a = mt_rand (1, 99);
$b = mt_rand ( 1 , 99);
echo $a . 'Человек выбросил <br>';
echo $b . 'Робот выбросил';
if ($a < $b && $a > $b)
{
if ($a < $b);
echo "Победа Человека";
То есть мне надо при победе человека, что бы так было и написано или при победе робота, второй день только изучаю, допиши плз
>if ($a < $b && $a > $b)
Вроде высняет кто выиграл
if ($a < $b);
echo "Победа Человека";
Дальше если Человек выбросил больше, то должно же отобразиться.
А у меня просто так
Чет я вообще понять не могу, что за код ты написал. Ты понял, как операция присваивания работает? Ты сначала переменным $a и $b присваиваешь строки "Человек" и "Робот", а затем следом им же переприсваиваешь сгенерированные случайные числа.
Ну и условная конструкция if у тебя неправильно записана. Ты должен выяснять кто выиграл сравнивая броски человека и компьютера, а ты написал примерно следующее: "если $a меньше $b и $a больше $b, то если $a меньше $b". Сам понимаешь, что это бессмыслица полнейшая. Почитай внимательнее про то, как условные конструкции работают.
Я просто хотел, что бы робот и человек кинули по кубику и в конце отобразилось, "Выиграл Робот/Человек"
И всё.
Ну так и делай это. Задание несложное. Делаешь броски кубиков, сравниваешь их и в зависимости от результата выясняешь победителя и выводишь его.
Няша дописать сможешь?
<?php
$a = mt_rand (1, 99);
$b = mt_rand ( 1 , 99);
echo $a . 'Человек выбросил <br>';
echo $b . 'Робот выбросил';
Что бы на примере понял.
<?php
$a = mt_rand (1, 99);
$b = mt_rand ( 1 , 99);
echo $a . 'Человек выбросил <br>';
echo $b . 'Робот выбросил';
if ($a < $b)
{
echo "Человек побеждает";
} elseif ($b < $a)
echo "Побеждает робот";
?>
<?php
$a = mt_rand(1,99);
$b = mt_rand(1,99);
echo 'Человек выбросил ' . $a . '<br>';
echo 'Робот выбросил' . $b . '<br>';
if ($a > $b) {
echo 'Человек победил';
} elseif ($a < $b) {
echo 'Робот победил';
} else {
echo 'Ничья';
}
>>498331
$human = mt_rand(1, 99);
$comp = mt_rand(1, 99);
echo 'Человек выбросил ' . $human;
echo 'Компьютер выбросил ' . $comp;
if($human > $comp) {
echo 'Победил человек!';
} elseif ($human < $comp) {
echo 'Победил компьютер!';
} elseif ($human == $comp) {
echo 'Ничья!';
}
Почти верно, но не совсем. Не забывай фигурные скобочки ставить. И ты не учел варианта, когда два одинаковых числа выпадут и компьютеру и человеку.
>1) сетевые операции могут падать и зависать, у тебя не предусмотрено решения
я и пришел сюда за этим, я привык писать код который не предусматривает того что функция выдаст ошибку. Я не знаю какие приемы тут используются.
>2) не надо писать все простыней, надо разбирать на функции
Сначала пишу простыню, обычно, потом заворачиваю в функцию.
>3) для разбора ссылок не надо колхозить велосипед а надо использовать parse_url или стороннюю библиотеку
Разобрать ссылки для меня не проблема, проблема собрать их со странички, вот.
Вроде всё поправил.
_____
Как двигать кнопки или элементы в бутстрапе?
Час назад начал учить пхп, решил задачу с кубиками http://ideone.com/vTDNGt.
Вопрос - зачем используется exit()?
О, вот нашел набор заклинаний на этот случай.
http://habrahabr.ru/post/75885/
Вроде помогло. Но я на самом деле не понял, как это работает.
Никак не могу найти учебник для чайников по mod_rewrite.
Спецификация апача для махохистов, это все же справочник а не учебник.
Статейки вроде той, что предлагает оп http://habrahabr.ru/company/sprinthost/blog/129560/ , написаны мудаками, которые не снисходят до объяснения базовых вещей.
Гугление выдает десятки бложиков быдло-кодеров с готовыми шпаргалками, но естественно без объяснений, что это вообще такое.
В общем, лично меня больше напрягает искать информацию, чем ее собственно усваивать.
На торрентах книг не вижу. Зашел на озон, есть вроде несколько книжек на английском, но где их скачать бесплатно.
О, вроде нашел видео от o'reilly media.
Попробуем.
http://rutracker.org/forum/viewtopic.php?t=5012266
А мне эта статься http://habrahabr.ru/company/sprinthost/blog/129560/ очень помогла, по сути только с помощью неё я смог нормально настроить .htaccess под свои нужды. Я сел, прочитал её от начала и до конца, и в голове всё стало яснее насчет мод рерайта. Чем она тебя не устроила?
>как потом собственно сам файл на скачку дать
Ссылку на файл сделать, очевидно же. Только если это картинка, она по ссылке будет открываться в полном размере, так что там нужно еще добавить какие-то заголовки, типа Content-Disposition: attachment
Оп мне дал ссылку на эту бестолоковую статью
http://habrahabr.ru/post/151795/
Нихера не понятно, я щетаю. Почитай, может разберешься.
>Я предполагаю, что читатель уже знаком с тем, что такое mod_rewrite, и не буду описывать его основы, которые легко найти в интернете.
Дальше не читал. Обоссал автора.
Вот тебе правильное решение и не скопированное у ОПа, полностью с нуля, даже без взглядов на ОП-стайл решение. Получилось может и костыльно, но неплохо ящитаю.
ОП рейт май код плз!
exit; или exit(); прекращает работу твоего скрипта.
В твоем примере ты мог бы в принципе в конце каждого блока написать или не писать их вообще, ничего бы не изменилось.
Другое дело если у тебя большой скрипт, и ты хочешь где-нибудь в серединке посмотреть значение переменной без выполнения всего скрипта, ты можешь сделать так:
var_dump($userInfo);
exit;
Правила mod rewrite применяются в цикле пока URL не перестанет меняться. Правила это не программа которая выполняется один раз, а они применяются по много раз пока URL не перестанет меняться. Соответственно ты должен писать не в стиле:
- приписать к URL .txt
А в таком стиле
- если URL не содержит .txt в конце (и этот URL подлежит замене) то приписать к URL .txt
Этого можно добиться 2 способами:
— использовать регулярку с условием что в конце нет txt
— использовать условие RewriteCond перед правилом
И по моему в той статье на хабре, которую я дал, и которая тебе не нравится, это описано:
> При составлении более-менее сложных конфигураций mod_rewrite важно понимать, что изменение запроса не заканчивается на последнем RewriteRule. После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала .htaccess.
Потому я и даю эту статью, что она в отличие от 99% других объясняет этот момент, потому она лучше всех этих 99%, пусть они и более простыми словами написаны, но о самом важном они молчат (в документации это тоже кстати описано, потому она еще лучше).
> расширение .txt должно повторяться строго один раз, в нормальной регулярке я бы написал (\.txt){1}
Это значит что в регулярке должно встретиться txt но это не гарантирует что перед ним или после оно не встретится еще раз. То есть оно не сработает.
Я думаю, тут проще использовать условие RewriteCond. А если ты делаешь файлообменник то умнее будет разделить папку где хранятся файлы реально и папку которая написана в запросе. Я же давал пример:
Реальная папка /upload/file.txt
Папка в URL для скаивания /download/file
Тогда легко написать такую регулярку которая будет заменять только нужные URL и не трогать их во второй раз. При переписыании мы поменяем download на upload и второй раз правило не применится.
> Я так догадываюсь, что цикл редиректов остановится только когда выражение слева будет равно выражению справа.
Неверно. Во-первых, это не редиректы, а «переписывания», редирект это когда мы шлем браузеру заголовок Location, а тут внутри сервера заменяется URL. Во-вторых цикл остановится когда URL перестанет меняться. то есть ни одно из правил не сработает. И в статье на хабре это упомянуто, посмотри.
> Но что будет, если юзер загрузит свой helloworld.txt? Он у меня на сервере сохранится как helloworld.txt.txt, значит .txt в данном случае нужно два раза. Правило (\.txt){1} не подходит.
Потому надо сделать чтобы URL для скачивания и путь к файлу например начинались с разных папок чтобы их легко было отличить. Или различались чем-то еще.
Правила mod rewrite применяются в цикле пока URL не перестанет меняться. Правила это не программа которая выполняется один раз, а они применяются по много раз пока URL не перестанет меняться. Соответственно ты должен писать не в стиле:
- приписать к URL .txt
А в таком стиле
- если URL не содержит .txt в конце (и этот URL подлежит замене) то приписать к URL .txt
Этого можно добиться 2 способами:
— использовать регулярку с условием что в конце нет txt
— использовать условие RewriteCond перед правилом
И по моему в той статье на хабре, которую я дал, и которая тебе не нравится, это описано:
> При составлении более-менее сложных конфигураций mod_rewrite важно понимать, что изменение запроса не заканчивается на последнем RewriteRule. После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала .htaccess.
Потому я и даю эту статью, что она в отличие от 99% других объясняет этот момент, потому она лучше всех этих 99%, пусть они и более простыми словами написаны, но о самом важном они молчат (в документации это тоже кстати описано, потому она еще лучше).
> расширение .txt должно повторяться строго один раз, в нормальной регулярке я бы написал (\.txt){1}
Это значит что в регулярке должно встретиться txt но это не гарантирует что перед ним или после оно не встретится еще раз. То есть оно не сработает.
Я думаю, тут проще использовать условие RewriteCond. А если ты делаешь файлообменник то умнее будет разделить папку где хранятся файлы реально и папку которая написана в запросе. Я же давал пример:
Реальная папка /upload/file.txt
Папка в URL для скаивания /download/file
Тогда легко написать такую регулярку которая будет заменять только нужные URL и не трогать их во второй раз. При переписыании мы поменяем download на upload и второй раз правило не применится.
> Я так догадываюсь, что цикл редиректов остановится только когда выражение слева будет равно выражению справа.
Неверно. Во-первых, это не редиректы, а «переписывания», редирект это когда мы шлем браузеру заголовок Location, а тут внутри сервера заменяется URL. Во-вторых цикл остановится когда URL перестанет меняться. то есть ни одно из правил не сработает. И в статье на хабре это упомянуто, посмотри.
> Но что будет, если юзер загрузит свой helloworld.txt? Он у меня на сервере сохранится как helloworld.txt.txt, значит .txt в данном случае нужно два раза. Правило (\.txt){1} не подходит.
Потому надо сделать чтобы URL для скачивания и путь к файлу например начинались с разных папок чтобы их легко было отличить. Или различались чем-то еще.
https://github.com/Integer64/myTestSite.dev/tree/master/vecktor_OOP
Оп можно считать задачу решенной и идти дальше?
А откуда ты будешь посылать GET запрос? Со страницы скачивания? Тогда это не число скачиваний а число просмотров страницы скачивания и его можно считать в момент генерации этой страницы без лишних запросов.
Ты понимаешь как происходит скачиание? пользователь кликает по ссылке, браузер отправляет запрос, Апач видит что ссылка ведет на файл и отдает этот файл. PHP тут даже не вызвыается и никак посчитать это не может. Вариантов два:
— анализировать логи веб-сервера
— отдавать файл не напрямую с диска, а через PHP скрипт
Первый вариант неудобен так как лог файл может быть огромным, надо как-то запускать по расписанию скрипт-анализатор, разбирать файл с места где мы остановились, считать число скачиваний каждого файла. Форматы лог файлов у nginx и апач разные, так что при замене сервера придется переделывать скрипт. Такой подход использовали в древние времена.
Второй вариант тоже имеет недостатки. Ведь все время пока скачивается файл, тебе надо держать в памяти PHP скрипт. Апач или nginx умеют отдавать файлы гораздо эффективнее.
Для решения этой проблемы есть такой вариант, как x-Sendfile. При попытке скаивания файла сначала запускается php скрипт, проверяет доступ к файлу, учитывает начало скачивания, а затем выдает заголовок X-Sendfile и завершается. Сервер Апач перехватывает этот заголовок и начинает отдавать пользователю указанный в нем файл.
Инфа: http://habrahabr.ru/post/151795/
Для nginx используется аналогичный подход, только заголовок называется по другому, X-Accel-Redirect. Чтобы это работало, надо установить в Апач/nginx соотв. модуль.
Если ты способен написать расширение на Си к серверу, ты можешь сделать более крутые вещи, например учесть не только факт начала скачивания но и число скачанных байт.
И еще предупреждение. Если ты захочешь делать счетчик просмотров увеличивая циферку в базе, имей в виду что на нагруженных сайтах такая вещь может создавать сильную нагрузку. 100-200 обновлений циферки в секунду будут создавать большую нагрузку, потому для счетчиков просмотров/скачиваний лучше использовать более хитрые подходы вроде описанного тут http://habrahabr.ru/company/mailru/blog/206494/ либо хранилища вроде redis.
Ну твоему файлообменнику это пока не грозит, так что статья просто для ознакомления, делать ничего такого не надо.
А откуда ты будешь посылать GET запрос? Со страницы скачивания? Тогда это не число скачиваний а число просмотров страницы скачивания и его можно считать в момент генерации этой страницы без лишних запросов.
Ты понимаешь как происходит скачиание? пользователь кликает по ссылке, браузер отправляет запрос, Апач видит что ссылка ведет на файл и отдает этот файл. PHP тут даже не вызвыается и никак посчитать это не может. Вариантов два:
— анализировать логи веб-сервера
— отдавать файл не напрямую с диска, а через PHP скрипт
Первый вариант неудобен так как лог файл может быть огромным, надо как-то запускать по расписанию скрипт-анализатор, разбирать файл с места где мы остановились, считать число скачиваний каждого файла. Форматы лог файлов у nginx и апач разные, так что при замене сервера придется переделывать скрипт. Такой подход использовали в древние времена.
Второй вариант тоже имеет недостатки. Ведь все время пока скачивается файл, тебе надо держать в памяти PHP скрипт. Апач или nginx умеют отдавать файлы гораздо эффективнее.
Для решения этой проблемы есть такой вариант, как x-Sendfile. При попытке скаивания файла сначала запускается php скрипт, проверяет доступ к файлу, учитывает начало скачивания, а затем выдает заголовок X-Sendfile и завершается. Сервер Апач перехватывает этот заголовок и начинает отдавать пользователю указанный в нем файл.
Инфа: http://habrahabr.ru/post/151795/
Для nginx используется аналогичный подход, только заголовок называется по другому, X-Accel-Redirect. Чтобы это работало, надо установить в Апач/nginx соотв. модуль.
Если ты способен написать расширение на Си к серверу, ты можешь сделать более крутые вещи, например учесть не только факт начала скачивания но и число скачанных байт.
И еще предупреждение. Если ты захочешь делать счетчик просмотров увеличивая циферку в базе, имей в виду что на нагруженных сайтах такая вещь может создавать сильную нагрузку. 100-200 обновлений циферки в секунду будут создавать большую нагрузку, потому для счетчиков просмотров/скачиваний лучше использовать более хитрые подходы вроде описанного тут http://habrahabr.ru/company/mailru/blog/206494/ либо хранилища вроде redis.
Ну твоему файлообменнику это пока не грозит, так что статья просто для ознакомления, делать ничего такого не надо.
> я и пришел сюда за этим, я привык писать код который не предусматривает того что функция выдаст ошибку.
У тебя функции, которые скачивают файл, они в сторонней библиотеке. Надо почитать документацию, код и выяснить что они делают при ошибке и можем ли мы это контролировать. Если да то хорошо, если нет, то надо скачивать страницу самостоятельно любым другим HTTP-клиентом который позволяет контролировать ситуацию. Например Guzzle или расширением curl или как-то еще. Опять же для этого придется читать их код и документацию.
> Как двигать кнопки или элементы в бутстрапе?
В обшем случае для этого придется изучить HTML/CSS (у нас есть задания и ссылки в ОП посте). А что именно тебе надо сделать? Может есть более простое решение?
>>498388
> О, вот нашел набор заклинаний на этот случай.
Костыли
> Но я на самом деле не понял, как это работает.
Апач применяет правила пока URL не перестанет меняться. Значит ты должен сделать так, чтобы исходный и измененный URL было легко различить.
> написаны мудаками, которые не снисходят до объяснения базовых вещей.
Что именно не объяснено?
> Спецификация апача для махохистов
Я ее читал когда-то давно, когда сам разбирался.
>>498483
Конечно, ты можешь не ждать пока я проверю и идти дальше, а потом если что, вернешься. Там у тебя как я помню, почти все готово, я постараюсь сегодня глянуть.
Где это ты взял кубик на котором может выпасть 99? Алсо нет проверки на даблы (если у обоих даблы то ничья).
Мои претензии к учебным материалам по веб-разработке заключаются в следующем:
1) Непоследовательность изложения. В одном абзаце об одном, во втором абзаце вдруг речь идет уже о совершенно другом, причем где связь между первым и вторым, неясно.
При чтении подобного материала создается впечатление, что авторы пересказывают и компилируют данные из других источников.
2) Неупорядоченность по сложности. В одном и том же месте могут упоминаться как простые вещи, так и сложные. Логического перехода от одной главы к другой тоже незаметно. Особенно это касается документаций, где каждая глава фактически не зависит от другой. Там блин синтаксис объясняется, а на следующей странице какая-нибудь навороченная библиотека или модуль.
Должен быть логический переход и прирост сложности от самых "элементарных" вещей до самых сложных.
3) Фрагментарность. Это касается именно статеек. Автор дает описание какой-то узкой темы, подразумевая что читатели уже имеют некоторые знания. Ну а у меня нет этих знаний. Что мне делать? Гуглить с утра до ночи?
У тебя кстати в твоих уроках неплохо получается соответствовать моим требованиям к учебной литературе. Тогда почему этих простых установок не могут придерживаться другие авторы?
Ну ладно, мои комментарии к учебным материалам носят риторический характер. Можешь на них не реагировать, если раздражают.
Просто когда мне непонятно, я говорю, что написано непонятно. Я достаточно самоуверен, мне насрать что кто-то посчитает меня тупым. Мне жаль времени, которое я трачу на поиск, осмысление и упорядочивание сбивчивой информации. Это время можно было потратить на написание красивого кода, или в конце концов на личную жизнь.
> это не редиректы, а «переписывания»
Да, уже понял.
Опять-таки, кто виноват в этом моем заблуждении? Да потому что нигде об этом не сказано, и мне пришлось гадать, как оно работает.
Ну вот видишь, ты мне только что объяснил, что это не редирект, а переписывание урла. Почему эти уважаемые господа, матерям которых я передаю привет, не соизволили сделать то же самое?
Ты сейчас конечно кинешь мне ссылку на какую-то конкретную страницу оф.документации апачика, но пойми что проблема заключается в том, чтобы на нее попасть. Вот я захотел узнать, как подменить урл в запросе. Захожу на http://httpd.apache.org/docs/2.4/
Дальше-то что? Как мне здесь что-то найти? Я не знаю даже ключевых слов для поиска. Я не знаю про модуль mod_rewrite, про его команды/опции типа RewriteCond или RewriteRule. Какими должны быть мои действия?
>умнее будет разделить папку где хранятся файлы реально и папку которая написана в запросе
О, вот это хорошая мысль, благодарствую.
>>498491
>это не число скачиваний а число просмотров страницы скачивания
А какая разница? Я тоже буду делать счетчик в файлообменнике, потому встреваю, с вашего позволения.
Разница может быть только в том, докачал ли пользователь файл до конца, но это не так важно мне кажется.
>>498503
>Костыли
Знаю, но лучше решения не нагуглил. Пока ты не подсказал подменять не только название файла, но и папку.
Опять-таки констатирую, что я узнаю об этом остроумном и логичном решении не из оф.источников, а на форуме для инфантильных подростков-аутистов.
>Что именно не объяснено?
>Я предполагаю, что читатель уже знаком с тем, что такое mod_rewrite, и не буду описывать его основы, которые легко найти в интернете.
Я не знаком с тем, что такое mod_rewrite. Есть ли мне смысл читать эту статью, если я не понимаю, что такое RewriteRule и RewriteCond, например, которые постоянно упоминаются в статье, и автор которой не снисходит до пояснений таких вещей?
>не буду описывать его основы, которые легко найти в интернете
Пусть каждый, кто так говорит, подтверждает свои слова ссылками. Ну а чего, это ведь легко.
>Итак, вы изучили mod_rewrite, составили несколько RewriteRule и успели столкнуться с бесконечными перенаправлениями, со случаем, когда правило почему-то не ловит ваш запрос, а также с непредсказуемой работой ...
Херово изучили значит.
Слушай, я могу конечно по частям разобрать написанное там.
Но может сложиться впечатление, что я больше занимаюсь засиранием этого треда, чем реально учебой, поэтому не буду.
Очень мало хорошей информации в интернете. Это факт.
Возможно сказывается то, что я не имею программистского образования. Студентики хоть и пиздят что мол их там ничему не учат, но наверное в университетах все-таки долго и нудно вкачиваются именно те базовые вещи, которых мне теперь не хватает.
Надо бы качнуть пару учебников по информатике, запишу себе.
Я почти исправил все твои замечания по файлообменнику. Сейчас вот разберусь с урлами и сохранением файла через указание заголовков, и завтра-послезавтра уже запушу на гитхаб.
О, вопрос по заголовкам: почему в этой статье http://habrahabr.ru/post/151795/ господа не снисходят до объяснения, что делает каждый заголовок? Я знаю, что это есть где-то там на php.net. Но нафига тогда вообще нужны статьи на хабре, если все есть на php.net?
Потом в планах перенос процесса загрузки на хрупкие плечи аякса и создание превью для изображений, что является у тебя отдельным уроком.
Мои претензии к учебным материалам по веб-разработке заключаются в следующем:
1) Непоследовательность изложения. В одном абзаце об одном, во втором абзаце вдруг речь идет уже о совершенно другом, причем где связь между первым и вторым, неясно.
При чтении подобного материала создается впечатление, что авторы пересказывают и компилируют данные из других источников.
2) Неупорядоченность по сложности. В одном и том же месте могут упоминаться как простые вещи, так и сложные. Логического перехода от одной главы к другой тоже незаметно. Особенно это касается документаций, где каждая глава фактически не зависит от другой. Там блин синтаксис объясняется, а на следующей странице какая-нибудь навороченная библиотека или модуль.
Должен быть логический переход и прирост сложности от самых "элементарных" вещей до самых сложных.
3) Фрагментарность. Это касается именно статеек. Автор дает описание какой-то узкой темы, подразумевая что читатели уже имеют некоторые знания. Ну а у меня нет этих знаний. Что мне делать? Гуглить с утра до ночи?
У тебя кстати в твоих уроках неплохо получается соответствовать моим требованиям к учебной литературе. Тогда почему этих простых установок не могут придерживаться другие авторы?
Ну ладно, мои комментарии к учебным материалам носят риторический характер. Можешь на них не реагировать, если раздражают.
Просто когда мне непонятно, я говорю, что написано непонятно. Я достаточно самоуверен, мне насрать что кто-то посчитает меня тупым. Мне жаль времени, которое я трачу на поиск, осмысление и упорядочивание сбивчивой информации. Это время можно было потратить на написание красивого кода, или в конце концов на личную жизнь.
> это не редиректы, а «переписывания»
Да, уже понял.
Опять-таки, кто виноват в этом моем заблуждении? Да потому что нигде об этом не сказано, и мне пришлось гадать, как оно работает.
Ну вот видишь, ты мне только что объяснил, что это не редирект, а переписывание урла. Почему эти уважаемые господа, матерям которых я передаю привет, не соизволили сделать то же самое?
Ты сейчас конечно кинешь мне ссылку на какую-то конкретную страницу оф.документации апачика, но пойми что проблема заключается в том, чтобы на нее попасть. Вот я захотел узнать, как подменить урл в запросе. Захожу на http://httpd.apache.org/docs/2.4/
Дальше-то что? Как мне здесь что-то найти? Я не знаю даже ключевых слов для поиска. Я не знаю про модуль mod_rewrite, про его команды/опции типа RewriteCond или RewriteRule. Какими должны быть мои действия?
>умнее будет разделить папку где хранятся файлы реально и папку которая написана в запросе
О, вот это хорошая мысль, благодарствую.
>>498491
>это не число скачиваний а число просмотров страницы скачивания
А какая разница? Я тоже буду делать счетчик в файлообменнике, потому встреваю, с вашего позволения.
Разница может быть только в том, докачал ли пользователь файл до конца, но это не так важно мне кажется.
>>498503
>Костыли
Знаю, но лучше решения не нагуглил. Пока ты не подсказал подменять не только название файла, но и папку.
Опять-таки констатирую, что я узнаю об этом остроумном и логичном решении не из оф.источников, а на форуме для инфантильных подростков-аутистов.
>Что именно не объяснено?
>Я предполагаю, что читатель уже знаком с тем, что такое mod_rewrite, и не буду описывать его основы, которые легко найти в интернете.
Я не знаком с тем, что такое mod_rewrite. Есть ли мне смысл читать эту статью, если я не понимаю, что такое RewriteRule и RewriteCond, например, которые постоянно упоминаются в статье, и автор которой не снисходит до пояснений таких вещей?
>не буду описывать его основы, которые легко найти в интернете
Пусть каждый, кто так говорит, подтверждает свои слова ссылками. Ну а чего, это ведь легко.
>Итак, вы изучили mod_rewrite, составили несколько RewriteRule и успели столкнуться с бесконечными перенаправлениями, со случаем, когда правило почему-то не ловит ваш запрос, а также с непредсказуемой работой ...
Херово изучили значит.
Слушай, я могу конечно по частям разобрать написанное там.
Но может сложиться впечатление, что я больше занимаюсь засиранием этого треда, чем реально учебой, поэтому не буду.
Очень мало хорошей информации в интернете. Это факт.
Возможно сказывается то, что я не имею программистского образования. Студентики хоть и пиздят что мол их там ничему не учат, но наверное в университетах все-таки долго и нудно вкачиваются именно те базовые вещи, которых мне теперь не хватает.
Надо бы качнуть пару учебников по информатике, запишу себе.
Я почти исправил все твои замечания по файлообменнику. Сейчас вот разберусь с урлами и сохранением файла через указание заголовков, и завтра-послезавтра уже запушу на гитхаб.
О, вопрос по заголовкам: почему в этой статье http://habrahabr.ru/post/151795/ господа не снисходят до объяснения, что делает каждый заголовок? Я знаю, что это есть где-то там на php.net. Но нафига тогда вообще нужны статьи на хабре, если все есть на php.net?
Потом в планах перенос процесса загрузки на хрупкие плечи аякса и создание превью для изображений, что является у тебя отдельным уроком.
Схоронил ответ и задания на xml.
Я сейчас как раз смотрю курс специалиста.
Как закончу с файлообменником, выполню задания на xml.
Я делал почти все начальные задания в html/css, просто насколько я понял мне нельзя самолично менять начинку bootstrap, а полазив по сайту http://getbootstrap.com/css/ я не нашел инфы как задавать положение div'ов методами бутстрапа.
Хочу на пикрелейтед передвинуть кнопки в центр средствами фреймворка, чтобы не вручную прописывать css свойство в html файле.
<div class="col-md-offset-2"> например, вот здесь все описано
http://getbootstrap.com/css/#grid
Не-ОП
>А откуда ты будешь посылать GET запрос?
Ну так ссылка на скачивание будет выглядеть аля /download?id=12 и вести на функцию, которая в качестве параметра будет принимать id файла и увеличивать в базе счетчик на 1. Походу все же это самый реальный способ на данный момент. За ссылку на статью спасибо, как дойду до реализации счетчика обязательно ее почитаю.
Еще такой вопрос возникает, как сделать так, чтобы файл выдавался не под тем названием, под которым он лежит на диске? Временно копировать его, переименовывать копию в оригинальное имя и после завершения скрипта удалять? Или есть более элегантный вариант?
Можешь кнопки поместить в блок и добавить ему класс center-block. Или прописать offset/push как посоветовал >>498575.
Алсо, сам файл стилей бутстрапа действительно трогать не нужно, но это не значит, что нельзя создать свой файл стилей и переназначать те свойства, которые тебя не устраивают. Бутстрап конечно избавляет тебя от надобности писать кучу стилей, но это не значит, что их совсем не надо писать.
Как вызвать окно сохранения файла?
Я обязательно прочту тысячетомник по http-протоколу в будущем. http://www.faqs.org/rfcs/rfc2616.html
Но сейчас хотелось бы уже побыстрее закончить простое задание.
Что я неправильно делаю?
Вот у меня слимовский маршрут:
$app->get('/download/:file', function ($file) use ($app) {
if (file_exists('upload/'.$file.'.txt')) {
\theader('Content-Disposition: attachment; filename=' . 'upload/' . $file . '.txt');
}else{
echo 'Запрашиваемый файл не найден.';
}
});
Я хочу чтобы при клике на ссылку открывалось окно сохранения, а картинка открывается в браузере.
может быть нужно ещё
Content-Type: image/png
можно также через ф-ию header отправить заголовок
Ну если ты имеешь в виду разделение логики выведения, обработки и хранения то у меня вроде как это есть.
А, это же блядский htaccess.
Я когда слим ставил, там нужно было добавить htaccess, содержающий строку
RewriteCond %{REQUEST_FILENAME} !-f
!-f означает, что следующее в RewriteRule правило не будет работать с файлами. А мне нужно, чтобы работало.
Ну что же, не могу не похвалить себя за упердие.
В бутстрапе есть классы для организации сетки. Сетка состоит из 12 колонок по горизонтали. Они позволяют указать в отсносительных единицах ширину блока и отступ от левого края, например:
— этот блок должен иметь отступ слева равный 2 колонкам и ширину равную 6 колонкам сетки
Описано это тут:
http://getbootstrap.com/css/#grid (англ)
http://bootstrap-3.ru/css.php#grid (рус)
Ты можешь с помощью них пометить форму чтобы она имела определенный размер (а все внутри нее скорее всего само подстроится).
Для того чтобы расположить кнопки по центру достаточно поместить их в див и задать ему text-align: center.
> я понял мне нельзя самолично менять начинку bootstrap
Нельзя менять сторонние библиотеки. Но ты можешь подключить к странице свой отдельный CSS файл и писать в нем все, что хочешь.
Я тебе советую изучить HTMl/CSS. Ну сам подумай, как ты без них будешь делать страницы? каждый раз звать кого-то на помощь? Это не сложно и если ты будешь неспешно изучать их параллельно с другими делами то это займет у тебя 2-4 недели. У нас в ОП посте есть хорошие задачи для проверки. Справочник есть на сайте htmlbook.ru. Обучалка (очень хорошая) есть на сайте htmlacademy.ru (не хочу их рекламировать так как это коммереская компания, они пытаются что-то там продать, но курсы у них хорошие).
Место жительства и пол надо сделать не таблицей (не используй таблицы для оформления, что за дикость? для этого есть CSS. Таблицы используются только для вывода таблиц с данными).
Посмотри как в документации бустрапа сделана галочка в форме и сделай радиокнопки так же (только у них там одна галочка, а у тебя 2 идущие рядом радиокнопки).
Ты же умный мальчик. Давно бы в гугл вбил . Паттерн MVC. Я про него вообще в книже по андроид прочитал.
> theader('Content-Disposition: attachment; filename=' . 'upload/' . $file . '.txt');
свойство filename задает не путь к файлу, а имя которое подставляется в диалоге сохранения. Его лучше не использовать вообще, так как оно надежно работает только с латиннцией, а русские буквы разные браузеры понимают в разной кодировке. Вместо этого для задания имени файла надо сделать чтобы ссылка заканчивалась желаемым именем.
Ну и заголовок только говорит браузеру сохранить файл, не пытаясь его отобразить на экране. Но где сам файл? Ты же его не передаешь.
Мне кажется тебе надо разобраться с тем как работает браузер, что происходит при открытии страницы или отправке формы и основами протокола HTTP. Не знаю что посоветовать почитать, это надо еще поискать.
>>498622
> !-f означает, что следующее в RewriteRule правило не будет работать с файлами. А мне нужно, чтобы работало
правильно он там стоит чтобы при обращении к файлу вроде style.css Апач сам его отдавал, а не вызывал PHP. зачем запускать PHP скрипт если файл можно отдать сразу с диска? Это же неэффективно.
Так что не надо убирать это правило.
Я выше тебе написал что для отдачи файлов надо либо использовать трюк с переписыванием URL (заголовок Content-Disposition attachemnt этим файлам можно добавить отдельным htaccess) либо использовать X-SendFile чтобы PHP запускался только в начале скачивания, а файл отдавал сервер.
В моему уроке про список студентов описано: https://github.com/codedokode/pasta/blob/master/student-list.md#mvc
>>498674
Умный мальчик, что ты забыл в нашем треде для начинающих?
>>498597
> хотелось бы уже побыстрее закончить простое задание.
Хотелось бы чтобы ты изучил тему и знал как организовать скачивание файлов с нужным именем. Какой иначе смысл делать это задание?
Блин, пользоваться гуглом так сложно. Разве поиск информации не является частью работы программиста???
>X-SendFile
Не хочу тащить левый модуль. Я еще с мод-реврайт не разобрался.
Да, с css я обосрался, уже заметил. Так что мне нужно сформировать следующее правило для слима: любой запрос, кроме папки css, перенаправлять на index.php.
Если ты помнишь с чего вся эта петрушка началась, то мы с тобой решили, что для защиты от хакера лучше всего дописывать файлу расширение .txt
Мне нужно, чтобы realname.gif.txt отдавался по маршруту
$app->get('/download/:file', ...);
Например /download/realname.gif меняется на upload/35788_realname.gif.txt
Оно у меня уже почти работает.
Погоди, вот посмотрю курс от о'рили, и доделаю.
Бампаю ебанутыми скринами их уроков.
>>498682
>Разве поиск информации не является частью работы программиста
Программист насколько я знаю должен писать программы. Поиском информации занимается сео- и контент-манагер.
Гугл не подскажет что надо искать именно MVC для веба, так как изначально паттерн делался для GUI приложений и в вебе он используется немного по другому. Тех, кто ищет такую информацию гуглом и потом например пытается продемонстрировать знание на союеседовании, очень легко подловить, попросив например объяснить что значит стрелка от M к V (из первой статьи в результатх гугла: https://ru.wikipedia.org/wiki/Model-View-Controller )
В вебе стрелка идет от контроллера к вью.
Потому гугл не (всегда) может заменить преподавателя.
Странно что такой умный мальчик как ты этого не понимает.
Ты предлагаешь каждый раз к тебе обращаться?? Т.е. самостоятельно не надо пытаться понять как решить тот или иной вопрос???
И про MVC можно общие черты понять.
> любой запрос, кроме папки css, перенаправлять на index.php.
А картинки, robots.txt, simemap.xml, картинки, шрифты, скрипты, favicon.icon, файлы подтверждения для гугла/яндекса — это минимум того что обычно добавляется на сайты в ходе работы над ними.
> Если ты помнишь с чего вся эта петрушка началась, то мы с тобой решили, что для защиты от хакера лучше всего дописывать файлу расширение .txt
хорошая идея
> Мне нужно, чтобы realname.gif.txt отдавался по маршруту
ты можешь сначала сделать через слим, но с расчетом на то, чтобы переделать дальше нормально. Мне не нравится идея отдавать файле через PHP на файлообменнике где скачивание это основная деятльность. Тем более что у тебя аж 2 варианта на выбор, X-Sendfile или (что имхо даже луше) mod_rewrite.
Там у тебя выше были вопросы про заголовки и еще что-то, я до них тоже дойду и отвечу.
Что я хотел сказать, что некоторые вещи легко гуглятся, а некоторые нет. И еще я хотел сказать что не надо в нашем треде самоутверждаться и отправлять в гугл, не написав ключевых слов и лично не посмотрев что по ним ищется.
Никто не пытался самоутвердится. И чем самоутверждаться ??? Что за негатив такой???
Как будто я его тупым ушлепком назвал??
Потому что ты не пытаешься помочь. Посты тут конечно не подписаны, но выглядит что это ты написал:
> А ты паттерн MVC не юзал что ли?
Там же есть выше ссылка на гитхаб. Почему бы сначала тебе не глянуть код и не посмотреть, есть там MVC или нет?
Далее, вместо того чтобы дать хорошую сылку или хотя бы слова для поиска которые ведут к хорошей ссылке, ты начал писать не несущие ценности посты.
> Ты же умный мальчик. Давно бы в гугл вбил .
Мы все умеем пользоваться гуглом, но с ключевыми словами или готовой хорошей ссылкой это гораздо удобнее. Сначала сам проверь что ищется по этим словам, а потом советуй иначе совет «погугли» не несет никакой ценности.
Отвечает Друзь мануал: http://php.net/manual/ru/language.types.string.php
>>498706
> А что делать с превьюшками картинок/видео/аудио?
Превьюшки хранить с нормальными расширениями. Их же ты генерируешь и в них ничего плохого нет. Ну и расширения jpg, png, gif Апач знает и не будет пытаться выполнять как код.
Насчет аудио/видео сложнее, популярные расширения типа mp3 Апач наверно знает, а более редкие может и не знать. Но плеер не смотрит на расширение. Он может быть смотрит, а может и нет (это стоит проверить), на заголовок Content-Type (который Апач выставляет по расширению файла и который мы можем переопределить через htaccess или если используем X-SendFile).
Также, помни что браузеры поддерживают очень небольшой набор форматов и кодеков которые они могут играть. То есть плеер не сможет играть любой файл, который закачан. Ютуб и подобные сайты для борьбы с этим конвертируют все файлы в нужный формат (точнее, 2-3 формата чтобы охватить все платформы), но для нашей задачи это наверно перебор.
Ты можешь либо выводить плеер для любых файлов в надежде, что он заработает, либо проверять поддержку кодеков яваскриптом и выводить/не выводить плеер, либо еще как-то.
Вот информация про поддерживаемые типы файлов:
https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats
https://helpx.adobe.com/flash/kb/supported-codecs-flash-player.html
Список расширений которые знает (и не пытается выполнять) твой Апач ты можешь найти в файле mime.types в папке conf Апача. Разумеется на хостинге список может быть немного другой так как он зависит от дистрибутива. В моем дебиане например расширения описаны в
/etc/mime.types
/etc/apache2/mods-available/mime.conf
Потому лучше полагаться на то, что гарантированно везде работает и что твой файлообменник не окажется уязвимым будучи загруженным на хостинг.
Вот кстати нашел в документации Апача предупреждение про файлы с несколькими расширениями: http://httpd.apache.org/docs/current/mod/mod_mime.html#multipleext
> Вроде слышал, что можно принудительно заставить браузер открывать файл как какой-то определенный формат передавая заголовки
Имеется в виду загловок Content-Type. В вебе расширение файла не имеет значения, а тип отдаваемого файла (и как его отобразит браузер, как текст или картинку или еще что-то) определяется заголовком Content-Type.
Это можно делать при переписывании URL:
https://beget.ru/articles/htaccess#mod_rewrite
> 'type|T=MIME-тип [=code]'
> (принудительно установить MIME тип)
Также заголовок можно выдать при отдаче файла с помощью X-SendFile
Но я не уверен что тебе это потребуется. Давай пока без этого попробуем сделать.
Отвечает Друзь мануал: http://php.net/manual/ru/language.types.string.php
>>498706
> А что делать с превьюшками картинок/видео/аудио?
Превьюшки хранить с нормальными расширениями. Их же ты генерируешь и в них ничего плохого нет. Ну и расширения jpg, png, gif Апач знает и не будет пытаться выполнять как код.
Насчет аудио/видео сложнее, популярные расширения типа mp3 Апач наверно знает, а более редкие может и не знать. Но плеер не смотрит на расширение. Он может быть смотрит, а может и нет (это стоит проверить), на заголовок Content-Type (который Апач выставляет по расширению файла и который мы можем переопределить через htaccess или если используем X-SendFile).
Также, помни что браузеры поддерживают очень небольшой набор форматов и кодеков которые они могут играть. То есть плеер не сможет играть любой файл, который закачан. Ютуб и подобные сайты для борьбы с этим конвертируют все файлы в нужный формат (точнее, 2-3 формата чтобы охватить все платформы), но для нашей задачи это наверно перебор.
Ты можешь либо выводить плеер для любых файлов в надежде, что он заработает, либо проверять поддержку кодеков яваскриптом и выводить/не выводить плеер, либо еще как-то.
Вот информация про поддерживаемые типы файлов:
https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats
https://helpx.adobe.com/flash/kb/supported-codecs-flash-player.html
Список расширений которые знает (и не пытается выполнять) твой Апач ты можешь найти в файле mime.types в папке conf Апача. Разумеется на хостинге список может быть немного другой так как он зависит от дистрибутива. В моем дебиане например расширения описаны в
/etc/mime.types
/etc/apache2/mods-available/mime.conf
Потому лучше полагаться на то, что гарантированно везде работает и что твой файлообменник не окажется уязвимым будучи загруженным на хостинг.
Вот кстати нашел в документации Апача предупреждение про файлы с несколькими расширениями: http://httpd.apache.org/docs/current/mod/mod_mime.html#multipleext
> Вроде слышал, что можно принудительно заставить браузер открывать файл как какой-то определенный формат передавая заголовки
Имеется в виду загловок Content-Type. В вебе расширение файла не имеет значения, а тип отдаваемого файла (и как его отобразит браузер, как текст или картинку или еще что-то) определяется заголовком Content-Type.
Это можно делать при переписывании URL:
https://beget.ru/articles/htaccess#mod_rewrite
> 'type|T=MIME-тип [=code]'
> (принудительно установить MIME тип)
Также заголовок можно выдать при отдаче файла с помощью X-SendFile
Но я не уверен что тебе это потребуется. Давай пока без этого попробуем сделать.
Лол, я сейчас проверил, все прекрасно открывается с любым расширением. И <img> работает и <video> и судя по всему <audio> тоже. Так что проблем вроде бы с этим нет и с заголовками заморачиваться не придется. Это радует!
Ах да, тут еще такой вопрос. А если я захочу выводить EXIF и прочую инфу по некоторым файлам, то функциям похуй на расширение файла или нет?
-более менее знание синтаксиса
-замыкание
-некоторые особенности работы языка
-понял смысл ДОМ но пока без гугла в нём никак
-разобрался с событиями, но часто тоже надо гуглить ту или иную проблему
-Разобрал jQuery, написал на нём выпадающее меню и слайдер, более менее запомнил синтаксис этого фреймворка.
Хватит ли мне этих знаний для получения должности ПХП джуниора, по умолчанию предпологаем что мои скилы в ПХП должного уровня для этой должности.
Зависит от города конечно, но думаю хватит. Ничего плохого в том, чтобы лезть в гугл восполнить пробел в знаниях нет. Главное это принцип работы и возможности языка понимать, а остальное со временем и опытом работы придет.
>В моему уроке про список студентов описано: https://github.com/codedokode/pasta/blob/master/student-list.md#mvc
Странно, к чему он >>498601 тогда написал мне про MVC к моему https://github.com/Si0n/register3 , где у меня несоответствие с MVC?
как можно создать таблицы динамически? чтобы чел нажал кнопку - создалась таблица под его данные.
не нужно так делать, таблицы создают разработчики. Данные пользователей гораздо удобнее хранить в одной таблице.
Кстати, у нас в ОП посте есть неплохие задачки на SQL если ты хочешь улучшить свои знания.
смотри, я пишу простую борду с нуля, я поместил шапки тредов в ОДНУ таблицу изначально (выводятся последовательно на нулевой). Куда мне их ответы-то помещать, чтобы тоже по порядку выводились к каждому треду? единственный выход вижу - создавать к каждому новую таблицу при создании треда, новую таблицу к каждой строке-треду.
В одну таблицу. Тебе рано еще борды писать, тебе надо SQL и базы данных изучить сначала, я чувствую ты там дров наломаешь.
Почитай про внешние ключи. У поста надо указвыать к какому треду он относится.
И про нормализацию в БД. Никто не создает кучу таблиц для однотипных данных.
мне удобнее и быстрее учиться на практике вместо муторного чтения многотомной воды. ставлю задачу -> точечно решаю параллельно гугля и читая. а так каша будет в голове и все забываться.
Про практику это правильно. Надо ж только начинать с простого и постепенно переходить к сложному.
У меня например запрос на получение ленты нулевой получился в 30 строк с тремя объединениями.
Так что решай простые задачи. У опа как раз мало теории (к сожалению), но много выносящих мозг задач.
https://gist.github.com/codedokode/10539213#%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE-%D0%BB%D0%B0%D0%B9%D0%BA%D0%B8
Практика это хорошо, но в твоем случае надо изучать правильные подходы сначала. Например ты не должен делать связи между таблицами не почитав про внешние ключи, и ты не должен проектировать таблицы не почитав про нормализацию. Это не так и много материала.
Тебе надо почитать туториалы (например из задачек по SQL, там есть «SQL для начинающих» в 3 частях: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html ), а также какую-нибудь статью по нормализации вроде:
http://club.shelek.ru/viewart.php?id=311
http://habrahabr.ru/post/193756/
http://www.gaps.tstu.ru/win-1251/lab/sreda/saoi/lect_g2.html
Ну и про внешние ключи так как они нужны в твоей задаче: http://denis.in.ua/foreign-keys-in-mysql.htm
Туториалы написаны простым языком и никакой воды там нет. Я же отправляю тебя не реляционную алгебру изучать, а основы SQL, которые любой должен знать. И не многотомные книги, а всего несколько статей. Ну сам посмотри, ты даже не знаешь что посты можно в одной таблице хранить.
Я видел примеры кода которые писали нелюбители читать теорию, и я не собираюсь это поощрять.
> У меня например запрос на получение ленты нулевой получился в 30 строк с тремя объединениями.
Так надо после этого денормализацию сделать и будет норм.
Алсо если ты делаешь несколько связанных запросов (например создать тред и добавить в него пост), то придется еще прочитать про транзакции в БД.
я уже отказался от той библиотеки, так как она очень медленная о сравнению с простым чистым php. Я в итоге её возможности использовал на 10% или типа того, но получались огромные тормознутые объекты.
Беру содержимое страницы просто через file_get_contents();
Из необходимого - уметь читать чужой говнокод и быстро его править.
Знать *nix и уметь его готовить
PHPUnit или Selenium
Postges only
Зп от 1000 USD шлите ваши гитхабы и резюме на yanchurova.ela (собака) mail.ru
Почему бы нет? Нагрузка знаешь какая бывает? по 10М хитов и твой любимый Apache с mod_php ложится моментально, а ты еще наверное любитель файлового кеширования. Проходи мимо петушок
Любая твоя наработка в highload может стать твоим отдельным проектом на том же гитхаб
В РФ все по белому
Решение
http://codepen.io/anon/pen/oXGXyv
за такое сразу обоссут или потом?
1000 долларов? Решай все наши задачки из Оп поста, изучай сифмони и я думаю до такой зарплаты тебе недолго будет расти.
>>498975
Что-то я сомневаюсь что именно Апач от 10М хитов ляжет, там же основная нагрузка на php придется. Ну и для 10М хитов нужно железо нормальное и не один сервер.
А работа демотивирующая, согласен, на эти мерзкие тела весь день смотреть.
10М у нас крутится на одном серваке без проблем. Мамкин хайлоадер?
На телеса смотреть не придется
> typeof(start) == 'undefined' ? count = 0: count = start;
Это замаскированный if, раз так то надо if и использовать. Или переписать как
count = (start === undefined) ? .. : ..;
Или даже так:
var count = start || 0;
typeof не нужен для проверки на undefined, зачем?
> consoleDiv = document.getElementById('console');
Это конечно твое дело, но не проще ли открыть консоль в браузере?
А так, сама идея решения правильная.
Про undefined взял тут http://javascript.ru/typeof спросив у гугла "javascript существование переменной"
Это
> consoleDiv = document.getElementById('console');
тоже нагуглил дабы сразу выводить в окошко результата.
ЧТо-то я не пойму, как функция запоминает, какие ей аргументы передавали в прошлый раз?
мимо не шарящий в жс
> javascript существование переменной
Верно, typeof в отличие от прямого сравнения не выдаст ошибки если переменная не существует. Но можем ли мы встретить ситуацию где переменная может не суещствовать? Разве хороший программист станет писать такой код? Конечно, нет. значит и проверять существует ли переменная, не требуется, достаточно сравнить ее с undefined.
> дабы сразу выводить в окошко результата.
Можешь выводить так, если тебе удобнее, но вообще можно открыть консоль отладчика Ctrl + SHift + J и смотреть там, не тратя время на написание кода. Там же кстати можно и кусочки кода тестировать.
Замыкание, функция в момент создания запоминает ссылки на переменные снаружи нее: https://learn.javascript.ru/closures
Спасибо, я вчера всё таки нагуглил позиционирование в бутстрапе и изучил, после этого переоформил полностью сайт студентов и теперь выглядит не так стремно как раньше.
и ищо, сложно сразу учиться и в фронтед писать и в бэкенд? А то вон, вконтактерские макаки умеют и в пьюрпэхэпэ и на всяких модных жс фреймворках пилить приложухи)
http://ideone.com/ntjAXj
Какая нахуй копия? Там нужно настроить при помощи модуля апача mod_rewrite, чтобы файл с сервера dirtyporn123.mp4.txt отдавался браузером как dirtyporn123.mp4
Учи mod_rewrite, крутая штука. Суть в том, что пользователь запрашивает урл, которого может быть даже не существует, например download/dirtyporn123.mp4, а сервер отдает ему урл upload/dirtyporn123.mp4.txt
Я тоже делаю файлообменник, вечером выложу можешь подсмотреть у меня.
Схема такая:
1. Пользователь закачивает файл на сервер, например movie123.mp4.
2. Я этот файл сохраняю по формуле id_original.name.txt. Расширение txt для безопасности, а айдишник для уникальности, чтобы файлы под одинаковым именем не затирали друг друга. Получаем 18341_movie123.mp4.txt
3. Теперь когда пользователь захочет забрать себе обратно этот файл, я же ему должен вернуть под оригинальным именем. Делаю ссылку на скачивание:
<a href="download/18341/movie123.mp4">скачать</a>
4. Содержимое .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/download/.+$
RewriteRule ^ index.php
5. В маршрутизаторе (я использую слим), под соответствующий урл выкинуть заголовки
$app->get('/download/:id/:name', function ($id, $name) use ($app) {
if (file_exists("upload/{$id}_{$name}.txt")) {
\theader("Content-Disposition: attachment; filename={$name}");
\theader("Location: http://mydomain.com/download/{$name}");
}else{echo 'Запрашиваемый файл не найден.';}
});
Подмена url через mod_rewrite + редирект на искомый файл это не слишком кривое решение? У меня жопыта нет, поэтому я не могу судить, насколько это рационально.
Нет, говно какое-то получается.
Блин, как апачу подсунуть заголовок "Content-disposition", минуя php? Потому что это ебланство отдавать файлы через readfile.
Мне всего-то осталось сделать, чтобы при запросе изображения оно открывалось не в окне браузера, а сохранялось на диск.
>Я выше тебе написал что для отдачи файлов надо либо использовать трюк с переписыванием URL (заголовок Content-Disposition attachemnt этим файлам можно добавить отдельным htaccess)
А, в htaccess можно еще и заголовки засовывать. Интересно. Осталось выяснить, как это сделать.
(извиняюсь за невнимательность.)
ХТМЛ
Миниатюры:
<div id="gallery">
<a href="img/galer/big/01.jpg" id="photo"><img src="img/galer/small/01.jpg"></a>
<a href="img/galer/big/02.jpg" id="photo"><img src="img/galer/small/02.jpg"></a>
<a href="img/galer/big/03.jpg" id="photo"><img src="img/galer/small/03.jpg"></a>
</div>
Скрытая картинка:
<img id="image" src="">
JQUERY:
$("a#photo").on("click", function(event) {
event.preventDefault(); //Прерываем переход по ссылке
$("#image").css("display", "block"); //Делаем скрытую картинку видимой src пока пустой
$("#hover").css("display", "block"); //Делаем подкладку которая затемняет фон видимой
var src = $(this).attr("href"); //Узнаем адрес большой картинки который хранится в href миниатюры
$("#image").attr("src", src); //Назначаем картинки в src полученный адрес строкой выше
});
$("#hover").on("click", function() { //Возвращает всё взад при нажатии на задний фон
$("#image").css("display", "");
$("#hover").css("display", "");
});
Проблема в том что у меня не удаётся центровать картинку, если она не подходящего размера, использую вот этот ксс для image
#image {
display: none;
z-index: 999;
position: absolute;
top: 50%;
left: 50%;
margin-left: -350px;
margin-top: -250px;
border:3px solid #6495ED;
}
Кажется основная проблема в этом моменте:
margin-left: -350px;
margin-top: -250px;
Я не знаю как выставить эти значения что бы они подходили автоматически для всех размеров, явно там должно быть что то не числовое. Пока единственная мысль каким-то брать атрибуты у получаемых картинок и на основе их прописывать отступы, сам ксс я не очень знаю жти стили подсмотрел
ХТМЛ
Миниатюры:
<div id="gallery">
<a href="img/galer/big/01.jpg" id="photo"><img src="img/galer/small/01.jpg"></a>
<a href="img/galer/big/02.jpg" id="photo"><img src="img/galer/small/02.jpg"></a>
<a href="img/galer/big/03.jpg" id="photo"><img src="img/galer/small/03.jpg"></a>
</div>
Скрытая картинка:
<img id="image" src="">
JQUERY:
$("a#photo").on("click", function(event) {
event.preventDefault(); //Прерываем переход по ссылке
$("#image").css("display", "block"); //Делаем скрытую картинку видимой src пока пустой
$("#hover").css("display", "block"); //Делаем подкладку которая затемняет фон видимой
var src = $(this).attr("href"); //Узнаем адрес большой картинки который хранится в href миниатюры
$("#image").attr("src", src); //Назначаем картинки в src полученный адрес строкой выше
});
$("#hover").on("click", function() { //Возвращает всё взад при нажатии на задний фон
$("#image").css("display", "");
$("#hover").css("display", "");
});
Проблема в том что у меня не удаётся центровать картинку, если она не подходящего размера, использую вот этот ксс для image
#image {
display: none;
z-index: 999;
position: absolute;
top: 50%;
left: 50%;
margin-left: -350px;
margin-top: -250px;
border:3px solid #6495ED;
}
Кажется основная проблема в этом моменте:
margin-left: -350px;
margin-top: -250px;
Я не знаю как выставить эти значения что бы они подходили автоматически для всех размеров, явно там должно быть что то не числовое. Пока единственная мысль каким-то брать атрибуты у получаемых картинок и на основе их прописывать отступы, сам ксс я не очень знаю жти стили подсмотрел
>
>Знать nix и уметь его готовить
>
>PHPUnit или Selenium
>
>Postges only
А расшифруйте, что это?
нюфаня*
Если тебе нужно это расшифровывать - то ты очевидно им не подходишь.
Вроде бы логически должно работать, но почему-то не работает.
https://ideone.com/rcLVLK
Array_flip возвращает массив, который не записывается ни в какую переменную. Или ты думаешь он меняет оригинальный массив, только потому-что ты передал его как аргумент в функцию?
Понял, починил, спасибо.
Если скачать с сайта getid3.org и прописать руками загрузку основного класса, то вроде работает.
Но я воннаби продвинутый, пытаюсь уже все ставить через композер.
Зашел на packagist.org, вбил в поиск, выдало несколько разных пакетов. https://packagist.org/search/?q=getid3
Какой ставить? Поставил первый, у которого больше всего скачиваний - phansys/getid3
Поставил при помощи команды composer require phansys/getid3.
Выдает две ошибки. Там упоминается слим. Может они конфликтуют?
[Thu Jun 18 21:40:00.258281 2015] [:error] [pid 4930] [client 127.0.0.1:37278] PHP Warning: Uncaught exception 'ErrorException' with message 'require_once(/home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/getid3.php): failed to open stream: No such file or directory' in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php:1571\nStack trace:\n#0 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php(1571): Slim\\Slim::handleErrors(2, 'require_once(/h...', '/home/inside/ww...', 1571, Array)\n#1 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php(1571): GetId3_Lib_Helper::GetDataImageSize()\n#2 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Module/Graphic/Jpg.php(45): GetId3_Lib_Helper::GetDataImageSize('??????JFIF?????...', Array)\n#3 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/GetId3.php(471): GetId3_Module_Graphic_Jpg->Analyze()\n#4 /home/inside/www/home/test2/index.php(11): GetId3_GetId3->analyze('004.jpg')\n#5 [internal function]: {closure}()\n#6 /home/inside/www/home/test2/vendor/slim/slim/Slim/Route.php(468): call_u in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php on line 1571
[Thu Jun 18 21:40:00.394276 2015] [:error] [pid 4930] [client 127.0.0.1:37278] PHP Fatal error: GetId3_Lib_Helper::GetDataImageSize(): Failed opening required '/home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/getid3.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php on line 1571
Если скачать с сайта getid3.org и прописать руками загрузку основного класса, то вроде работает.
Но я воннаби продвинутый, пытаюсь уже все ставить через композер.
Зашел на packagist.org, вбил в поиск, выдало несколько разных пакетов. https://packagist.org/search/?q=getid3
Какой ставить? Поставил первый, у которого больше всего скачиваний - phansys/getid3
Поставил при помощи команды composer require phansys/getid3.
Выдает две ошибки. Там упоминается слим. Может они конфликтуют?
[Thu Jun 18 21:40:00.258281 2015] [:error] [pid 4930] [client 127.0.0.1:37278] PHP Warning: Uncaught exception 'ErrorException' with message 'require_once(/home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/getid3.php): failed to open stream: No such file or directory' in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php:1571\nStack trace:\n#0 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php(1571): Slim\\Slim::handleErrors(2, 'require_once(/h...', '/home/inside/ww...', 1571, Array)\n#1 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php(1571): GetId3_Lib_Helper::GetDataImageSize()\n#2 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Module/Graphic/Jpg.php(45): GetId3_Lib_Helper::GetDataImageSize('??????JFIF?????...', Array)\n#3 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/GetId3.php(471): GetId3_Module_Graphic_Jpg->Analyze()\n#4 /home/inside/www/home/test2/index.php(11): GetId3_GetId3->analyze('004.jpg')\n#5 [internal function]: {closure}()\n#6 /home/inside/www/home/test2/vendor/slim/slim/Slim/Route.php(468): call_u in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php on line 1571
[Thu Jun 18 21:40:00.394276 2015] [:error] [pid 4930] [client 127.0.0.1:37278] PHP Fatal error: GetId3_Lib_Helper::GetDataImageSize(): Failed opening required '/home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/getid3.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php on line 1571
Поставил композером другую версию getId3 под названием https://packagist.org/packages/james-heinrich/getid3
Тут ошибка проще: тупо не работает автозагрузка.
Причем другие вещи типа слима композер подгружает, а getid3 - нет.
[Thu Jun 18 21:58:30.605989 2015] [:error] [pid 3908] [client 127.0.0.1:37379] PHP Fatal error: Class 'GetId3' not found in /home/inside/www/home/test2/index.php on line 8
Ладно, я тогда пока руками прикручу эту шнягу, а там посмотрим.
Да надо уметь в индексы pgSQL
В php для этого есть встроенная функция.
Посмотреть список функций для работы с массивами можно на сайте http://php.net/manual/ru/ref.array.php
if($_GET['x'] != 1)
return false;
на локалке работает, на сервере всегда возвращает false
if($_GET['x'] != 1){
return false;
}
работает везде
> мы изучаем язык PHP (а также JS/CSS/HTML/SQL)
> SQL
О, мне к вам.
Есть два запроса, select1 выдаёт таблицу (id:1, 2), select2 выдаёт таблицу (id:1, 3).
Как мне в одном запросе, содержащем оба селекта реализовать следующее - надо, чтобы вывелось только то значение из первой таблицы, которое не продублировано во второй?
То есть 1 есть в обеих, значит выводится только 2.
Мне интересно, откуда все это идет, разделение на бекенд и фронтенд, разговоры про то какой сложный JS (или PHP)? Я все время вижу как аноны пытаются избежать изучения какой-нибудь нужной вещи под этим предлогом. По моему это все идет от лени и как вы наверно догадыветесь, в нашем треде такие настроения не одобряются.
Чтобы научиться верстать/править верстку не нужно прикладывать сверхусилия. Изучить HTMl/CSS можно неспешно за 3-4 недели решая наши задачки. Изучить JS/DOM/jQuery на базовом уровне можно за месяц-два, а потом уже когда-нибудь позже подтягивать до хорошего уровня.
А те, кто заводят эти разговоры, по моему просто ленятся. Они наверно думают, что достаточно прочесть несколько статей, порешать задачки пару недель и готов новый джуниор. Как бы не так! На любую другую специальность вам надо учиться либо несколько лет в техникуме, либо в университете. Почему программист должен прикладывать меньше усилий?
Конечно, ситуация такая, что на рынке труда пока спрос относительно выше чем предложение. Вдобавок не совсем дружественные нам страны переманивают самых умных, тряся мешками с деньгами. Несчастные работодатели готовы брать любого, кто способен сделать простое приложение, знаком с каким-нибудь фрйемворком и не шарахается от классов, объектов и MVC. Потому годами учиться не требуется. Но усилия приложить все же придется, чтобы выглядеть лучше других кандидатов.
Тут конечно придирчивый анон заметит, что разделение на бекендщиков и фронтендщиков/верстальщиков во многих компаниях все же есть. Но оно делается не потому, что работодатель проникся снисхождением к вашей лени. Просто обычно за верстку страниц платят меньше чем за программирование, и выгоднее эту задачу поручить отдельному верстальщику (вдобавок на рынке их проще найти). А когда мы говорим «фронтенд-специалист» мы имеем в виду не верстальщика, а человека который способен например сделать single-page приложение на каком-нибудь JS фреймворке или мобильное HTML приложение с использованием Cordova, то есть который на высоком уровне знает клиентсайдные технологии (на самом деле нет, все эти приложения тормозят, трясутся и дергаются так что я сильно сомневаюсь в способностях тех, кто их пишет).
Но все равно на мой взгляд гораздо ценнее знать и JS и PHP.
Мне интересно, откуда все это идет, разделение на бекенд и фронтенд, разговоры про то какой сложный JS (или PHP)? Я все время вижу как аноны пытаются избежать изучения какой-нибудь нужной вещи под этим предлогом. По моему это все идет от лени и как вы наверно догадыветесь, в нашем треде такие настроения не одобряются.
Чтобы научиться верстать/править верстку не нужно прикладывать сверхусилия. Изучить HTMl/CSS можно неспешно за 3-4 недели решая наши задачки. Изучить JS/DOM/jQuery на базовом уровне можно за месяц-два, а потом уже когда-нибудь позже подтягивать до хорошего уровня.
А те, кто заводят эти разговоры, по моему просто ленятся. Они наверно думают, что достаточно прочесть несколько статей, порешать задачки пару недель и готов новый джуниор. Как бы не так! На любую другую специальность вам надо учиться либо несколько лет в техникуме, либо в университете. Почему программист должен прикладывать меньше усилий?
Конечно, ситуация такая, что на рынке труда пока спрос относительно выше чем предложение. Вдобавок не совсем дружественные нам страны переманивают самых умных, тряся мешками с деньгами. Несчастные работодатели готовы брать любого, кто способен сделать простое приложение, знаком с каким-нибудь фрйемворком и не шарахается от классов, объектов и MVC. Потому годами учиться не требуется. Но усилия приложить все же придется, чтобы выглядеть лучше других кандидатов.
Тут конечно придирчивый анон заметит, что разделение на бекендщиков и фронтендщиков/верстальщиков во многих компаниях все же есть. Но оно делается не потому, что работодатель проникся снисхождением к вашей лени. Просто обычно за верстку страниц платят меньше чем за программирование, и выгоднее эту задачу поручить отдельному верстальщику (вдобавок на рынке их проще найти). А когда мы говорим «фронтенд-специалист» мы имеем в виду не верстальщика, а человека который способен например сделать single-page приложение на каком-нибудь JS фреймворке или мобильное HTML приложение с использованием Cordova, то есть который на высоком уровне знает клиентсайдные технологии (на самом деле нет, все эти приложения тормозят, трясутся и дергаются так что я сильно сомневаюсь в способностях тех, кто их пишет).
Но все равно на мой взгляд гораздо ценнее знать и JS и PHP.
Ошибки:
> ("Location: http://mydomain.com/download/{$name}");
Это редирект, то есть ты сообщаешь браузеру что искомый ресурс (ресурсом в HTTP называют все, к чему можно слать запросы, то есть файл или страница) находится по другому адресу и он должен сделать новый запрос.
Твой заголовок Content-Disposition в новом запросе уже никак не участвует.
Но ведь проще тогда сразу это ссылку вставить на странцу скачивания, зачем редирект? Будет то же самое.
> filename={$name}
Я уже кажется писал, что для свойства filename не определена кодировка и надежно работает там только латинница, русские буквы разные браузеры понимают по разному (я это экспериментально проверял сам).
И все равно каждый второй анон пытается использовать этот заголовок. Кто интересно эту неправильную идею в интернет выложил не предупредив про кодировки? Наверняка американцы, они же русские буквы не используют и им без разницы какая кодировка.
Не так давно правда придумали стандарт для указания кодировки заголовков: http://tools.ietf.org/html/rfc5987 (англ)
Имя файла по нему можно указать как
filename*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates
то есть мы указываем кодировку и испльзуем процентное кодирование для нелатинских символов, как в URL.
Но я бы преостерег от его использования. Это новый стандарт и его мало кто поддерживает и его рано использовать. Какой-нибудь ИЕ9 скорее всего его не поддержит.
Потому на мой взгляд свойство filename пока не работает и пока надо составлять URL так чтобы они заканчивались на желаемое имя. А что отдавать по этому URL определяем мы сами настройками в htaccess.
Посмотрите как сделано скачивание на rghost. Там ссылка имеет вид
http://rghost.ru/download/45000175/2f39af9cfaff0ae14f93a34dd89ec613b14c9dde/archive.ipq.co.v4.zip
То есть как видите содержит номер файла, хеш (для защиты от роботов) и имя файла в конце, которое браузер подставляет в диалог скачивания.
А заголовок Content-Disposition: attachment (который говорит браузеру сохранить файл) можно навесить через htaccess размещенный в определенной папке:
Header add Name Value
Вы можете применить эту директиву только к определенным файлам по имени (по регулярке):
<FilesMatch "\.txt$">
Header add Name Value
</FilesMatch>
Документация на англ: http://httpd.apache.org/docs/current/mod/mod_headers.html
Ой, что-то я на «вы» пишу. Ну да ладно, это наверно не одному анону интересно будет.
Ошибки:
> ("Location: http://mydomain.com/download/{$name}");
Это редирект, то есть ты сообщаешь браузеру что искомый ресурс (ресурсом в HTTP называют все, к чему можно слать запросы, то есть файл или страница) находится по другому адресу и он должен сделать новый запрос.
Твой заголовок Content-Disposition в новом запросе уже никак не участвует.
Но ведь проще тогда сразу это ссылку вставить на странцу скачивания, зачем редирект? Будет то же самое.
> filename={$name}
Я уже кажется писал, что для свойства filename не определена кодировка и надежно работает там только латинница, русские буквы разные браузеры понимают по разному (я это экспериментально проверял сам).
И все равно каждый второй анон пытается использовать этот заголовок. Кто интересно эту неправильную идею в интернет выложил не предупредив про кодировки? Наверняка американцы, они же русские буквы не используют и им без разницы какая кодировка.
Не так давно правда придумали стандарт для указания кодировки заголовков: http://tools.ietf.org/html/rfc5987 (англ)
Имя файла по нему можно указать как
filename*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates
то есть мы указываем кодировку и испльзуем процентное кодирование для нелатинских символов, как в URL.
Но я бы преостерег от его использования. Это новый стандарт и его мало кто поддерживает и его рано использовать. Какой-нибудь ИЕ9 скорее всего его не поддержит.
Потому на мой взгляд свойство filename пока не работает и пока надо составлять URL так чтобы они заканчивались на желаемое имя. А что отдавать по этому URL определяем мы сами настройками в htaccess.
Посмотрите как сделано скачивание на rghost. Там ссылка имеет вид
http://rghost.ru/download/45000175/2f39af9cfaff0ae14f93a34dd89ec613b14c9dde/archive.ipq.co.v4.zip
То есть как видите содержит номер файла, хеш (для защиты от роботов) и имя файла в конце, которое браузер подставляет в диалог скачивания.
А заголовок Content-Disposition: attachment (который говорит браузеру сохранить файл) можно навесить через htaccess размещенный в определенной папке:
Header add Name Value
Вы можете применить эту директиву только к определенным файлам по имени (по регулярке):
<FilesMatch "\.txt$">
Header add Name Value
</FilesMatch>
Документация на англ: http://httpd.apache.org/docs/current/mod/mod_headers.html
Ой, что-то я на «вы» пишу. Ну да ладно, это наверно не одному анону интересно будет.
Погугли про центрирование в CSS. Там есть несколько способов, надо найти их все, сравнить достоинства и недостатки и выбрать лучший. Также, что ты будешь делать если картинка окажется больше размера страницы?
Центрировать можно средствами CSS, а вот решить проблему больших картинок удобнее яваскриптом.
Тут есть такие подводные камни:
— мобильные устройства. На них пальцами можно увеличивать масштаб и таскать по экрану, и твой скрипт не должен мешать увеличить нужную часть картинки.
— в интернете можно найти неправильный код определения размеров окна или экрана. Чтение документации MDN (по DOM свойствам clientWidth/scrollWidth/offsetWidth) и jQuery (методы width()/outerWidth()) поможет этого избежать.
— проблема больших картинок. Я могу захотеть просмотреть ее в большом размере, пусть даже придется прокручивать
— я не люблю просмотрщики. Мне открыть картинку без всего в отдельной вкладке удобнее, я могу открыть так несколько картинок сразу, браузер сам выставит удобный размер, это не блокирует мне страницу (это важный момент!), я могу одной кнопкой сохранить эту картинку. Почему ты зараза хочешь лишить меня этого удобства и заставить пользоваться твоим кривым скриптом? Надо давать пользователям возможности, а не отбирать их (справедливости ради, неграмотному пользователю просмотрщик может быть удобнее чем непонятное для него открытие каких-то вкладок).
В общем я бы советовал тебе найти хороший просмотрщик, который пилят уже много лет и в котором исправлены все воозможные косяки, и взять его (или изучить его код). Ты вряд ли один можешь быстро сделать такой же объем работы.
Это ужасно:
> $("#image").css("display", "block");
зачем ты пишешь CSS в яваскрипт-коде? CSS надо писать в CSS файлах, а скрипт может просто добавить один класс.
> $("a#photo")
То есть у тебя на странице может быть максимум одна превьюшка?
> id="photo"
> id="photo
id не могут повторятся. Это плохо, что ты не изучив даже HTML берешься за написание таких сложных вещей как просмотрщик картинок.
Алсо id в верстке лучше вообще не исопльзовать, они из-за этой особенности неудобны.
> Кажется основная проблема в этом моменте:
Если ты не знаешь CSS, а скопировал это из сети, то это плохая идея. Лучше изучить CSS.
Также, если у тебя есть много времени и ты хочешь лучше выучить JS (и не писать CSS стили в коде), то можешь порешать наши задачки из оп-поста.
>>499155
Он не поможет тут, так как нужно вертикальное центрирование.
>>499201
nix значит linux
Postgres это движок SQL-базы данных
PHPUnit это фреймворк для юнит тестов (урок про тесты: https://gist.github.com/codedokode/a455bde7d0748c0a351a )
Selenium это набор драйверов для браузеров, позволяющий управлять ими и тестировать сайты
Странно, кстати, что они не используют codeception, на нем интерфейсные тесты пишутся удобнее (и что важно, один тест можно запустить как через selenium так и через PhpBrowser без яаскрипта или даже через плагин вызвающий контроллеры фрйемворка напрямую), хотя конечно он сыроват и мне пришлось допиливать их модули для себя, и написать штуку для сбора логов с сервера. Ну и я использовал phantomjs c ghostdriver так как он не занимает место на экране и его удобно запускать/останавливать перед тестами.
Если кто-то захочет это изучать, я могу придумать задание.
Погугли про центрирование в CSS. Там есть несколько способов, надо найти их все, сравнить достоинства и недостатки и выбрать лучший. Также, что ты будешь делать если картинка окажется больше размера страницы?
Центрировать можно средствами CSS, а вот решить проблему больших картинок удобнее яваскриптом.
Тут есть такие подводные камни:
— мобильные устройства. На них пальцами можно увеличивать масштаб и таскать по экрану, и твой скрипт не должен мешать увеличить нужную часть картинки.
— в интернете можно найти неправильный код определения размеров окна или экрана. Чтение документации MDN (по DOM свойствам clientWidth/scrollWidth/offsetWidth) и jQuery (методы width()/outerWidth()) поможет этого избежать.
— проблема больших картинок. Я могу захотеть просмотреть ее в большом размере, пусть даже придется прокручивать
— я не люблю просмотрщики. Мне открыть картинку без всего в отдельной вкладке удобнее, я могу открыть так несколько картинок сразу, браузер сам выставит удобный размер, это не блокирует мне страницу (это важный момент!), я могу одной кнопкой сохранить эту картинку. Почему ты зараза хочешь лишить меня этого удобства и заставить пользоваться твоим кривым скриптом? Надо давать пользователям возможности, а не отбирать их (справедливости ради, неграмотному пользователю просмотрщик может быть удобнее чем непонятное для него открытие каких-то вкладок).
В общем я бы советовал тебе найти хороший просмотрщик, который пилят уже много лет и в котором исправлены все воозможные косяки, и взять его (или изучить его код). Ты вряд ли один можешь быстро сделать такой же объем работы.
Это ужасно:
> $("#image").css("display", "block");
зачем ты пишешь CSS в яваскрипт-коде? CSS надо писать в CSS файлах, а скрипт может просто добавить один класс.
> $("a#photo")
То есть у тебя на странице может быть максимум одна превьюшка?
> id="photo"
> id="photo
id не могут повторятся. Это плохо, что ты не изучив даже HTML берешься за написание таких сложных вещей как просмотрщик картинок.
Алсо id в верстке лучше вообще не исопльзовать, они из-за этой особенности неудобны.
> Кажется основная проблема в этом моменте:
Если ты не знаешь CSS, а скопировал это из сети, то это плохая идея. Лучше изучить CSS.
Также, если у тебя есть много времени и ты хочешь лучше выучить JS (и не писать CSS стили в коде), то можешь порешать наши задачки из оп-поста.
>>499155
Он не поможет тут, так как нужно вертикальное центрирование.
>>499201
nix значит linux
Postgres это движок SQL-базы данных
PHPUnit это фреймворк для юнит тестов (урок про тесты: https://gist.github.com/codedokode/a455bde7d0748c0a351a )
Selenium это набор драйверов для браузеров, позволяющий управлять ими и тестировать сайты
Странно, кстати, что они не используют codeception, на нем интерфейсные тесты пишутся удобнее (и что важно, один тест можно запустить как через selenium так и через PhpBrowser без яаскрипта или даже через плагин вызвающий контроллеры фрйемворка напрямую), хотя конечно он сыроват и мне пришлось допиливать их модули для себя, и написать штуку для сбора логов с сервера. Ну и я использовал phantomjs c ghostdriver так как он не занимает место на экране и его удобно запускать/останавливать перед тестами.
Если кто-то захочет это изучать, я могу придумать задание.
Нет. Такое ощущение складывается только из-за большой пиар-активности фанатиков постгреса которые в каждом обсуждении не забывают его пиарить. Википедия и многие другие сайты использует mysql, первая версия вконтакте ее использовала, хотя постгрес тоже база неплохая, но она пытается привлечь большим количеством фич и возможностей, а mysql проще и в ней хороший и быстрый (насчет быстрый, с постгресовскими движками не сравгивал и даже не знаю как они устроены) InnoDB.
>>499250
От автора этот: james-heinrich/getid3
Этот я не использовал, но наверно он тоже пойдет: phansys/getid3 (там в описании написано что код приведен к современным стандартам, это хорошо)
> Там упоминается слим. Может они конфликтуют?
Это стектрейс, то есть последовательность вызовов, какая функция какую вызвала прежде чем произошла ошибка, его надо отформатировать чтобы читать:
PHP Warning:
Uncaught exception 'ErrorException' with message 'require_once(/home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/getid3.php): failed to open stream: No such file or directory' in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php:1571
Stack trace:
#0 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php(1571): Slim\\Slim::handleErrors(2, 'require_once(/h...', '/home/inside/ww...', 1571, Array)
#1 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php(1571): GetId3_Lib_Helper::GetDataImageSize()
#2 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Module/Graphic/Jpg.php(45): GetId3_Lib_Helper::GetDataImageSize('??????JFIF?????...', Array)
#3 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/GetId3.php(471): GetId3_Module_Graphic_Jpg->Analyze()
#4 /home/inside/www/home/test2/index.php(11): GetId3_GetId3->analyze('004.jpg')
#5 [internal function]: {closure}()
#6 /home/inside/www/home/test2/vendor/slim/slim/Slim/Route.php(468): call_u
in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php on line 1571 (это не часть стектрейса а относится к сообщению об ошибке сверху)
Читать стектрейс надо в данном случае снизу вверх. Как видишь, какая-то функция в Слиме call_u (#6) вызвала анонимную функцию (#5) на 11-й строчке в index.php, это твоя функция-обработчик, она вызвала GetId3_GetId3->analyze('004.jpg'), та вызвала GetId3_Module_Graphic_Jpg->Analyze(), та вызвала GetId3_Lib_Helper::GetDataImageSize('??????JFIF?????...', Array) где в первом аргументе мы видим бинарные данные из начала JPEG файла, та вызвала GetId3_Lib_Helper::GetDataImageSize() где попыталась подключить какой-то файл которого у тебя не было.
Это вызвало ошибку, слимовский обработчик ошибок перехватил ее (#0, Slim\\Slim::handleErrors), выбросил исключение которое записалось в лог и прервало работу скрипта.
Заметь что сама библиотека GetID3 подключилась, так как ты смог вызвать метод из нее, а вот один из ее файлов, который ей нужен, не нашелся, вот этот файл:
/home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/getid3.php
Проверь-ка, есть ли такой файл или может есть похожий на него (но с другим регистром букв)? Я тут глянул в гитхаб автора и вижу что в папке Lib ничего такого нет:
https://github.com/phansys/GetId3/tree/2.1/Lib
Заглянем тогда в то место, откуда этот файл подключается, оно упомянуто в сообщении об ошибке:
> in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php:1571
Вот эта функция GetDataImageSize на гитхабе (номера строк другие, видимо автор уже что-то поменял в коде):
https://github.com/phansys/GetId3/blob/2.1/Lib/Helper.php#L1650
В ней нет никакого require_once, но зато есть
> $getid3_temp = new GetId3Core();
которая раньше выглядела как
> $getid3_temp = new GetId3();
Автозагрузчик в Слиме наверно пытался найти этот класс и подключить файл с соответствующим именем, что и вызвало ошибку.
То есть проблема в том что в твоей версии библиотеки был баг. ты можешь попробовать либо поставить в композере.json самую новую версию:
"phansys/getid3": "dev-master"
что мне не очень нравится так как она может быть еще более сырой. Никогда не используй для серьезных проектов версию вроде dev-master так как она самая нестабильная, это код который разработчик только что написал и толком не проверил. Тем более что тут как я понимаю, все еще в процессе доработки и может вообще не работать.
Потому ты можешь удалить эту версию и поставить оригинальную, старую, от автора:
https://packagist.org/packages/james-heinrich/getid3
Чтобы удалить библиотеку, используй команду remove: https://getcomposer.org/doc/03-cli.md#remove а потом install: https://getcomposer.org/doc/03-cli.md#install
Либо удали ее из composer.json, впиши туда новую и сделай composer update (по моему так проще).
Нет. Такое ощущение складывается только из-за большой пиар-активности фанатиков постгреса которые в каждом обсуждении не забывают его пиарить. Википедия и многие другие сайты использует mysql, первая версия вконтакте ее использовала, хотя постгрес тоже база неплохая, но она пытается привлечь большим количеством фич и возможностей, а mysql проще и в ней хороший и быстрый (насчет быстрый, с постгресовскими движками не сравгивал и даже не знаю как они устроены) InnoDB.
>>499250
От автора этот: james-heinrich/getid3
Этот я не использовал, но наверно он тоже пойдет: phansys/getid3 (там в описании написано что код приведен к современным стандартам, это хорошо)
> Там упоминается слим. Может они конфликтуют?
Это стектрейс, то есть последовательность вызовов, какая функция какую вызвала прежде чем произошла ошибка, его надо отформатировать чтобы читать:
PHP Warning:
Uncaught exception 'ErrorException' with message 'require_once(/home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/getid3.php): failed to open stream: No such file or directory' in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php:1571
Stack trace:
#0 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php(1571): Slim\\Slim::handleErrors(2, 'require_once(/h...', '/home/inside/ww...', 1571, Array)
#1 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php(1571): GetId3_Lib_Helper::GetDataImageSize()
#2 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Module/Graphic/Jpg.php(45): GetId3_Lib_Helper::GetDataImageSize('??????JFIF?????...', Array)
#3 /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/GetId3.php(471): GetId3_Module_Graphic_Jpg->Analyze()
#4 /home/inside/www/home/test2/index.php(11): GetId3_GetId3->analyze('004.jpg')
#5 [internal function]: {closure}()
#6 /home/inside/www/home/test2/vendor/slim/slim/Slim/Route.php(468): call_u
in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php on line 1571 (это не часть стектрейса а относится к сообщению об ошибке сверху)
Читать стектрейс надо в данном случае снизу вверх. Как видишь, какая-то функция в Слиме call_u (#6) вызвала анонимную функцию (#5) на 11-й строчке в index.php, это твоя функция-обработчик, она вызвала GetId3_GetId3->analyze('004.jpg'), та вызвала GetId3_Module_Graphic_Jpg->Analyze(), та вызвала GetId3_Lib_Helper::GetDataImageSize('??????JFIF?????...', Array) где в первом аргументе мы видим бинарные данные из начала JPEG файла, та вызвала GetId3_Lib_Helper::GetDataImageSize() где попыталась подключить какой-то файл которого у тебя не было.
Это вызвало ошибку, слимовский обработчик ошибок перехватил ее (#0, Slim\\Slim::handleErrors), выбросил исключение которое записалось в лог и прервало работу скрипта.
Заметь что сама библиотека GetID3 подключилась, так как ты смог вызвать метод из нее, а вот один из ее файлов, который ей нужен, не нашелся, вот этот файл:
/home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/getid3.php
Проверь-ка, есть ли такой файл или может есть похожий на него (но с другим регистром букв)? Я тут глянул в гитхаб автора и вижу что в папке Lib ничего такого нет:
https://github.com/phansys/GetId3/tree/2.1/Lib
Заглянем тогда в то место, откуда этот файл подключается, оно упомянуто в сообщении об ошибке:
> in /home/inside/www/home/test2/vendor/phansys/getid3/GetId3/Lib/Helper.php:1571
Вот эта функция GetDataImageSize на гитхабе (номера строк другие, видимо автор уже что-то поменял в коде):
https://github.com/phansys/GetId3/blob/2.1/Lib/Helper.php#L1650
В ней нет никакого require_once, но зато есть
> $getid3_temp = new GetId3Core();
которая раньше выглядела как
> $getid3_temp = new GetId3();
Автозагрузчик в Слиме наверно пытался найти этот класс и подключить файл с соответствующим именем, что и вызвало ошибку.
То есть проблема в том что в твоей версии библиотеки был баг. ты можешь попробовать либо поставить в композере.json самую новую версию:
"phansys/getid3": "dev-master"
что мне не очень нравится так как она может быть еще более сырой. Никогда не используй для серьезных проектов версию вроде dev-master так как она самая нестабильная, это код который разработчик только что написал и толком не проверил. Тем более что тут как я понимаю, все еще в процессе доработки и может вообще не работать.
Потому ты можешь удалить эту версию и поставить оригинальную, старую, от автора:
https://packagist.org/packages/james-heinrich/getid3
Чтобы удалить библиотеку, используй команду remove: https://getcomposer.org/doc/03-cli.md#remove а потом install: https://getcomposer.org/doc/03-cli.md#install
Либо удали ее из composer.json, впиши туда новую и сделай composer update (по моему так проще).
Ну нет, анон, что такое! Не сдавайся так быстро! Я помню, кто-то ее ставил и все работало.
> PHP Fatal error: Class 'GetId3' not found in /home/inside/www/home/test2/index.php on line 8
А правильно ли ты пишешь имя класса? В гитхабе он пишется по-другому:
https://github.com/JamesHeinrich/getID3/blob/master/getid3/getid3.php#L72
Имя класса важно писать в праивльном регистре букв так как имена файлов под линукс регистрозависимы, и classmap (соответствие имен классов и имени файла) который генерирует композер, по видиму тоже регистрозависим. Эта библиотека использует именно classmap, это видно из ее файла composer.json.
То есть самому PHP без разницы какой регистр букв, но вот автозагрузчику который ищет нужный файл, разница есть.
Ты конечно можешь сказать что это негуманно, заставлять человека помнить регистр букв. Да, верно, потому ты (и все другие программисты) в своем коде должен придерживаться единого стандарта именования классов, когда каждое слово пишется с большой буквы и тогда нам не придется запоминать где какая буква. Просто эта библиотека очень древняя, ей уже наверно больше 10 лет и тогда все писали как попало, потому у нее класс называется не по стандарту: class getID3
Кстати если использовать IDE, она бы наверно вывела подсказку по имени класса. Подумай, может стоит какую-нибудь установить?
Ну и надеюсь что из моих постов ты получил представление как можно искать причну ошибок. И понял что в программировании мелочи могут быть важными, компьютер не будет за тебя исправлять написание имени класса.
1. Освоить html и закрепить знания, написав на нем полноценный сайт на локалке. Собсна, развлекаюсь уже второй день, пилю двачи на html, кек.
2. Освоить СounterStrike:Sourse. Понятия не имею, что это и с чем едят и за какое время можно освоить. Знаю, что эта дрянь как-то связана с таблицами и стилем.
3. После всего этого начинать осваить сам пхп и параллельно управление БД.
Но в мою голову закрался вопрос по поводу JS. Он нужен для того, чтобы сайт был динамичным или даже интерактивным? Как его вклинить в план изучения? Учить параллельно со всем или нет?
HTML надо вместе с CSS учить, т.к. они неразрывно связаны. По сути HTML говорить браузеру ЧТО показывать, а CSS-стили КАК показывать. Советую пройти курс на сайте htmlacademy.ru, там все максимально доступно и наглядно показывается. Алсо, на HTML ты полноценный сайт не сделаешь. Просто набор статических страничек, не более.
JS да, позволяет странице динамически изменяться, добавляя различные эффекты, красивости и прочее. Учить можешь прям сразу после HTML/CSS или после PHP, как это сделал я. Особой разницы нет.
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $downloadName);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($serverNamePath));
readfile($serverNamePath);
die();
Норм вариант?
Вот пример кода:
[CODE]
if ( isset ( $_GET['show_order'] ) ){
//если была нажата ссылка "отметить обработанным"
if ( isset ( $_GET['mark_as_processed'] ) ) {
update_order ( $_GET['mark_as_processed'], 'Обработан' );
//не работает
add_action ( 'send_headers', function() { header ( 'Location: '.$_SERVER['HTTP_REFERER'] ); } );
//и этот вариант тоже
add_filter ( 'send_headers', function($headers) { $headers['Location'] = $_SERVER['HTTP_REFERER']; return $headers; } );
}
[/CODE]
решил заняться всей этой шляпой, какой ноут купить?
с какими характеристиками? что php, mysql, apach и иже с ними норм работали
ОП мне уже два раза писал не использовать filename='' внутри Content-Disposition >>499401 , тебя сейчас вообще ногой выебет.
потому что оно не работает с utf-8, то есть у тебя будут проблемы с названиями кириллицей.
>Скачку файла сделал без .htaccess
А таки почему тебе не нравится вариант с .htaccess? Mod_rewrite здесь самое кошерное решение с подменой имени файла.
Хочешь не хочешь, а придется учить этот модуль.
Суть в том, что сервер, получив урл определенного вида может подменить его и отдать пользователю тот ресурс, который хранится совсем под другим именем.
То есть у тебя идет запрос на mysite.com/download/originalName.jpg, а сервер подсовывает юзеру файл /upload/serverName.jpg.txt
Но браузер сохранит файл на компьютер пользователя под именем originalName.jpg
В этом вся фишка.
У меня в htaccess получилось нечто вроде:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/download/.+
RewriteRule ^ index.php [QSA]
RewriteCond %{REQUEST_URI} ^/download
RewriteRule download/(.+)/(.+)$ /upload/$1_$2.txt
Это чтобы ты понимал, что это, и как оно выглядит.
Почитать о mod_rewrite можно в документации Апача
http://httpd.apache.org/docs/current/mod/mod_rewrite.html
ОП дает статью http://habrahabr.ru/company/sprinthost/blog/129560/
Мне она не понравилась. Автор не объясняет основ, только дает какие-то сбивчивые советы.
Очень хороший видеокурс от O'Reilly http://rutracker.org/forum/viewtopic.php?t=5012266
Но тоже на английском языке, и автор использует минт, так что если ты все еще на винде, это может вызвать неудобства.
ОП мне уже два раза писал не использовать filename='' внутри Content-Disposition >>499401 , тебя сейчас вообще ногой выебет.
потому что оно не работает с utf-8, то есть у тебя будут проблемы с названиями кириллицей.
>Скачку файла сделал без .htaccess
А таки почему тебе не нравится вариант с .htaccess? Mod_rewrite здесь самое кошерное решение с подменой имени файла.
Хочешь не хочешь, а придется учить этот модуль.
Суть в том, что сервер, получив урл определенного вида может подменить его и отдать пользователю тот ресурс, который хранится совсем под другим именем.
То есть у тебя идет запрос на mysite.com/download/originalName.jpg, а сервер подсовывает юзеру файл /upload/serverName.jpg.txt
Но браузер сохранит файл на компьютер пользователя под именем originalName.jpg
В этом вся фишка.
У меня в htaccess получилось нечто вроде:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/download/.+
RewriteRule ^ index.php [QSA]
RewriteCond %{REQUEST_URI} ^/download
RewriteRule download/(.+)/(.+)$ /upload/$1_$2.txt
Это чтобы ты понимал, что это, и как оно выглядит.
Почитать о mod_rewrite можно в документации Апача
http://httpd.apache.org/docs/current/mod/mod_rewrite.html
ОП дает статью http://habrahabr.ru/company/sprinthost/blog/129560/
Мне она не понравилась. Автор не объясняет основ, только дает какие-то сбивчивые советы.
Очень хороший видеокурс от O'Reilly http://rutracker.org/forum/viewtopic.php?t=5012266
Но тоже на английском языке, и автор использует минт, так что если ты все еще на винде, это может вызвать неудобства.
Спасибо за помощь, бро.
Для пхп, мускула и апача хватит с головой 20мб оперативки и процессора твоего телефона года так 2008, дальше думай сам, лол.
Если хочешь с ноута работать - бери легкий и с удобной клавиатурой, чтобы носить его не заебался и печатать было удобно. Ну и с нормальным разрешением экрана и диагональю 15". 13" будет маловато.
В случае работы с виртуалками - памяти желательно 8гб+.
А, блджад, действительно имя класса в ЭТОЙ версии библиотеки называется getID3 (с маленькой буквы, а ID в верхнем).
У phansys вообще в названии какая-то хуита типа GetId3_GetId3.
>если использовать IDE, она бы наверно вывела подсказку по имени класса
Я давно поставил PhpStorm, редко к нему обращаюсь, мне и саблайма хватает пока. Ну вот пожалуй первый случай, когда ide мог бы выручить, подсветив классы.
Расскажи об использовании ide. Как использовать инструменты дебаггинга? Как пользоваться встроенным гитом? А то я как даун каждый раз пишу в терминале.
>header('Cache-Control: must-revalidate');
>header('Pragma: public');
Ты знаешь, что делают эти заголовки? И я не знаю.
Не знаю, зачем ОП дает нам эту мудацкую статью, из которой ты скопипастил буквы. http://habrahabr.ru/post/151795/
Кстати, у меня складывается впечатление, что на хабрахабре собираются какие-то ушлепки, чтобы попиздеть в комментариях.
Ну а чё, вк и одноклассники на работе заблочены злым насяльником. Чем хабр не соцсеть?
Один уебок постит бесполезную (для учащихся) статью, которую он коряво перевел с англоязычного ресурса, чтобы получить лайки, рейтинг или что у них там. А сотни бездельников в каментах начинают меряться писюнами и с чувством собственной важности обсасывать всякую хуйню, типа "что быстрее работает: print или echo". Я не шучу http://habrahabr.ru/post/22951/
Одним словом, хабр это второе после сосача место скопления долбоебов.
RewriteCond будет не нужен если в регулярку добавить ^:
RewriteRule ^download ....
>>499555
> У phansys вообще в названии какая-то хуита типа GetId3_GetId3.
Он пытается приводить код к современными стандартам PSR, я думаю что подчеркивания если и есть, то временно, так как сейчас принято использовать неймспейсы:
\GetId3\GetId3
Первое это неймспейс (совпадающий с именем библиотеки) второе название класса.
>>499555
> Как использовать инструменты дебаггинга?
мучаешься с установкой и настройкой xdebug в php, мучаешься с прописыванием портов и директорий в настройках IDE, после чего как белый господин ставишь точки останова в коде, проходишь код по шагам, смотришь значения переменных, это удобно когда надо исследовать что происходит, особенно когда перед тобой незнакомый код или код стороннего фреймворка/cms. Я советую тебе набраться опыта в этом, это помогает понять причины некоторых проблем. Если речь о твоем коде, там часто вместо отладки проще var_dump натыкать. Алсо никогда не занимайся отладкой на продакшене.
> Как пользоваться встроенным гитом?
По моему коммитить/менять ветки, в терминале удобнее так как ты явно отдаешь команды, видишь реакцию, а с кнопками все менее очевидно (если долго печатать, то есть история команд, стрелочка вверх и поиск через Ctrl + R). С другой стороны, изменения и историю удобнее смотреть в графических програмамх.
Ну и я не знаю, какого качества гит клиент в phpStorm, но если что есть сторонние GUI клиенты (для просмотра истории и изменений): https://git-scm.com/download/gui/linux
> Расскажи об использовании ide.
IDE малополезна если ты не используешь полноценно ее возможности. Изучи:
— автоформатирование кода
— рефакторинг, переименование методов/классов/переменных (когда меняешь в одном месте и меняются все обращения к этой переменной)
— автогенерация заготовок кода, методов и тд
— поиск по проекту с использованием регулярок, я эту функцию в Sublime использую почти каждый день
— множественное выделение и редактирование
— быстрый переход к файлу/классу/функции по нескольким буквам, в PhpStorm это по моему через двойное нажатие Shift как-то делается. Если ты открываешь файлы ковырянием в панельке с деревом каталогов, то ты делаешь это неправильно (или у тебя проект из 3 файлов).
— переход к местам откуда вызывается функция
IDE это инструмент и его эффективное использование позволяет тебе работать быстрее и обрабатывать больий объем кода, а для программиста скорость работы часто влияет на зарплату и карьерный рост. Смысл всех этих окошечек и горячих клавиш именно в том, чтобы что-то делать быстрее.
Не знаю, что почитать/посмотреть, но думаю в сети должны быть какие-то статьи и уроки, если нет то всегда есть документация.
Хотя конечно интерфейс у них перегружен, я вот смотрю на скриншот https://www.jetbrains.com/phpstorm/features/screenshots/70/ps_features_1_1_php_code_editor.png и понимаю что JetBrains нужен маньяк-дизайнер-поклонник Раскина и Купера. Ну или может просто мое восприятие интерфейсов не совпадает с их и их пользователей восприятием.
RewriteCond будет не нужен если в регулярку добавить ^:
RewriteRule ^download ....
>>499555
> У phansys вообще в названии какая-то хуита типа GetId3_GetId3.
Он пытается приводить код к современными стандартам PSR, я думаю что подчеркивания если и есть, то временно, так как сейчас принято использовать неймспейсы:
\GetId3\GetId3
Первое это неймспейс (совпадающий с именем библиотеки) второе название класса.
>>499555
> Как использовать инструменты дебаггинга?
мучаешься с установкой и настройкой xdebug в php, мучаешься с прописыванием портов и директорий в настройках IDE, после чего как белый господин ставишь точки останова в коде, проходишь код по шагам, смотришь значения переменных, это удобно когда надо исследовать что происходит, особенно когда перед тобой незнакомый код или код стороннего фреймворка/cms. Я советую тебе набраться опыта в этом, это помогает понять причины некоторых проблем. Если речь о твоем коде, там часто вместо отладки проще var_dump натыкать. Алсо никогда не занимайся отладкой на продакшене.
> Как пользоваться встроенным гитом?
По моему коммитить/менять ветки, в терминале удобнее так как ты явно отдаешь команды, видишь реакцию, а с кнопками все менее очевидно (если долго печатать, то есть история команд, стрелочка вверх и поиск через Ctrl + R). С другой стороны, изменения и историю удобнее смотреть в графических програмамх.
Ну и я не знаю, какого качества гит клиент в phpStorm, но если что есть сторонние GUI клиенты (для просмотра истории и изменений): https://git-scm.com/download/gui/linux
> Расскажи об использовании ide.
IDE малополезна если ты не используешь полноценно ее возможности. Изучи:
— автоформатирование кода
— рефакторинг, переименование методов/классов/переменных (когда меняешь в одном месте и меняются все обращения к этой переменной)
— автогенерация заготовок кода, методов и тд
— поиск по проекту с использованием регулярок, я эту функцию в Sublime использую почти каждый день
— множественное выделение и редактирование
— быстрый переход к файлу/классу/функции по нескольким буквам, в PhpStorm это по моему через двойное нажатие Shift как-то делается. Если ты открываешь файлы ковырянием в панельке с деревом каталогов, то ты делаешь это неправильно (или у тебя проект из 3 файлов).
— переход к местам откуда вызывается функция
IDE это инструмент и его эффективное использование позволяет тебе работать быстрее и обрабатывать больий объем кода, а для программиста скорость работы часто влияет на зарплату и карьерный рост. Смысл всех этих окошечек и горячих клавиш именно в том, чтобы что-то делать быстрее.
Не знаю, что почитать/посмотреть, но думаю в сети должны быть какие-то статьи и уроки, если нет то всегда есть документация.
Хотя конечно интерфейс у них перегружен, я вот смотрю на скриншот https://www.jetbrains.com/phpstorm/features/screenshots/70/ps_features_1_1_php_code_editor.png и понимаю что JetBrains нужен маньяк-дизайнер-поклонник Раскина и Купера. Ну или может просто мое восприятие интерфейсов не совпадает с их и их пользователей восприятием.
Да, в интернете (и на хабре как его части) много неграмотных людей, там вам могут на полном серьезе рассказывать про важность замены одиночных кавычек на двойные, и подобное. Но иногда можно увидеть и умную мысль, и подчерпнуть что-то новое. Я на Хабр пришел когда весь мой опыт состоял из работы с самописной CMS выполненной лучших традициях PHP4 (лапша повсюду), и именно с хабра я узнал про фреймворки (оказывается есть MVC), SVN, уязвимости, фриланс и сколько зарабатывает программист в Москве (в то время фреймворки и PEAR были редкостью и исопльзовались только крутыми опытными программистами, а большинство про них и не слышало и писало велосипеды. Это конечно вообще был кошмар какой-то, никто писать не умел). Потому Хабр принял какое-то участие в моем развитии и я к нему по прежнему тепло отношусь.
Надо просто более критически относиться к тому что написано, и если что-то кажется сомнительным, гуглить или задавать вопрос в нашем (или не нашем) треде.
И копипастиь буквы конечно не надо. Надо разбираться что делает каждая строчка в твоем коде, иначе какой ты программист? Ты мартышкой так станешь.
Статью я дал ради третьего варианта, с X-SendFile. Первый и второй там конечно ад какой-то, особенно второй который представляет собой попытку вручную написать аналог первого потому что кто-то где-то слышал что в какой-то версии 10 лет назад были какие-то проблемы с памятью.
> Чем хабр не соцсеть?
Ох лол, я когда то там сидел и писал комментарии и даже в irc канале одно время зависал.
Эти заголовки которые возможно управляют кешированием. заголовки управления кешированием делатся на 2 категории по моему: заголовки для браузера и заголвоки для прокси-серверов через которые идет трафик. Тут автор скорее всего сам не знает, зачем они, а просто скопипастил их.
http://ruhighload.com/post/%D0%9A%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Cache-control
http://habrahabr.ru/post/204464/ (опять хабр!)
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
> Cache-Control: must-revalidate
Это значит что промежуточный кеширующий сервер или браузер должны сделать запрос на проверку актуальности прежде чем использовать кешированную версию. если речь о скачивании файла то этот файл вряд ли поменяется и этот заголовок не требутеся. Более того, мы не выставляем заголовки заставляющий кешировать файл, значит и бороться с кешированием незачем.
> Pragma: public
http://stackoverflow.com/a/10314289
Это заголовок управления кешированием из HTTP/1.0 (не 1.1) который посылает браузер чтобы сообщить промежуточным кеширующим серверам о том что он хочет/не хочет получать ответы из кеша. Очевидно что сервер слать его не должен, в данном случае автор просто скопипастил то, что сам не понимает
Кстати про кеширование и вообще клиентсайд оптимизацию есть хороший, хотя и не много старый учебник от webo.in:
http://speedupyourwebsite.ru/
http://webo.in/articles/archive/
Вообще в HTTP довольно заковыристые возможности для управления кешированием, но на практике достаточно знать пару вещей: как заставить браузер кешировать ответ и наооборот, не кешировать.
В случае скачивания файлов кеш не нужен, браузер вряд ли будет кеширвать огромный ответ, а пользователь вряд ли будет скачивать файл несколько раз.
Учить nginx или как всегда оставить на потом? Ну в смысле насколько это важно в приоритете.
Заранее благодарю.
Сам файлообменник можно написать за два дня.
Беда в том, что у тебя для этого должны быть знания. Если знаний нет, то при каждой непонятке придется постоянно отвлекаться на поиск и изучение информации. А учить придется много.
Я в процессе выполнения этого квеста столкнулся с такими большими и маленькими темами, где у меня были пробелы в знаниях:
1) Микрофреймворк слим.
2) Шаблонизатор вроде смарти или твига.
3) Возможно сторонние библиотеки вроде getId3 для получения информации о файле (размер, mime-тип, разрешение если это картинка, битрейт и fps для видео и т.д.)
Можно впрочем обойтись встроенными в php делами, если тебе достаточно скупой информации: для получения разрешения картинки есть getimagesize, для mime-типа это объект класса finfo и т.д.
4) Заголовки http-протокола.
5) Модуль mod_rewrite для сохранения файла под другим именем. Скорее всего тебе понадобится переименовать файл, загруженный юзером на сервер в целях безопасности.
Например хакер может попытаться подгрузить файл php-скрипта, а потом тупо запустить его через адресную строку браузера.
Мы тут пришли к выводу, что самой надежной защитой будет переименование файлов, чтобы хакер а) не знал как называется его файл на сервере, б) сервер не смог исполнить скрипт. Логично добавлять расширение типа .txt в конец файла, тогда апач не исполнит xacker.php.txt, а тупо выведет его содержимое как текстовый документ.
6) Пора бы изучить такую вещь как композер для автозагрузки файлов сторонних фреймворков и библиотек, а также автозагрузки классов (в том числе своих).
7) Еще много мелких затыков, уже не могу вспомнить.
Кроме того, займет время обдумывания, как это все дело организовать и спроектировать, какой будет структура бд, какие классы и патерны использовать.
Как называть файлы? Как защититься от загрузки хакерских скриптов?
В общем, от 2 недель до 1,5 месяцев в зависимости от того, какой у тебя есть опыт, сколько можешь уделять времени в сутки и скорости работы головного мозга.
Если делать еще генератор превью для хайрез-картинок, а также прикручивать плеер для аудио-видео, это уже можно рассматривать как отдельные задачи.
Сам файлообменник можно написать за два дня.
Беда в том, что у тебя для этого должны быть знания. Если знаний нет, то при каждой непонятке придется постоянно отвлекаться на поиск и изучение информации. А учить придется много.
Я в процессе выполнения этого квеста столкнулся с такими большими и маленькими темами, где у меня были пробелы в знаниях:
1) Микрофреймворк слим.
2) Шаблонизатор вроде смарти или твига.
3) Возможно сторонние библиотеки вроде getId3 для получения информации о файле (размер, mime-тип, разрешение если это картинка, битрейт и fps для видео и т.д.)
Можно впрочем обойтись встроенными в php делами, если тебе достаточно скупой информации: для получения разрешения картинки есть getimagesize, для mime-типа это объект класса finfo и т.д.
4) Заголовки http-протокола.
5) Модуль mod_rewrite для сохранения файла под другим именем. Скорее всего тебе понадобится переименовать файл, загруженный юзером на сервер в целях безопасности.
Например хакер может попытаться подгрузить файл php-скрипта, а потом тупо запустить его через адресную строку браузера.
Мы тут пришли к выводу, что самой надежной защитой будет переименование файлов, чтобы хакер а) не знал как называется его файл на сервере, б) сервер не смог исполнить скрипт. Логично добавлять расширение типа .txt в конец файла, тогда апач не исполнит xacker.php.txt, а тупо выведет его содержимое как текстовый документ.
6) Пора бы изучить такую вещь как композер для автозагрузки файлов сторонних фреймворков и библиотек, а также автозагрузки классов (в том числе своих).
7) Еще много мелких затыков, уже не могу вспомнить.
Кроме того, займет время обдумывания, как это все дело организовать и спроектировать, какой будет структура бд, какие классы и патерны использовать.
Как называть файлы? Как защититься от загрузки хакерских скриптов?
В общем, от 2 недель до 1,5 месяцев в зависимости от того, какой у тебя есть опыт, сколько можешь уделять времени в сутки и скорости работы головного мозга.
Если делать еще генератор превью для хайрез-картинок, а также прикручивать плеер для аудио-видео, это уже можно рассматривать как отдельные задачи.
>у тебя будут проблемы с названиями кириллицей.
Может проще названия файлов на транслит переводить?
Я бы может и заморочился с изучением этого mod_rewrite, но особого смысла не вижу, т.к. и так все прекрасно работает. Мне все равно дополнительная функция нужна для обновления счетчика, так почему бы в этой же функции не выдавать файл на закачку?
Если бы была необходимость давать "типа прямые ссылки", тогда другое дело. Но этой необходимости нет.
Ну хуй знает. Просто мне кажется, что файлы должен отдавать сервер, это его прямое назначение.
Хотя ради счетчика может и стоит пойти на извращения.
И тут ОП такой врывается и поясняет нам, как собственно php работает с файловыми потоками?
Вот у меня файл весит 2 гигабайта. Php его полностью зачитает в оперативную память что ли? Или будет откусывать по кусочку и передавать апачу? А тот... хрен знает, то ли высылает юзеру так же по частям, то ли тоже складывает в какой-то буфер. Непонятно.
15 дюймов матрица и 8Гб+ оперативки, остальное на вкус и цвет. Еще из не очевидного: если ноут светится как новогодняя елка быстрее будут уставать глаза, особенно если ты не владеешь слепой печатью; Intel + Nvidia будет меньше ебли если решишь накатить Линупс, но я бы советовал накатить линупс на виртуальную машину, у ОПа есть мануал на эту тему.
Можно переводить, особенно если нужна работа под windows так как там русские буквы в названиях будут коверкаться (php под windows почему-то требует имена переводить в ANSI кодировку, для России это cp1251). при этом приходят имена от пользователя в utf-8, в которой десятки тысяч символов, а в cp1251 их всего 256 — это значит что если загрузить под windows файл с иероглифами то они потеряются.
Потому переводить имена в транслит или вообще переименовывать смысл есть.
> Мне все равно дополнительная функция нужна для обновления счетчика, так почему бы в этой же функции не выдавать файл на закачку?
Неэффективно раздавать файлы через php, сервер, особенно nginx (который заточен под раздачу статики), делает это гораздо быстрее и эффективнее и тратит меньше ресурсов.
>>499680
> Php его полностью зачитает в оперативную память что ли? Или будет откусывать по кусочку и передавать апачу?
Если ты используешь функции типа readfile то по кусочкам, но все равно это в общем не очень эффективно так как ты все это долгое время держишь в памяти сам php + занятый твоим скриптом объем. Представь что у тебя 10 скачивальщиков в секунду и файл качается минуту. Тогда за минуту происходит 600 параллельных скачиваний и 600 php скриптов висят занимая память и ресурсы сервера. В то время как однопоточный nginx одним процессом может раздавать эти 600 файлов тратя гораздо меньше ресурсов, и памяти, и CPU. Апач правда не умеет так, и тоже будет держать в памяти 600 процессов, но в эти процессы не будет загружен php и твой код, так что это будет тратить меньше ресрусов.
Конечно процессоры сейчас мощные и памяти на серверах много. Наверно посещаемый сайт может себе позволить купить сервер помощнее. Но тут дело скорее в общем принципе, статические файлы надо отдавать без участия php, потому что веб-сервер умеет делать это лучше, а использовать php — лишнее усложнение системы.
Ну и вдобавок nginx/apache поддерживают докачку файлов с середины, а твой скрипт поддерживает?
> Nvidia будет меньше ебли если решишь накатить Линупс
Тонко.
https://www.youtube.com/watch?v=iq7wYrNBi2w
Ну кароч понятно. Есть конечно способы лучше, но в данном случае обойдусь без них, т.к. сайт мой все равно максимум 50 мегабайт принимать будет и никаких нагрузок на нем не предвидится. Так что просто буду заменять кириллицу на транслит.
Походу задача про файлообменник сейчас в тренде, тоже ее решаю.
Ох и наебался же я только что с x-sendfile, но таки заработало. Вообще насколько мне кажется задача на файлообменник делается быстрее задачи на список студентов, но блин каждый маленький шажок дается с трудом, я два дня читал про этот mod_rewrite, все-равно до конца не понял некоторые моменты, думаю придет с практикой, теперь вот этот x-sendfile, а сейчас придется с превьюшками разбираться
( напоминаю ОП, посмотри моих студентов https://github.com/V3N0m21/StudentList )
Нахуй тебе превьюшки на файлообменнике? Ты собираешься галерею картинок чтоли пилить? По-моему проще просто картинку ужимать средствами CSS, чем лишний раз сервак напрягать. Превьюшки имеют смысл только тогда, когда этих самых картинок на странице много. А если она одна, то зачем?
Чтоб технологию пощупать, не?
Мы же эти задачи решаем не для того чтоб заработало, а для того чтоб получить новые знания
Что там щупать то? Если ты файлообменник уже пилишь, то для тебя ничего нового там не будет.
А как же экономия трафика пользователя?
>просто картинку ужимать средствами CSS
Очевидный быдлокод.
Во-первых лишний трафик.
А если там картинки в хайрезе, в psd формате с 10 слоями? Каждая будет весит метров по 50-100.
На странице описания файла тебе нужно вывести иконку 100х100.
Ты будешь гонять эти 50мб каждый раз при обращении к подобной странице?
А если изменится дизайн, и понадобится не 100x100, другой размер? Бегать по стилям и все исправлять? Или подключать ради этого less/sass?
>галерею картинок
Такая возможность должна быть предусмотрена.
И вообще задачи опа учат именно правильно мыслить. Нужно учиться проектировать и продумывать наперед все нюансы.
Ну и за популярность nginx прилинкую свой вопрос. >>499591
Опа, онанисты и сюда притащили своих ванильных блядей.
Там еще и ноги грязные, фу блядь.
Та же проблема как и у тебя, я вот месяцев 5 учил ПХП, теперь взялся за явскрипт учу примерно дней 20-25 его пока, но надо сказать язык затягивает, он оказался интереснее чем ПХП, но немного сложнее, а может и много, у меня проблема начинаю немного уже забывать про ПХП, поэтому скоро опять планирую вернутся к ПХП, ещё раз всё повторить написать какой-нибудь сайт и уже идти устраиваться работать.
Как это кэширование вообще работает? Я же думал, что стоит нажать ctrl + f5 (или ctrl + shift + r на ноуте), как страница принудительно перезагрузится, запросив контент у сервера. Или слим хранит кэш прям на сервере?
оповские талмуды >>499587 как-нибудь на досуге почитаю, вместо сказки на ночь. Мне бы пока только кэш слима временно отключить.
ты нахуй в пхп тред пишешь? иди в жс.
also гугли offset.
Да чем тебя InnoDB не устраивает? Для mysql самый продвинутый движок. Само собой, все хостеры его поддерживают, кроме совсем уж уебищных бесплатных помоек.
Про другие субд не в курсе.
пфф, меня наоборот от жаваскрипта блевать тянет, пхп гораздо удобнее - это одновременно шаблонизатор, который можно вставить в любой кусок хтмл кода и вывести перменную.
>>499788
Из платных есть популярный хостингер, например.
Олл инклюзив за 192 рубля в месяц. 30 дней можно потестировать бесплатно.
Характеристики сервера смотри в таблице. InnoDB поддерживают.
http://www.hostinger.ru/hosting
да
Пруфы?
1. Вводишь логин/пароль.
2. В коде страницы есть две строчки с неким хешем, этот хеш всегда присутствует в форме отправки.
3. Логин/пароль вместе с этими хешами отправляются POST-запросом на страничку авторизации.
4. Если логин/пароль и эти коды ок, страница устанавливает cookie с ID-сессии (подчеркнул красным), по которому пускает вконтакт. Если отключить cookies, во вконтакт войти нельзя.
Я сделал CURLом запрос, который сначала парсит страницу авторизации, чтобы выделить вот эти два кода. Затем вместе со своими логином/паролем я отправляю всё это на https://login.vk.com, по сути дублируя сам POST-запрос контакта, но ответ получается совсем не такой, куки не устанавливаются, а наоборот - удаляются, вконтакт соответственно не пускает. Что я могу упускать, как полностью сэмулировать их запрос на авторизацию?
Сам POST-запрос выглядит вот так:
$ch = curl_init('https://login.vk.com/? act=login&_origin=http://m.vk.com&ip_h=68d13191d7c5f3eb2a&lg_h=dc8c2607c3e3f4f6f6&role=pda&utf8=1');
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'email=myemail&pass=mypassword');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8',
'content-type: application/x-www-form-urlencoded',
'origin: http://m.vk.com',
'referer: http://m.vk.com/login',
));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$content = curl_exec($ch);
1. Вводишь логин/пароль.
2. В коде страницы есть две строчки с неким хешем, этот хеш всегда присутствует в форме отправки.
3. Логин/пароль вместе с этими хешами отправляются POST-запросом на страничку авторизации.
4. Если логин/пароль и эти коды ок, страница устанавливает cookie с ID-сессии (подчеркнул красным), по которому пускает вконтакт. Если отключить cookies, во вконтакт войти нельзя.
Я сделал CURLом запрос, который сначала парсит страницу авторизации, чтобы выделить вот эти два кода. Затем вместе со своими логином/паролем я отправляю всё это на https://login.vk.com, по сути дублируя сам POST-запрос контакта, но ответ получается совсем не такой, куки не устанавливаются, а наоборот - удаляются, вконтакт соответственно не пускает. Что я могу упускать, как полностью сэмулировать их запрос на авторизацию?
Сам POST-запрос выглядит вот так:
$ch = curl_init('https://login.vk.com/? act=login&_origin=http://m.vk.com&ip_h=68d13191d7c5f3eb2a&lg_h=dc8c2607c3e3f4f6f6&role=pda&utf8=1');
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'email=myemail&pass=mypassword');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8',
'content-type: application/x-www-form-urlencoded',
'origin: http://m.vk.com',
'referer: http://m.vk.com/login',
));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$content = curl_exec($ch);
Борисова лично видел, он точно не стесняшка.
В жожле бы посмотрел хотя бы. В любом случае, тебе придётся использовать встроенную библиотеку GD, там есть инструментарий на все случаи жизни.
Посмотрел, кидает на phpforum с решением конкретных вопросов юзеров либо на библиотеки для работы с изображениями, мне бы что-то более объемное с аспектами.
Поскольку изображения это обычный файл, то нужно разобраться сначала, как загружаются файлы на сервер.
http://www.php.su/phphttp/?uploads
Информацию о файлах (как минимум название файла) нужно сохранять в базу. Поэтому нужно сначала выучить основы sql.
Куча ссылок здесь
https://gist.github.com/codedokode/10539213
Лично мне еще понравилась книга по mysql авторов Л.Веллинг, Л.Томпсон.
Что касается ресайзов, не совсем понятно, что ты имеешь ввиду.
Если вывод изображения определенного размера, это задается в css.
Если изменение размера в интерактивном режиме в браузере, это js.
Создание копий изображения с другими размерами на сервере (как это делается во всяких вордпрессах и прочих sms) через библиотеку GD.
Справочник http://php.net/manual/ru/book.image.php
Мануалы можно погуглить по фразе "библитека gd php". Например
http://www.php.su/functions/?cat=image
http://www.opennet.ru/base/dev/php_gd.txt.html
О, благодарю!
http://s.pikabu.ru/external/0x00_3/index_frame.html
Клик мышкой --> смена картинки на уже с нажатой кнопкой. Наверное. Я сам зелёный.
Да вроде ты прав. Там есть вот такой файлик.
Смотрю на это и мой пукан горит - хера я когда смогу такое запилить.
Бамп.
Я вот с этого охуел. Музыка, шрифты - всё на js сделано. Ни единого ресурса в игре.
Я вот с этого охуел. Музыка, шрифты - всё на js сделано. Ни единого ресурса в игре.
http://vk.com/app4440323
Ресурсы могут передаваться аяксом (или через сокеты), поэтому если ты их не видишь по прямым ссылкам, это не значит что они "генерируются" на лету.
Вк использует либо айфреймы, либо скорее всего флеш.
Учились бы лучше, а не охуевали от говноприложений.
Ты бы чем ругать почём зря, разобрался бы лучше. Там весь код открытый и видно, что ресурсы генерируются на лету, даже музыка.
>аяксом (или через сокеты)
Лол, сам бы поучился.
Аллах скомпилирован на ассемблере.
Я ничего не понял.
Локалхост - это когда сервер установлен на твоем компьютере, локально. Что ты с него выкачивать собрался? Скопируй руками.
>Я ничего не понял.
Это что-то вроде статического генератора с удобной админкой. Только что решил проблему через wget, но хочется поебаться с curl.
с помощью
Почему-то не находит картинку http://ideone.com/jY6f8t сперва пытался прямой путь указывать, счас картинку перенес в директорию с самим файлом и всё равно его не видит и выдает
Warning: imagecreatefromjpeg(2.jpeg): failed to open stream: No such file or directory in E:\OpenServer\domains\localhost\php\ImagesPHP\test2.php on line 4
> $jpeg_file = "2.jpeg";
У тебя указано только имя файла, но не указан путь к нему. Как ты считаешь, в какой папке будет искать PHP этот файл?
Неверно. Искаться он будет в «текущей» папке, увидеть ее можно через var_dump(getcwd())
По этой приине код который использует относительные пути, хрупкий и не надежный. Ты должен формировать полные пути к файлу.
Текущая папка судя по var_dump(getcwd()) и ничего по сути не изменилось.
ПОП, проверь файлообменник.
https://github.com/nsdvw/file-sharing
Версия 2. Исправлено:
- переименование файлов в папке загрузок;
- подключена getid3;
- настроены .htaccess для скачивания файлов под оригинальным именем;
- теперь все как у людей, на композерах, с пространствами имен;
- изменена структура бд: вся информация о файле сохраняется в базу, правда есть вопросы по форматированию этих данных, смотри ниже;
- для pdo и разбора конфигурации заделан слимовский синглтон;
- сохранение файлов через транзакцию, в случае если файл не удается переместить из временной директории в целевую, делается откат;
- немного поигрался со стилями, но мне все равно не нравится верстать, надо бы прикрутить бутстрап.
Вопросы:
1) Как реализовать "вложенность" шаблонов? У меня есть несколько шаблонов для разных типов файлов. Фактически они отличаются только участком предпросмотра.
Для изображений там понятно тег img с превью и ссылкой для просмотра в полном разрешении, для аудио/видео это плеер.
Кстати, в связи с тем что у меня в папке загрузок лежит .htaccess с заголовком Header set Content-Disposition attachment, я теперь не могу открывать картинки в браузере. Пришлось запилить отдельную страницу для просмотра, но я оправдываю это тем, что там еще планируются всякие свистелки с джаваскриптом.
2) Как в sql делать сложные условия? Например у меня в базе хранится размер файла в байтах.
Нужно перевести в Гб если больше pow(1024, 3), или в Мб если больше pow(1024, 2) или в Кб, или оставить в байтах.
Я это дело пока отформатировал в php. Но думается это нужно делать средствами sql. Что-то не могу разобраться. CASE вроде бы принимает только значения, не условия. У функции IF() нет elseif, она тернарная. Нагуглил только процедуры, пока не хочется в это окунаться.
3) Как подключить bootstrap или другой css/js фреймворк через композер?
У меня все файлы со стилями и скриптами лежат в папке public, а папка vendor на уровень выше. Эти файлы недоступны для прямого доступа.
Может у композера есть возможность сохранять пакетики в разные директории?
4) Не получается редирект. Наверное, это слим виноват.
Например, у меня там когда пользователь запрашивает несуществующий айди, его должно выкинуть 404
header( "HTTP/1.1 404 Not Found" );
А ничего не происходит. Белый экран, ошибок нет, я смотрел в логах.
Todo:
- прикрутить jqury/ui для драг-дропа, полосочка загрузки файла;
- генерировать уменьшенные копии для изображений при запросе;
- перевести шаблоны на бутстрап.
ПОП, проверь файлообменник.
https://github.com/nsdvw/file-sharing
Версия 2. Исправлено:
- переименование файлов в папке загрузок;
- подключена getid3;
- настроены .htaccess для скачивания файлов под оригинальным именем;
- теперь все как у людей, на композерах, с пространствами имен;
- изменена структура бд: вся информация о файле сохраняется в базу, правда есть вопросы по форматированию этих данных, смотри ниже;
- для pdo и разбора конфигурации заделан слимовский синглтон;
- сохранение файлов через транзакцию, в случае если файл не удается переместить из временной директории в целевую, делается откат;
- немного поигрался со стилями, но мне все равно не нравится верстать, надо бы прикрутить бутстрап.
Вопросы:
1) Как реализовать "вложенность" шаблонов? У меня есть несколько шаблонов для разных типов файлов. Фактически они отличаются только участком предпросмотра.
Для изображений там понятно тег img с превью и ссылкой для просмотра в полном разрешении, для аудио/видео это плеер.
Кстати, в связи с тем что у меня в папке загрузок лежит .htaccess с заголовком Header set Content-Disposition attachment, я теперь не могу открывать картинки в браузере. Пришлось запилить отдельную страницу для просмотра, но я оправдываю это тем, что там еще планируются всякие свистелки с джаваскриптом.
2) Как в sql делать сложные условия? Например у меня в базе хранится размер файла в байтах.
Нужно перевести в Гб если больше pow(1024, 3), или в Мб если больше pow(1024, 2) или в Кб, или оставить в байтах.
Я это дело пока отформатировал в php. Но думается это нужно делать средствами sql. Что-то не могу разобраться. CASE вроде бы принимает только значения, не условия. У функции IF() нет elseif, она тернарная. Нагуглил только процедуры, пока не хочется в это окунаться.
3) Как подключить bootstrap или другой css/js фреймворк через композер?
У меня все файлы со стилями и скриптами лежат в папке public, а папка vendor на уровень выше. Эти файлы недоступны для прямого доступа.
Может у композера есть возможность сохранять пакетики в разные директории?
4) Не получается редирект. Наверное, это слим виноват.
Например, у меня там когда пользователь запрашивает несуществующий айди, его должно выкинуть 404
header( "HTTP/1.1 404 Not Found" );
А ничего не происходит. Белый экран, ошибок нет, я смотрел в логах.
Todo:
- прикрутить jqury/ui для драг-дропа, полосочка загрузки файла;
- генерировать уменьшенные копии для изображений при запросе;
- перевести шаблоны на бутстрап.
Это неудачный пример. Папка vendor для php-библиотек и она может быть не доступна снаружи, соответственно ставить в нее клиентские библиотеки неправильно. Как я написал выыше, есть bower для установки всяких jquery/bootstrap, но его обычно используют не отдельно, а вместе с цепочкой обработки статики на grunt/gulp (хотя я всегда предпочитал bash скрипты, они проще получаются). Но на файлообменнике все это задействовать наверно будет излишне, вот если бы у анона был большой объем js кода, клиентские шаблоны, там бы все это потребовалось.
А в этой ситуации анону проще руками скачать бутстрап. Либо через bower установить.
Мне это кажется излишней автоматизацией. Скачать две папки с js и css файлами, неужели это быстрее, чем устанавливать bower и писать к нему команды. Какое-то упрощение ради упрощения.
>>498483
>>497978
>>498088
Вот советы и замечания:
https://github.com/Integer64/myTestSite.dev/blob/master/vecktor_OOP/classes/Department.php#L34
> try {
> $wageCosts += $employee->getPayment();
> }catch (RankException $e){
> die("Ошибка: {$e->getMessage()}\n");
> }
Вот это неправильно. Почему у тебя функция умирает? Она не должна ловить исключение, пусть оно вылетает вверх.
PHP сам умрет при непойманном исключении, запишет его в логи и выведет его на экран (если у тебя не выводит, включи отображение ошибок). И вообще, при работе с исключениями ты часто пишешь throw, но очень редко try/catch. Вот мой урок по теме: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Ловить ты должен исключения, которые можешь обработать. Ну например если не удалось скачать что-то из сети, а очень надо, можно при возникновении исключения сделать еще пару попыток прежде чем сдаться. В данном случае исключение возникает если передан неправильный ранг. Обработать ты его никак не можешь, так как единственное решение тут — исправить код. Значит, не надо его ловить вообще.
> throw new RankException
Это правильный код, но имей в виду что для случая когда передан неправильный аргумент, есть уже готовое исключение InvalidArgumentException: http://php.net/manual/ru/spl.exceptions.php
> // Класс Департамент закупок унаследованный от класса Департамент
> class DepartmentOfPurchases extends Department{
> // Свойство класса
Это комментарии Капитана Очевидность так как они повторяют то, что ниже написано в коде и это очевидно любому кто знает синтаксис PHP. В комментариях обычно пишут неочевидные вещи, зачем написана та или иная команда, описываются подводные камни в коде. Я думаю, что ты это писал для себя, когда изучал классы, если так то ок, но в дальнейшем не пиши такого.
> private function upgrade($upgradeManagers)
тут ты тоже не должен ловить исключения. Надо просто не выбирать менеджеров 3-го ранга для повышения, а брать только 1-го и второго.
В общем, я думаю, что если убрать try/catch и исправить выбор менеджеров, код станет правильным, а ты модешь переходить к следующей задаче, по моему это задача про список абитуриентов, да? Ты уже установил веб-сервер, так что самое время перейти от неинтерактивных программ к полноценным приложениям и работе с базой (кстати задания по SQL есть в ОП посте). ну и вообще, если ты знаешь такие сложные понятия как Integer64, для тебя эта задача не представит большой сложности.
>>498483
>>497978
>>498088
Вот советы и замечания:
https://github.com/Integer64/myTestSite.dev/blob/master/vecktor_OOP/classes/Department.php#L34
> try {
> $wageCosts += $employee->getPayment();
> }catch (RankException $e){
> die("Ошибка: {$e->getMessage()}\n");
> }
Вот это неправильно. Почему у тебя функция умирает? Она не должна ловить исключение, пусть оно вылетает вверх.
PHP сам умрет при непойманном исключении, запишет его в логи и выведет его на экран (если у тебя не выводит, включи отображение ошибок). И вообще, при работе с исключениями ты часто пишешь throw, но очень редко try/catch. Вот мой урок по теме: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Ловить ты должен исключения, которые можешь обработать. Ну например если не удалось скачать что-то из сети, а очень надо, можно при возникновении исключения сделать еще пару попыток прежде чем сдаться. В данном случае исключение возникает если передан неправильный ранг. Обработать ты его никак не можешь, так как единственное решение тут — исправить код. Значит, не надо его ловить вообще.
> throw new RankException
Это правильный код, но имей в виду что для случая когда передан неправильный аргумент, есть уже готовое исключение InvalidArgumentException: http://php.net/manual/ru/spl.exceptions.php
> // Класс Департамент закупок унаследованный от класса Департамент
> class DepartmentOfPurchases extends Department{
> // Свойство класса
Это комментарии Капитана Очевидность так как они повторяют то, что ниже написано в коде и это очевидно любому кто знает синтаксис PHP. В комментариях обычно пишут неочевидные вещи, зачем написана та или иная команда, описываются подводные камни в коде. Я думаю, что ты это писал для себя, когда изучал классы, если так то ок, но в дальнейшем не пиши такого.
> private function upgrade($upgradeManagers)
тут ты тоже не должен ловить исключения. Надо просто не выбирать менеджеров 3-го ранга для повышения, а брать только 1-го и второго.
В общем, я думаю, что если убрать try/catch и исправить выбор менеджеров, код станет правильным, а ты модешь переходить к следующей задаче, по моему это задача про список абитуриентов, да? Ты уже установил веб-сервер, так что самое время перейти от неинтерактивных программ к полноценным приложениям и работе с базой (кстати задания по SQL есть в ОП посте). ну и вообще, если ты знаешь такие сложные понятия как Integer64, для тебя эта задача не представит большой сложности.
Включи отображение расширений (как, написано в интернете), у же тебя только имена выводятся. «Рисунок JPEG» это тип файла, а не расширение.
Либо в командной строке перейди в папку и сделай dir (если умеешь).
>>500505
Так я и написал что bower — это когда у нас сложный фронтенд и кроме него еще куча всего есть. Профит от bower не только в автоматизации скачивания, но и репозиторий становится меньше и сразу видно где чей код. Анону, да, проще руками скачать.
Хорошая традиция класть в репозиторий только свой код, а не сторонний (легче разбираться, легче обновлять), соответственно composer и bower этому способствуют.
Раньше были антипримеры — если ты возьмешь любой фрйемворк или CMS 5-летней давности, то там пользовательский код и код фреймворка идут вперемешку, и нельзя фреймворк вынеси в vendor (исключение разве что ZF, но это потому что его писали умники).
Согласен. Но, мне кажется, это применимо для больших проектов. Не стоит его пихать в каждый скрипт.
У меня так json_encode умер. Сказал false, и положил пятерку (JSON_ERROR_UTF8) в json_last_error.
Что мне ему подсунуть в $id3->encoding, чтобы заработало? Я кроме utf8 не знаю других кодировок. Вернее, как они пишутся.
Там наверное какой-нибудь ascii.
Композер применим для любых проектов, тем более что установить его надо один раз. В маленьких проектах с ним репозиторий только аккуратнее выглдит.
Насчет bower, насколько я знаю, он скачивает библиотеки куда-то отдельно и тебе понадобится как минимум скрипт для их копрования, а может еще что-то (например скрипт для склейки). Но bower хорош тем, что он умеет управлять зависимостями. То есть если библиотекам A и B нужна C, он скачает и установит ее сам, и только один раз.
Анону наверно bower не требуется.
> для больших проектов.
Я думаю, не для больших проектов, а для проектов где есть система сборки фронтенда.
Не кодируй весь массив в JSON, а возьми из него только то, что надо.
> Что мне ему подсунуть в $id3->encoding, чтобы заработало?
Там бинарные данные (фрагмент файла), а не текст в неправильной кодировке.
Алсо, можно из этого сложного массива сделать объект MediaInfo с только нужными тебе полями и методами (очевидно объект удобнее массива, его можно передать в шаблон, вызывать методы и тд). И предусмотреть у объекта методы для экспорта/импорта из JSON.
А в массиве, который возвращает gitId3, структура непонятная, любые поля могут остутствовать и работать с ним не очень-то удобно.
>В маленьких проектах с ним репозиторий только аккуратнее выглдит.
Почему? Нет git файлов в корне?
Нет сторонних библиотек, только несклоько файлов с кодом самого проекта. При чем тут git файлы? Если ты хотел намекнуть на git submodules то они не для этого, не для подключения сторонних библиотек и они не альтернатива/замена композеру.
> проверьте про гамбургеры задание.
Проверяем.
Мне не нравится, как сделан класс. Смотри, какие свойства есть у гамбургера?
— тип (маленький/большой)
— начинка (1 из 3 вариантов)
— добавки (одна или две)
Значит надо сделать соответствующие свойства. Для добавок сделать массив добавок, так как их может быть несколько. Типы гамбургеров и начинок обозначить константами. А для вычисления калорий и цены сделать метод getPrice, getCalories.
Ты же почему-то хранишь в гамбургере цен и калории, а из чего он состоит, не хранишь. Ты можешь в своем коде ответить на вопрос: какой тип этого гамбургера? Какие в нем добавки и начинки?
На мой взгляд вместо того чтобы сделать все, как в задаче, ты решил усложнить код. Конечно, цену и калории он считает, но часть информации невозвратно теряется и по моему это плохо (надо будет допилить задачу чтобы такие трюки не работали). Также, в твоем коде вообще нет такой сущности, как начинка, ты должен руками вписать цену и калории.
Я думаю, это должно выглядеть так:
var h = new Hamburger(Hamburger.TYPE_LARGE, Hamburger.FILLING_CHEESE);
h.addSeasoning(Hamburger.SEASONING_MAYO);
console.log(h.getPrice());
Как видишь, тут для всех видов продуктов есть обознаечния и нам не надо явно вписыват цену, тем более что она со временем может поменяться.
Функции при этом должны прооверять аргументы и не разрешать добавлять что-то неправильное.
То есть замечания в основном не к знанию яваскрипта (я вижу, ты его понимаешь), а к твоему знанию ООП, с этим пока не очень хорошо. Надо просто сделать то, что описано в задаче, средствами ООП, один в один.
>>497936
Там SQL но с некоторыми особенностями (как и в любой СУБД). Особенности подробно описаны например тут:
https://docs.oracle.com/database/121/nav/portal_4.htm
(ищи там SQL reference)
А кратко тут: https://en.wikibooks.org/wiki/SQL_Dialects_Reference
PL/SQL это язык для написания хранимых процедур, он не нужен чтобы создавать таблицы, но на сайте оракла есть мануал и по нему.
> проверьте про гамбургеры задание.
Проверяем.
Мне не нравится, как сделан класс. Смотри, какие свойства есть у гамбургера?
— тип (маленький/большой)
— начинка (1 из 3 вариантов)
— добавки (одна или две)
Значит надо сделать соответствующие свойства. Для добавок сделать массив добавок, так как их может быть несколько. Типы гамбургеров и начинок обозначить константами. А для вычисления калорий и цены сделать метод getPrice, getCalories.
Ты же почему-то хранишь в гамбургере цен и калории, а из чего он состоит, не хранишь. Ты можешь в своем коде ответить на вопрос: какой тип этого гамбургера? Какие в нем добавки и начинки?
На мой взгляд вместо того чтобы сделать все, как в задаче, ты решил усложнить код. Конечно, цену и калории он считает, но часть информации невозвратно теряется и по моему это плохо (надо будет допилить задачу чтобы такие трюки не работали). Также, в твоем коде вообще нет такой сущности, как начинка, ты должен руками вписать цену и калории.
Я думаю, это должно выглядеть так:
var h = new Hamburger(Hamburger.TYPE_LARGE, Hamburger.FILLING_CHEESE);
h.addSeasoning(Hamburger.SEASONING_MAYO);
console.log(h.getPrice());
Как видишь, тут для всех видов продуктов есть обознаечния и нам не надо явно вписыват цену, тем более что она со временем может поменяться.
Функции при этом должны прооверять аргументы и не разрешать добавлять что-то неправильное.
То есть замечания в основном не к знанию яваскрипта (я вижу, ты его понимаешь), а к твоему знанию ООП, с этим пока не очень хорошо. Надо просто сделать то, что описано в задаче, средствами ООП, один в один.
>>497936
Там SQL но с некоторыми особенностями (как и в любой СУБД). Особенности подробно описаны например тут:
https://docs.oracle.com/database/121/nav/portal_4.htm
(ищи там SQL reference)
А кратко тут: https://en.wikibooks.org/wiki/SQL_Dialects_Reference
PL/SQL это язык для написания хранимых процедур, он не нужен чтобы создавать таблицы, но на сайте оракла есть мануал и по нему.
Если ты платишь за обучение, то это явно не рубиконтора а попытка развести на деньги. Нормальные компании если и берутся кого-то обучать то платят стипендию (яндекс, дойче банк и другие).
>>497959
>>497973
> &&$month==1) {
Слишком сложно. Начальный платеж проще всего добавить к сумме перед циклом.
> $creditBalance=($creditBalance × $percent ) + $servicePayment
это повторяется 2 раза, избавься от повторов (если перенести начальный платеж, как раз избавишься)
> if($creditBalance>$monthlyPayment) {
> $creditBalance=($creditBalance × $percent ) + $servicePayment - $monthlyPayment;
Тут неточность. Ты должен сначала добавить процент и комиссии, а потом сравнивать, а ты сравниваешь баланс до добавления процента/комиссии.
Из-за этого ты получашеь неправильный ответ. Во втором банке должно быть около 61270.
Насчет выбора банка, хороший способ это отсортировать массив, тогда можно будет вывести лучший банк, второй и третий по цене. Твои варианты тоже годятся.
Только на документацию https://github.com/yiisoft/yii2/tree/master/docs/guide-ru
>>498025
> for ( $i=0; $i < 6; $i++ ) {
> $rand .= mt_rand(0, 9);
Номер поста это число и можно сразу его сгенерировать за один вызов, чтобы он был 6-значный достаточно поставить в качестве минимального значения 100 000.
> case (0) :
Скобки не требуются.
А так, хорошо сделано.
>>498058
Подумай как избавиться от повтора этого кода:
> ($credit × $rate + $commission)
Мне кажется условием продолжения цикла должно быть просто «пока долг больше нуля», а не сложная формула.
Ответ неправильный, должно получиться около 61270. Можешь попробовать поставить сумму кредита поменьше для проверки, если брать 4000 в кредит то выплаиваешь 6123.
Также, внизу ошибки с использованием несуществующих на тот момент переменных:
> PHP Notice: Undefined variable: period in /home/iRnYxl/prog.php on line 18
это надо исправить, надо сначала что-то присвоить переменной, а потом ее использовать.
> На код в учебнике не смотрел вообще специально,
И правильно сделал, так как он с ошибкой.
Только на документацию https://github.com/yiisoft/yii2/tree/master/docs/guide-ru
>>498025
> for ( $i=0; $i < 6; $i++ ) {
> $rand .= mt_rand(0, 9);
Номер поста это число и можно сразу его сгенерировать за один вызов, чтобы он был 6-значный достаточно поставить в качестве минимального значения 100 000.
> case (0) :
Скобки не требуются.
А так, хорошо сделано.
>>498058
Подумай как избавиться от повтора этого кода:
> ($credit × $rate + $commission)
Мне кажется условием продолжения цикла должно быть просто «пока долг больше нуля», а не сложная формула.
Ответ неправильный, должно получиться около 61270. Можешь попробовать поставить сумму кредита поменьше для проверки, если брать 4000 в кредит то выплаиваешь 6123.
Также, внизу ошибки с использованием несуществующих на тот момент переменных:
> PHP Notice: Undefined variable: period in /home/iRnYxl/prog.php on line 18
это надо исправить, надо сначала что-то присвоить переменной, а потом ее использовать.
> На код в учебнике не смотрел вообще специально,
И правильно сделал, так как он с ошибкой.
> [^a-zA-Zа-яёА-ЯЁ]+ //Проверяет отсутствие каких либо букв.
Это очень странная штука, так как кроме русских и латинских букв есть тысячи других значков (посмотри сам: http://unicode-table.com/ru/ )
И это не работает так, как ты думаешь. Это значит:
«после 7 цифр должен идти один или больше символ не являющийся буквой».
В регулярках ты указываешь, что должно идти, а не чего не должно быть.
> 8 //ищет строго восьмерку в начале
Нет, не только в начале так как ^ стоит внутри скобок и относится только к ним, а скобки не обязательные. Так что это ищет 8 в любом месте строки.
> [0-9]{7} // Проверяет наличие семи цифр, возможно тут проблема, т.к. не учитываются возможные пробелы и тире
да, это проблема.
Твою регулярку надо проверить на большем числе примеров.
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Также, есть сайт для проверки регулярок, regex101, может он тебе поможет, только учти что там бекслеш надо писать один раз, а не два: \s а не \\s
>>498271
Это верно, но код бы надо отформатировать, а то читать невозможно. Это можно сделать например на phpformatter.com
> [^a-zA-Zа-яёА-ЯЁ]+ //Проверяет отсутствие каких либо букв.
Это очень странная штука, так как кроме русских и латинских букв есть тысячи других значков (посмотри сам: http://unicode-table.com/ru/ )
И это не работает так, как ты думаешь. Это значит:
«после 7 цифр должен идти один или больше символ не являющийся буквой».
В регулярках ты указываешь, что должно идти, а не чего не должно быть.
> 8 //ищет строго восьмерку в начале
Нет, не только в начале так как ^ стоит внутри скобок и относится только к ним, а скобки не обязательные. Так что это ищет 8 в любом месте строки.
> [0-9]{7} // Проверяет наличие семи цифр, возможно тут проблема, т.к. не учитываются возможные пробелы и тире
да, это проблема.
Твою регулярку надо проверить на большем числе примеров.
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Также, есть сайт для проверки регулярок, regex101, может он тебе поможет, только учти что там бекслеш надо писать один раз, а не два: \s а не \\s
>>498271
Это верно, но код бы надо отформатировать, а то читать невозможно. Это можно сделать например на phpformatter.com
Молодец, верно.
>>498385
Не знаю.
>>498388
> Спецификация апача для махохистов, это все же справочник а не учебник.
Это не спецификация, а документация. Спецификация это например вот (и я ее читал частично, если это важно): http://www.w3.org/TR/CSS2/
mod_rewrite это модуль апача который позволяет до обработки запроса видоизменять (переписывать) URL по заданным тобой правилам.
.htaccess это файл задающий настройки Апача в конкретной папке. Ты можешь писать правила mod-rewrite как в конфиге Апача, так и в .htaccess.
>>498395
А надо хотя бы погуглить было.
>>498401
>>498400
> PHP Notice: Undefined variable: log in /home/2CjeWy/prog.php on line 14
> PHP Notice: Undefined variable: period in /home/2CjeWy/prog.php on line 19
Надо исправить
Если поставить кредит = 1000 то уходит в минус и врет: http://ideone.com/kay65w
>>498552
> Автор дает описание какой-то узкой темы, подразумевая что читатели уже имеют некоторые знания. Ну а у меня нет этих знаний.
Значит надо изучить эту тему. То же самое и с книгами: если ты не знаешь HTML и не работал с Апачом, то тебе трудно будет читать книги по PHP. Если ты не изучал интегралы, то и в квантовой физике не разберешься. Это так везде.
Другой вопрос, что авторы туториалов должны четко писать какие именно знания нужны для чтения их статьи.
> Мои претензии к учебным материалам
да, ты прав, в сети много некачественных материалов. Но с другой стороны, часто проблемы в непонимании из-за того что люди не выучили какие-то более базовые вещи, а берутся сразу за сложные.
Можно ли это изменить? Да, можно. Начни писать хорошие, понятные статьи, например ты мог бы завести блог (это бесплатно, например на сайте вордпресса), и когда тебе удается разобраться в чем-то или решить какую-то сложную проблему, писать туда маленькую заметку (с нужными ссылками и объяснениями). Заодно это помогло бы тебе в голове разложить все по полочкам. Гугл проиндексирует твою статью и может позже она появится в поиске.
> Мне жаль времени, которое я трачу на поиск, осмысление и упорядочивание сбивчивой информации
Без труда и рыбку не выловить, привыкай, так будет и дальше.
> У тебя кстати в твоих уроках неплохо получается соответствовать моим требованиям
это потому что я пытаюсь их читать как новичок и отмечаю непонятные места.
> Да потому что нигде об этом не сказано, и мне пришлось гадать, как оно работает.
Ну вот видишь, ты мне только что объяснил, что это не редирект, а переписывание урла. Почему эти уважаемые господа, матерям которых я передаю привет, не соизволили сделать то же самое?
Справедливости ради, модуль называется «rewrite» и это переводится как «переписывание».
> Дальше-то что? Как мне здесь что-то найти? Я не знаю даже ключевых слов для поиска. Я не знаю про модуль mod_rewrite, про его команды/опции типа RewriteCond или RewriteRule. Какими должны быть мои действия?
Апач состоит из небольшого ядра и множества модулей. Соответственно документация точно так же разбита на документацию отдельных модулей.
Искать проще всего набрав в гугле apache docs <слово>, например:
http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=apache+docs+allowoverride
заметь что выдается ссылка на документацию нужного модуля, в данном случае core (ядро).
Но на практике самый сложный модуль с которым ты столкнешься, это mod_rewrite, а для остальных вещей достаточно статей такого уровня:
https://beget.ru/articles/htaccess
Молодец, верно.
>>498385
Не знаю.
>>498388
> Спецификация апача для махохистов, это все же справочник а не учебник.
Это не спецификация, а документация. Спецификация это например вот (и я ее читал частично, если это важно): http://www.w3.org/TR/CSS2/
mod_rewrite это модуль апача который позволяет до обработки запроса видоизменять (переписывать) URL по заданным тобой правилам.
.htaccess это файл задающий настройки Апача в конкретной папке. Ты можешь писать правила mod-rewrite как в конфиге Апача, так и в .htaccess.
>>498395
А надо хотя бы погуглить было.
>>498401
>>498400
> PHP Notice: Undefined variable: log in /home/2CjeWy/prog.php on line 14
> PHP Notice: Undefined variable: period in /home/2CjeWy/prog.php on line 19
Надо исправить
Если поставить кредит = 1000 то уходит в минус и врет: http://ideone.com/kay65w
>>498552
> Автор дает описание какой-то узкой темы, подразумевая что читатели уже имеют некоторые знания. Ну а у меня нет этих знаний.
Значит надо изучить эту тему. То же самое и с книгами: если ты не знаешь HTML и не работал с Апачом, то тебе трудно будет читать книги по PHP. Если ты не изучал интегралы, то и в квантовой физике не разберешься. Это так везде.
Другой вопрос, что авторы туториалов должны четко писать какие именно знания нужны для чтения их статьи.
> Мои претензии к учебным материалам
да, ты прав, в сети много некачественных материалов. Но с другой стороны, часто проблемы в непонимании из-за того что люди не выучили какие-то более базовые вещи, а берутся сразу за сложные.
Можно ли это изменить? Да, можно. Начни писать хорошие, понятные статьи, например ты мог бы завести блог (это бесплатно, например на сайте вордпресса), и когда тебе удается разобраться в чем-то или решить какую-то сложную проблему, писать туда маленькую заметку (с нужными ссылками и объяснениями). Заодно это помогло бы тебе в голове разложить все по полочкам. Гугл проиндексирует твою статью и может позже она появится в поиске.
> Мне жаль времени, которое я трачу на поиск, осмысление и упорядочивание сбивчивой информации
Без труда и рыбку не выловить, привыкай, так будет и дальше.
> У тебя кстати в твоих уроках неплохо получается соответствовать моим требованиям
это потому что я пытаюсь их читать как новичок и отмечаю непонятные места.
> Да потому что нигде об этом не сказано, и мне пришлось гадать, как оно работает.
Ну вот видишь, ты мне только что объяснил, что это не редирект, а переписывание урла. Почему эти уважаемые господа, матерям которых я передаю привет, не соизволили сделать то же самое?
Справедливости ради, модуль называется «rewrite» и это переводится как «переписывание».
> Дальше-то что? Как мне здесь что-то найти? Я не знаю даже ключевых слов для поиска. Я не знаю про модуль mod_rewrite, про его команды/опции типа RewriteCond или RewriteRule. Какими должны быть мои действия?
Апач состоит из небольшого ядра и множества модулей. Соответственно документация точно так же разбита на документацию отдельных модулей.
Искать проще всего набрав в гугле apache docs <слово>, например:
http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=apache+docs+allowoverride
заметь что выдается ссылка на документацию нужного модуля, в данном случае core (ядро).
Но на практике самый сложный модуль с которым ты столкнешься, это mod_rewrite, а для остальных вещей достаточно статей такого уровня:
https://beget.ru/articles/htaccess
> Вот я захотел узнать, как подменить урл в запросе.
> Дальше-то что? Как мне здесь что-то найти?
Ты ищешь в гугле «как подменить URL», находишь статьи разного качества, а потом в документации смотришь что делают использованные там директивы и таким образом понимаешь написанный в них код, а не бездумно его копируешь.
> Опять-таки констатирую, что я узнаю об этом остроумном и логичном решении не из оф.источников, а на форуме для инфантильных подростков-аутистов.
Потому что mod rewrite написан не специально для создания файлообменников, а для общих целей.
> Я не знаком с тем, что такое mod_rewrite. Есть ли мне смысл читать эту статью, если я не понимаю, что такое RewriteRule и RewriteCond, например, которые постоянно упоминаются в статье, и автор которой не снисходит до пояснений таких вещей?
В такой ситуации стоит погуглить что это либо заглянуть в документацию, если не боишься.
Я например набрал в гугле «что такое mod_rewrite» и ответ вполне адекватный:
> модуль расширения для программного обеспечения Apache, который позволяет перезаписывать URL. Правила перезаписи основываются на использовании регулярных выражений, которые позволяют проанализировать полученный URL адрес от клиента и преобразовать его в другой URL перед интерпретацией.
Ну и у тебя всегда остается возможность спросить непонятные вещи в треде у инфантильных аутистов.
Я думаю эта статья рассчитана на тех, кто уже исплоьзовал mod_rewrite но не разбираясь в нем, а например используя готовый код откуда-то. Соответственно, она объясняет как он работает.
> Надо бы качнуть пару учебников по информатике, запишу себе.
Могу посоветовать какой-нибдь учебник по сетевым технологиям для вузов. Будешь знать как работает интернет, и если придется админить что-нибудь, то пригодится.
> что делает каждый заголовок?
Потому что заголовки это часть HTTP и наверно предполагается что ты эту тему знаешь.
> Я знаю, что это есть где-то там на php.net
Этого там нету так как заголовки описаны в стандарте HTTP и PHP с Апачом просто передают их в браузер не читая.
Тебе надо бы прочесть хорошую статью про то, что такое HTTP и как он работает. Не знаю, где ее найти, попробуй чтонибудь из этого почитать:
http://xiper.net/learn/also-need-to-know/how-does-a-browser-HTTP-request
http://habrahabr.ru/post/215117/
http://www.intuit.ru/studies/courses/485/341/lecture/8182
После этого ты будешь готов прочесть описание заголвоков:
https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B8_HTTP
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2_HTTP
Конкретный заголовок можно также гуглить по названию.
Вот что надо знать:
— методы HTTP
— способы отправки формы (GET и POST)
— коды ответа 200, 301, 401, 403, 404, 500
— заголовки User-Agent, Referer, Content-Type
— что такое редирект
> Вот я захотел узнать, как подменить урл в запросе.
> Дальше-то что? Как мне здесь что-то найти?
Ты ищешь в гугле «как подменить URL», находишь статьи разного качества, а потом в документации смотришь что делают использованные там директивы и таким образом понимаешь написанный в них код, а не бездумно его копируешь.
> Опять-таки констатирую, что я узнаю об этом остроумном и логичном решении не из оф.источников, а на форуме для инфантильных подростков-аутистов.
Потому что mod rewrite написан не специально для создания файлообменников, а для общих целей.
> Я не знаком с тем, что такое mod_rewrite. Есть ли мне смысл читать эту статью, если я не понимаю, что такое RewriteRule и RewriteCond, например, которые постоянно упоминаются в статье, и автор которой не снисходит до пояснений таких вещей?
В такой ситуации стоит погуглить что это либо заглянуть в документацию, если не боишься.
Я например набрал в гугле «что такое mod_rewrite» и ответ вполне адекватный:
> модуль расширения для программного обеспечения Apache, который позволяет перезаписывать URL. Правила перезаписи основываются на использовании регулярных выражений, которые позволяют проанализировать полученный URL адрес от клиента и преобразовать его в другой URL перед интерпретацией.
Ну и у тебя всегда остается возможность спросить непонятные вещи в треде у инфантильных аутистов.
Я думаю эта статья рассчитана на тех, кто уже исплоьзовал mod_rewrite но не разбираясь в нем, а например используя готовый код откуда-то. Соответственно, она объясняет как он работает.
> Надо бы качнуть пару учебников по информатике, запишу себе.
Могу посоветовать какой-нибдь учебник по сетевым технологиям для вузов. Будешь знать как работает интернет, и если придется админить что-нибудь, то пригодится.
> что делает каждый заголовок?
Потому что заголовки это часть HTTP и наверно предполагается что ты эту тему знаешь.
> Я знаю, что это есть где-то там на php.net
Этого там нету так как заголовки описаны в стандарте HTTP и PHP с Апачом просто передают их в браузер не читая.
Тебе надо бы прочесть хорошую статью про то, что такое HTTP и как он работает. Не знаю, где ее найти, попробуй чтонибудь из этого почитать:
http://xiper.net/learn/also-need-to-know/how-does-a-browser-HTTP-request
http://habrahabr.ru/post/215117/
http://www.intuit.ru/studies/courses/485/341/lecture/8182
После этого ты будешь готов прочесть описание заголвоков:
https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B8_HTTP
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2_HTTP
Конкретный заголовок можно также гуглить по названию.
Вот что надо знать:
— методы HTTP
— способы отправки формы (GET и POST)
— коды ответа 200, 301, 401, 403, 404, 500
— заголовки User-Agent, Referer, Content-Type
— что такое редирект
Вас там двое, или ты забываешь и по два раза отвечаешь на одни и те же вопросы?
>Могу посоветовать какой-нибдь учебник по сетевым технологиям для вузов.
О, давай.
Я скачал пока информатику Грошева. Еще советуют Седжвика, но не знаю насколько он продвинутый, и примеры там на c++.
> Потом в планах перенос процесса загрузки на хрупкие плечи аякса
А ты яваскрипт изучил? Если нет, то придется начать с основ. У нас кстати и задачки на него есть, много.
>>498746
Задачки от Опа в первом посте треда
>>499061
Не надо делать копию файла. Надо сделать переписывание URL в mod_rewrite чтобы при обращении по определенному URL отдавался нужный файл.
>>499099
В mySQL кроме MyISAM и InnoDB ничего и нет, другие типы на практике не используются.
>>499106
Яваскрипт (или jQuery) человек выучил, а вот уметь структурировать программу не умеет, пишет все длинными простынями, использует глобальные переменные, от знаков $ аж рябит в глазах, копипаста на копипасте, плюс смешивает разные стили и пишет непонятные вещи.
Код плохой, в общем.
> var onLoad = function(e){
По моему function onLoad(e) читабельнее
> var GlobalHovers = new Function()
зачем Function?
> \tif(data.body.onair) {
> if(data.body.onair.timeout) {
Я сам не знаю есть такая переменная или нет, поставлю тут два ифа
> a#reminder_send
«a» тут лишнее, так как id однозначно указывает на элемент, алсо мне не нравится такой стиль:
> $('a#reminder_send').live("click", GlobalHovers.sendReminder);
(кстати live устарел)
А нравится такой, олдскульный из 90-х:
<a onclick="doSomething(...); return false">
Почему:
— с первого взгляда понятно что произойдет при клике, можно перейти к функции, не надо читать 20 яваскрипт файлов чтобы найти обработчик (серьезно, вот этот подход с навешиванием обработчиков на больших сайтах превращается в ад, я сталкивался, причем со временем никто не может сказать какие обработчики используются, а какие уже нет)
— обработчик навешивается вместе с появлением ссылки на странице. Нет такого, что ссылка отображена, но еще не работает (в случае если яваскрипт ненавязчивый и страница работает без него, это не проблема, но на практике такое редко бывает)
Вы спросите, почему везде пишут не как я советую, а наоборот? Потому что давно один популярный фронтендщик написал статью, как надо отделять JS код от HTML и ее начали перепощивать:
https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BD%D0%B0%D0%B2%D1%8F%D0%B7%D1%87%D0%B8%D0%B2%D1%8B%D0%B9_JavaScript
https://en.wikipedia.org/wiki/Unobtrusive_JavaScript
http://habrahabr.ru/post/25991/
http://alistapart.com/article/behavioralseparation
Сама идея об ненавязчивом яваскрипте и прогрессивном улучшении отличная. Идея о разделении HTML и JS тоже. Идея помечать поведение элемента с помощью класса хорошая. Но ведь большинство людей не поняли этих концепций (например что страница должна работать и без яваскрипта), а вывели для себя только одну вещь (верстальщики, что с них возьмешь):
onclick это плохо
$('...').click и $(document).ready это прогрессивно, модно и молодежно
При этом о том, как этот код потом поддерживать никто конечно не думал и теперь в каждом проекте мы видим кучу лапши как у анона по ссылке. Так и живем.
Заметьте, кстати, что понятность кода можно реализовать и без атрибута onclick. Можно например договориться, что класс widget обозначает элементы, к которым привязаны обработчики:
<div class="widget">...
// JS:
$('.widget).each(....);
Лишь бы это было легко читать и поддерживать (добавлять новые виджеты, искать где этот виджет используется, искать какие обработчики навешиваются на этот див и тд).
Я сам хорошего и поддерживаемого кода на jQuery не видел ни в одном проекте. Так как понять используется код или нет, трудно, его никто никогда не удаляет, а только добавляет.
> Потом в планах перенос процесса загрузки на хрупкие плечи аякса
А ты яваскрипт изучил? Если нет, то придется начать с основ. У нас кстати и задачки на него есть, много.
>>498746
Задачки от Опа в первом посте треда
>>499061
Не надо делать копию файла. Надо сделать переписывание URL в mod_rewrite чтобы при обращении по определенному URL отдавался нужный файл.
>>499099
В mySQL кроме MyISAM и InnoDB ничего и нет, другие типы на практике не используются.
>>499106
Яваскрипт (или jQuery) человек выучил, а вот уметь структурировать программу не умеет, пишет все длинными простынями, использует глобальные переменные, от знаков $ аж рябит в глазах, копипаста на копипасте, плюс смешивает разные стили и пишет непонятные вещи.
Код плохой, в общем.
> var onLoad = function(e){
По моему function onLoad(e) читабельнее
> var GlobalHovers = new Function()
зачем Function?
> \tif(data.body.onair) {
> if(data.body.onair.timeout) {
Я сам не знаю есть такая переменная или нет, поставлю тут два ифа
> a#reminder_send
«a» тут лишнее, так как id однозначно указывает на элемент, алсо мне не нравится такой стиль:
> $('a#reminder_send').live("click", GlobalHovers.sendReminder);
(кстати live устарел)
А нравится такой, олдскульный из 90-х:
<a onclick="doSomething(...); return false">
Почему:
— с первого взгляда понятно что произойдет при клике, можно перейти к функции, не надо читать 20 яваскрипт файлов чтобы найти обработчик (серьезно, вот этот подход с навешиванием обработчиков на больших сайтах превращается в ад, я сталкивался, причем со временем никто не может сказать какие обработчики используются, а какие уже нет)
— обработчик навешивается вместе с появлением ссылки на странице. Нет такого, что ссылка отображена, но еще не работает (в случае если яваскрипт ненавязчивый и страница работает без него, это не проблема, но на практике такое редко бывает)
Вы спросите, почему везде пишут не как я советую, а наоборот? Потому что давно один популярный фронтендщик написал статью, как надо отделять JS код от HTML и ее начали перепощивать:
https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BD%D0%B0%D0%B2%D1%8F%D0%B7%D1%87%D0%B8%D0%B2%D1%8B%D0%B9_JavaScript
https://en.wikipedia.org/wiki/Unobtrusive_JavaScript
http://habrahabr.ru/post/25991/
http://alistapart.com/article/behavioralseparation
Сама идея об ненавязчивом яваскрипте и прогрессивном улучшении отличная. Идея о разделении HTML и JS тоже. Идея помечать поведение элемента с помощью класса хорошая. Но ведь большинство людей не поняли этих концепций (например что страница должна работать и без яваскрипта), а вывели для себя только одну вещь (верстальщики, что с них возьмешь):
onclick это плохо
$('...').click и $(document).ready это прогрессивно, модно и молодежно
При этом о том, как этот код потом поддерживать никто конечно не думал и теперь в каждом проекте мы видим кучу лапши как у анона по ссылке. Так и живем.
Заметьте, кстати, что понятность кода можно реализовать и без атрибута onclick. Можно например договориться, что класс widget обозначает элементы, к которым привязаны обработчики:
<div class="widget">...
// JS:
$('.widget).each(....);
Лишь бы это было легко читать и поддерживать (добавлять новые виджеты, искать где этот виджет используется, искать какие обработчики навешиваются на этот див и тд).
Я сам хорошего и поддерживаемого кода на jQuery не видел ни в одном проекте. Так как понять используется код или нет, трудно, его никто никогда не удаляет, а только добавляет.
Вот нашел такой пример
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>
что здесь означает:
1) ($input, 2) эта двойка
2)
[$rand_keys[0]]
[$rand_keys[1]]
нуль и единица
Ошибка в чем-то другом.
>>499393
Поиск совпадений и различий делают через джойны.
>>499425
Сначала лучше HTML/CSS освоить. У нас есть в Оп посте хорошие задания по ним, которые проверяют хорошо ли ты их понял.
JS лучше изучать позже, хороший учебник это learn.javascript.ru, задачки есть в ОП посте.
>>499477
Верно
>>499515
Можно отладчиком пройти по коду и посмотреть что вызвается. Либо вардампов натыкать.
>>499521
Памяти бери побольше (или с возможностью расширить), экран побольше, клавиатура с функциональными клавишами.
ОС лучше linux/MacOS
Если ты богатый и хватает на макбук или макбук эйр, можешь брать, многие именно на них кодят, они качественные и ОСь там линуксоподобная, консоль нормальная, но софт более платный и дорогой чем под винду.
Хотя конечно на большом мониторе и клавиатуре удобнее чем на ноутбучном.
>>499591
На каждом втором сайте. Но обычно его настраивают админы. Но тебе как разработчику полезно знать его особенности и возможности чтобы не оказалось что какую-то вещь сделать не получится.
Апач тоже используется и его тоже надо знать.
>>499603
2-3-4 недели
>>499680
> Хотя ради счетчика может и стоит пойти на извращения.
Счетчик делается с использованием X-Sendfile то есть запускается срикпт, учитывает скачивание, и передает заголовок серверу чтобы тот отдал файл. кстати, так можно отдавать файлы которые находятся вне веб-папки и напрямую не доступны, по моему.
>>499708
Это неэффективно. Смотри, доупстим картинка имеет размер 1000×2000 , а превьюшка 100×200. Во сколько раз картинка больше превьюшки? По ширине в 10, а вот по числу пикселей в 100 раз. Разница по весу легко может быть раз в 20 и более.
Также, браузеры не очень качественно уменьшают картинки, а если на странице много масштабированных картинок то некоторые бразеры еще и тормозить начинают (распаковка картинок не бесплатная).
Ну и наконец сложно ли сделать превьюшки? да это несколько строчек кода и полчаса работы. Стоит ради этого ухудшать жизнб пользователям? Конечно нет.
Ну и так как вы начинающие то вам все равно надо учиться это делать.
Ошибка в чем-то другом.
>>499393
Поиск совпадений и различий делают через джойны.
>>499425
Сначала лучше HTML/CSS освоить. У нас есть в Оп посте хорошие задания по ним, которые проверяют хорошо ли ты их понял.
JS лучше изучать позже, хороший учебник это learn.javascript.ru, задачки есть в ОП посте.
>>499477
Верно
>>499515
Можно отладчиком пройти по коду и посмотреть что вызвается. Либо вардампов натыкать.
>>499521
Памяти бери побольше (или с возможностью расширить), экран побольше, клавиатура с функциональными клавишами.
ОС лучше linux/MacOS
Если ты богатый и хватает на макбук или макбук эйр, можешь брать, многие именно на них кодят, они качественные и ОСь там линуксоподобная, консоль нормальная, но софт более платный и дорогой чем под винду.
Хотя конечно на большом мониторе и клавиатуре удобнее чем на ноутбучном.
>>499591
На каждом втором сайте. Но обычно его настраивают админы. Но тебе как разработчику полезно знать его особенности и возможности чтобы не оказалось что какую-то вещь сделать не получится.
Апач тоже используется и его тоже надо знать.
>>499603
2-3-4 недели
>>499680
> Хотя ради счетчика может и стоит пойти на извращения.
Счетчик делается с использованием X-Sendfile то есть запускается срикпт, учитывает скачивание, и передает заголовок серверу чтобы тот отдал файл. кстати, так можно отдавать файлы которые находятся вне веб-папки и напрямую не доступны, по моему.
>>499708
Это неэффективно. Смотри, доупстим картинка имеет размер 1000×2000 , а превьюшка 100×200. Во сколько раз картинка больше превьюшки? По ширине в 10, а вот по числу пикселей в 100 раз. Разница по весу легко может быть раз в 20 и более.
Также, браузеры не очень качественно уменьшают картинки, а если на странице много масштабированных картинок то некоторые бразеры еще и тормозить начинают (распаковка картинок не бесплатная).
Ну и наконец сложно ли сделать превьюшки? да это несколько строчек кода и полчаса работы. Стоит ради этого ухудшать жизнб пользователям? Конечно нет.
Ну и так как вы начинающие то вам все равно надо учиться это делать.
То есть, я хочу сказать что сделать превьюшки (если ты знаешь как и написал или нашел библиотеку для этого) несложно. Ты же просто боишься или ленишься изучать новое и начинаешь придумывать причины почему этого можно не делать.
>>499741
Разумный вопрос. Действительно, на хостинге может его не быть. Давай тогда сделаем для тебя задачу чуть интереснее, сделай чтобы при отстутсвии модуля происходил возврат к отдаче средствами PHP.
Для взаимодействия с Апачом есть такие функции: http://php.net/manual/ru/ref.apache.php
Там есть функция, возвращающая список модулей Апача: http://php.net/manual/ru/function.apache-get-modules.php
С ее помощью ты можешь определить наличие модуля.
>>499846
Там же код доступен. Алсо у меня это какая-то покадровая анимация, квадратик дергается рывками.
>>499876
Слим по умолчанию не должен добавлять кеширующие заголовки.
Ты можешь проверить их наличие/отсутствие инспектором на вкладке NEtwork, Ctrl + Shift + I
У тебя кеш опкода вроде APC, XCache не установлен?
Кеширует браузер наверно, я сталкивался с очень агрессивным кешированиям в старой Опере и в некоторых версиях Хрома. В случае сомнений можно нажать Ctrl + Shift + Del и почистить кеш.
> Я же думал, что стоит нажать ctrl + f5 (или ctrl + shift + r на ноуте), как страница принудительно перезагрузится, запросив контент у сервера.
Так и должно быть
> Или слим хранит кэш прям на сервере?
Нет
>>499877
Нет
>>499884
Отстойный хостер, экономит наверно на дисковой нагрузке.
>>499882
Они для разных вещей и они оба нужны.
>>499902
Оп, но только не этого треда.
>>499913
У вконтакте могут быть разные хеши и средства защиты от автоматизированного логина. Я советую изучать курл на чем-то более открытом, например на АПИ яндекс карт:
https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/About-docpage/
Если ты хочешь работать именно с вконтакте, то у него есть АПИ:
http://vk.com/dev
http://vk.com/dev/apiusage
там не должно быть проблем с непонятными хешами.
Также, изучил ли ты основы HTTP, знаешь что такое методы, заголовки, коды ответа? Это надо знать. Также, читал ли ты мануал?
http://php.net/manual/ru/function.curl-setopt.php
надо бы пролистать по диагонали.
То есть, я хочу сказать что сделать превьюшки (если ты знаешь как и написал или нашел библиотеку для этого) несложно. Ты же просто боишься или ленишься изучать новое и начинаешь придумывать причины почему этого можно не делать.
>>499741
Разумный вопрос. Действительно, на хостинге может его не быть. Давай тогда сделаем для тебя задачу чуть интереснее, сделай чтобы при отстутсвии модуля происходил возврат к отдаче средствами PHP.
Для взаимодействия с Апачом есть такие функции: http://php.net/manual/ru/ref.apache.php
Там есть функция, возвращающая список модулей Апача: http://php.net/manual/ru/function.apache-get-modules.php
С ее помощью ты можешь определить наличие модуля.
>>499846
Там же код доступен. Алсо у меня это какая-то покадровая анимация, квадратик дергается рывками.
>>499876
Слим по умолчанию не должен добавлять кеширующие заголовки.
Ты можешь проверить их наличие/отсутствие инспектором на вкладке NEtwork, Ctrl + Shift + I
У тебя кеш опкода вроде APC, XCache не установлен?
Кеширует браузер наверно, я сталкивался с очень агрессивным кешированиям в старой Опере и в некоторых версиях Хрома. В случае сомнений можно нажать Ctrl + Shift + Del и почистить кеш.
> Я же думал, что стоит нажать ctrl + f5 (или ctrl + shift + r на ноуте), как страница принудительно перезагрузится, запросив контент у сервера.
Так и должно быть
> Или слим хранит кэш прям на сервере?
Нет
>>499877
Нет
>>499884
Отстойный хостер, экономит наверно на дисковой нагрузке.
>>499882
Они для разных вещей и они оба нужны.
>>499902
Оп, но только не этого треда.
>>499913
У вконтакте могут быть разные хеши и средства защиты от автоматизированного логина. Я советую изучать курл на чем-то более открытом, например на АПИ яндекс карт:
https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/About-docpage/
Если ты хочешь работать именно с вконтакте, то у него есть АПИ:
http://vk.com/dev
http://vk.com/dev/apiusage
там не должно быть проблем с непонятными хешами.
Также, изучил ли ты основы HTTP, знаешь что такое методы, заголовки, коды ответа? Это надо знать. Также, читал ли ты мануал?
http://php.net/manual/ru/function.curl-setopt.php
надо бы пролистать по диагонали.
> Как реализовать "вложенность" шаблонов? У меня есть несколько шаблонов для разных типов файлов.
Способ 1 — сделать общий шаблон, а внутри в зависимости от типа файла подключать другой
Способ 2 — вынести шапку и подвал общего шаблона в отдельные файлы и подключать их
Копипасты конечно быть не должно.
Кстати в twig это гораздо удобнее делается, через наследование шаблонов.
> Как в sql делать сложные условия? Например у меня в базе хранится размер файла в байтах.
Это надо делать на стороне PHP, сделать функцию или метод и вызывать в шаблоне
> Что-то не могу разобраться. CASE вроде бы принимает только значения, не условия.
Есть вариант с условиями:
SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
http://www.mysql.ru/docs/man/Control_flow_functions.html
> Как подключить bootstrap или другой css/js фреймворк через композер?
Никак, установить руками в отдельную папку.
> Например, у меня там когда пользователь запрашивает несуществующий айди, его должно выкинуть 404
> header( "HTTP/1.1 404 Not Found" );
Ну так заголовки и статусная строка не показываются на экране. Ты должен еще и саму страницу вывести после этого.
Некоторые браузеры, Хром например, подсталяют свои страницы если есть код 404 а тела страницы нету.
В Слим незачем руками делать header так как там есть функция notFound для выдачи страницы ошибки: http://docs.slimframework.com/errors/404/
> прикрутить jqury/ui для драг-дропа, полосочка загрузки файла;
Что-то жирновато jQuery UI ради одной полоски тянуть. Попробуй без нее.
Насчет загрузки, есть плагины для этого, но ты должен сначала разобраться как это работает. Сделай отдельную страницу с чистым HTML и добейся чтобы при перетаскивании файла на ней выводилось имя и размер. А затем сделай чтобы эьтот файл отправлялся на сервер.
После этого можешь на сайт добавить либо свой код, либо готовый плагин.
Кстати, раньше, когда HTML5 еще только проектировался, делали так: при перетаскивании файла на страницу яваскрипт создавал огромный невидимый input type=file закрывающий страницу, который и принимал этот файл, а затем форма с ним отправлялась традиционным способом в ифрейм (чтобы страницу не перезагружать).
Сейчас конечно можно и на яваскрипте с аяксом это же сделать.
>>500648
По два раза, чтобы ты точно все запомнил.
> информатику Грошева
Там полкниги занимает описание работы в виндоуз, можешь почитать, но я думаю ты это знаешь и это не уровень программиста, это для торгового техникума больше пойдет.
Я могу посоветовать такое:
— учебник по алгоритмам и структурам данных: http://aliev.me/runestone/ думаю, будет полезен
— большой (почти 1000 страниц) учебник по сетевым технологиям: http://www.ozon.ru/context/detail/id/2409503/
> Как реализовать "вложенность" шаблонов? У меня есть несколько шаблонов для разных типов файлов.
Способ 1 — сделать общий шаблон, а внутри в зависимости от типа файла подключать другой
Способ 2 — вынести шапку и подвал общего шаблона в отдельные файлы и подключать их
Копипасты конечно быть не должно.
Кстати в twig это гораздо удобнее делается, через наследование шаблонов.
> Как в sql делать сложные условия? Например у меня в базе хранится размер файла в байтах.
Это надо делать на стороне PHP, сделать функцию или метод и вызывать в шаблоне
> Что-то не могу разобраться. CASE вроде бы принимает только значения, не условия.
Есть вариант с условиями:
SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
http://www.mysql.ru/docs/man/Control_flow_functions.html
> Как подключить bootstrap или другой css/js фреймворк через композер?
Никак, установить руками в отдельную папку.
> Например, у меня там когда пользователь запрашивает несуществующий айди, его должно выкинуть 404
> header( "HTTP/1.1 404 Not Found" );
Ну так заголовки и статусная строка не показываются на экране. Ты должен еще и саму страницу вывести после этого.
Некоторые браузеры, Хром например, подсталяют свои страницы если есть код 404 а тела страницы нету.
В Слим незачем руками делать header так как там есть функция notFound для выдачи страницы ошибки: http://docs.slimframework.com/errors/404/
> прикрутить jqury/ui для драг-дропа, полосочка загрузки файла;
Что-то жирновато jQuery UI ради одной полоски тянуть. Попробуй без нее.
Насчет загрузки, есть плагины для этого, но ты должен сначала разобраться как это работает. Сделай отдельную страницу с чистым HTML и добейся чтобы при перетаскивании файла на ней выводилось имя и размер. А затем сделай чтобы эьтот файл отправлялся на сервер.
После этого можешь на сайт добавить либо свой код, либо готовый плагин.
Кстати, раньше, когда HTML5 еще только проектировался, делали так: при перетаскивании файла на страницу яваскрипт создавал огромный невидимый input type=file закрывающий страницу, который и принимал этот файл, а затем форма с ним отправлялась традиционным способом в ифрейм (чтобы страницу не перезагружать).
Сейчас конечно можно и на яваскрипте с аяксом это же сделать.
>>500648
По два раза, чтобы ты точно все запомнил.
> информатику Грошева
Там полкниги занимает описание работы в виндоуз, можешь почитать, но я думаю ты это знаешь и это не уровень программиста, это для торгового техникума больше пойдет.
Я могу посоветовать такое:
— учебник по алгоритмам и структурам данных: http://aliev.me/runestone/ думаю, будет полезен
— большой (почти 1000 страниц) учебник по сетевым технологиям: http://www.ozon.ru/context/detail/id/2409503/
О, еще это есть: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D1%8B:_%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B,_%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8_%D0%B8_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B
Это реально хардкорный учебник и по нему учатся студенты на программе Computer Science в западных вузах. То есть книга мирового уровня. Но ее лучше читать после алгоритмов, а то слишком сложно будет.
мануал читал? http://php.net/manual/ru/function.array-rand.php
2 значит выбрать 2 случайных ключа и вернуть массив с этим 2 ключами
0, 1 берут первый и второй ключи из этого массива
попробуй сделать var_dump($rand_keys); и увидишь
Тебя: https://github.com/V3N0m21/StudentList я по моему уже проерял? Последний коммит 5 дней назад ведь
Тебя: https://github.com/nsdvw/file-sharing/commits/master проверю чуть позже, делай задачу дальше, а если все сделал то бери следующую
и надо ли в обязательном порядке паралельно изучать бд?
Чувак, я зная только HTML и CSS на базовом уровне за две недели около 750$ заработал. Так что все в твоих руках.
Да пожалуйста. Правда тут не все видно, ну да похуй. Просто копировал сайты с помощью проги специальной и потом всякие HTML теги ненужные удалял и все следы того, что этот сайт пизженный. Работа - не бей лежачего, в день часика 3 уходило. Жаль только потом у их фирмы какая-то хуйня случилась и вся эта лафа закончилась.
Дык там суть то во внешнем виде и была. Прога эта качала кучу HTML страничек, которые я прогонял через несколько регулярок в NotePad++ и потом еще руками доправлял что осталось.
Тоесть помимо php надо много чего знать, благо ооп более менее понимаю.
Для норм работы надо знать HTML 5 CSS PHP MySQL, Java Script все так?
Можно какую то технологию изключить?
Что если ограничится PHP? или это никому не нужно?
HTML + PHP думаю полюбому осилю, CSS маст хев? жабу пока не хочу трогать вообще.
Посоветуйте маст хев и пару учебников
HTML + CSS вместе учатся, там особо осиливать нечего. PHP, JS и MySQL хотя бы на базовом уровне знать надо, чтобы джуном устроиться. А там уже дальше будешь плясать в ту сторону, которая тебе больше понравится. Java тебе тут по сути вообще не нужна будет, т.к. она не особо под веб заточена.
Ну смотри, кажется на первый взгляд что это много-много всего, но это совсем не так.
HTML и СSS это разметка, там ничего не надо особо учить, просто практика и понимание как оно работает, дальше используешь справочники и гуглишь решения как что-то лучше сделать. Всё довольно просто и подводных камней мало, тебе с головой хватит двух курсов htmlacademy, который базовый и продвинутый интенсивы. шаблоны для практики найдёшь в верстка-треде в воркаче, после них сможешь уже верстать что угодно
Дальше что у нас? PHP, MySQL, JS. На PHP в треде ты учишь программирование в целом, писать грамотный код без совсем ужасных и очень плохих решений, чтобы он был лакончиным и его могли прочитать другие, ну и не плодить сущностей, костылей, оставлять дыры и много чего ещё. Тут тебе многие помогут и подскажут. Ты не только будешь язык учить, но и научишься писать код правильнее, а это важно на любом языке. MySQL - надо обязательно, все SQLы похожи между собой, уметь работать с БД нужно. И это на самом деле довольно просто, достаточно понимать в целом работу и этого хватит с головой после небольшой практики.
JS - вот допустим ты уже знаешь HTML, CSS, PHP, MySQL и теперь надо выучить JS. Но на самом деле тебе особо не надо его учить, синтаксис у него простой, а для разработки голый JS никто почти не использует, благодаря HTML и CSS ты уже знаком с тем, что такое DOM и как с ним работать, после этого открываешь jQuery какой нибудь + Bootstrap и используешь.
Благодаря jQuery и другим фреймворкам и всяким Bootstrap фронтенд писать довольно легко, для этого надо лишь понимать ООП и уметь в программирование в целом, большинство команд там так и выглядят как надо $('div').hide('fast') для того чтобы быстро спрятать блок лол, а показать unhide. Короче, это просто использование готовых решений на HTML/CSS, писать там тонны кода нинужна в большинстве своем.
как-то сумбурно вышло, пойду поем лучше
Где-то 6 месяцев, если будешь каждый день решать задачки.
>но это совсем не так.
Ой, а почему сайт на хостинге не запускается?
Ой, что значит Error 503?
Magento? Разберусь, я с подобным работал (wordpress).
Ой, как это хостинге на линуксе?
git push --force
Но ведь всё это гуглится за 30 секунд.
кроме магенты впрочем, любой вопрос по ней тоже гуглится за 30 секунд
Гуглится за 30 секунд, чтобы разобраться - 3 часа. Впрочем, попасть в контору, где ты будешь править хедеры в вордпресе это не помешает.
Например у меня не подключаются стили, если они не лежат в корне сайта.
Работает:
public_html/index.php
public_html/css/style.css
Не работает:
public_html/folder/index.php
public_html/folder/css/style.css
Выдает forbidden, стили не подключаются.
Вручную большой гемор делать это: https://www.digitalocean.com/community/tutorials/apache-ubuntu-14-04-lts-ru
Я делаю через LAMP-stack, там есть админка, где всякие операции вроде виртуального хоста в пару кликов делаются.
Стоп, ты сейчас серьезно?
Тебе серьезно надо 3 часа, чтобы понять что такое 503, как развернуть nginx,php, mysql и настроить порты на vps и подобное?
Я уж молчу о том, что видео гайд по гиту занимает полтора часа, где всё показывают и объясняют для совсем уж тугих ребят.
Тут на все эти задачи суммарно 3 часа не надо, сириусли.
Спасибо за ссылку конечно, но я именно по ней и настраивал хосты.
Видимо нужно прописать еще что-то дополнительное, не знаю только что и по какому слову это гуглить.
Двачую, бро, я на wp могу сайт за пять минут сделать, пока эти бараны полгода учат свой симфони, лол.
Не знаю, может быть и мошенники. Но мне как-то похуй было если честно, т.к. за такую ерундовую работу платили они очень щедро. Чувак кстати русский был, но жил в США, поэтому и платил долларами.
Кек, ты или гений, или не сталкивался с чем-то сложнее хоумпейджа.
>гайд по гиту занимает полтора часа
И потом такие пишут push --force, ведь они всё схватывают не лету.
Но ведь если WP удовлетворяет требованиям по сайту, то почему бы на нем сайт не сделать по-быстрому?
Я не знаю, что они там спиздить могли, т.к. копировал я в основном какие-то обосанные сайты времен веб 1.0.
- Интернет магазин? Наш специалист предлагает сделать его на движке Вордпресс? Слышали про такой? На нём ещё википедия работает. Будет корзина, аджакс. Как бонус - делаем админку.
Копируют дизайн, делают похожий домен, рассылают спам-письма с просьбой что-то там на сайте сделать - воруют логины, пароли, куки, аллаха.
Работал в такой конторе, менеджер продавал клиентам эту самую админку, возможность загружать не только jpg но и gif. Отлично расходились слайдеры, вип-клиентам продавал бекграунд-видео, и всё это по цене, за которую обычные макаки делают целый сайт. Менеджер от бога.
Но интернет-магазин лучше на специализированной CMS делать, например Opencart. И если клиента все устраивает и он готов за это платить, то в чем проблема?
>>500884
А, ну может быть, хз. Мб их повязали там в итоге, лол. Ну я подозревал, что там явно что-то не чисто. Но лишние вопросы не задавал.
>>500876
Ребята, вы конечно извините, но у вас РЮСКЕЙ ДУХ приключился, когда если кто-то может это сделать, то у вас ВРЁТИ, ВСЁ ВРЁТИ, ТЫ ИЛИ ГЕНИЙ ИЛИ ПИЗДИШЬ ПИДАР. Знаете, такое желание доказать что вам врёти и опустить человека с которым вы в чем-то не согласны.
Но реально, в этих задачах нет ничего сложного. Скорее всего вы просто до этого слабо с пекой были знакомы, поэтому они и показались вам сложными.
>И если клиента все устраивает и он готов за это платить, то в чем проблема?
Ни в чём, только мы же говорим про работу девелопером, а делать месяцами магазины на ВП - плохая практика.
>Скорее всего вы просто до этого слабо с пекой были знакомы
У меня в офесе сидят такие стажёры, 2-3 часа ищут, как строчку в хедере престашопа поменять. Ты сейчас, получается, назвал их всех отсталыми?
Что плохого? Не все такие дохуя амбициозные и хотят быть супирпупирпогромистами, разрабатывая какие-то архисложные системы. Для некоторых это просто способ заработка и ничего более.
Не встречал пока таких. Все знакомые погромизды хотят работать в гугл, учат всякие там node.js, angular, ruby, бутстрап в бутстрапе, хероку, бигдата, и всё это на 1-м году работы.
И не могут написать FizzBuzz
Не знаком с пекой - отсталый?
Перестань бросаться в крайности как школьник. Я говорю что они слабо знакомы с пекой и гуглом в целом, может они до этого ничего кроме рутрекера и вконтача не видели в интернетах то, ну уровень знания пеки как у пользователя обычного и только недавно начали всё постигать.
Просто я сказал со своего опыта о том, что это задачи легкие и как по мне странновато что кто-то тратит на них по 3 часа. Кто-то вон и генту ставит неделю, хотя там такой хендбук, что с первого раза поставить можно без проблем.
Мне надо определить, с какого браузера пришел юзер.
Как правильно распарсить строку, которую возвращает HTTP_USER_AGENT?
Там какое-то говно типа Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
Как здесь понять, хром это или мозилла?
Ну да в принципе, ты прав. Но темы явно родственные.
>>500897
Ну вот я не хочу работать в гугл. Вернее я себя вообще в роли рядового погромиста не вижу, но при этом хочу работать в IT сфере. В идеале конечно свой бизнес начать. Но понятное дело, что какое-то время все равно придется в офисе поработать и опыта поднабраться, а так же денежек.
>Я говорю что они слабо знакомы с пекой и гуглом в целом
Как там в 2010? Алсо, я не часто встречаю людей, которые впитывают информацию с первого раза и безошибочно её делают, поэтому твои заявления про 30 секунд на разобраться в ошибке - прикрытое бахвальство.
Мудак ебаный блять, как мне в коде распарсить эту строку и определить браузер?
хуй с ним, все равно новый пилить пора
Я вот честно тебя спрошу - что ты пытаешься доказать? Какое хвастовство, о чем ты? На анонимной борде? Да этот тред уплывёт через несколько часов и ты никогда не узнаешь кто я и где, а я не узнаю про тебя. В этом смысла даже никакого нет, я уже не школьник на летних каникулах, а давно реализовавший себя человек, который кстати частенько в разделе помогает, а не просто троллит про раби.
И да, я ещё тот дигрод, на форчане и реддите с пруфами сидят вчерашние школьники, которые за пару лет смогли стать такими крутыми что пошли на интернатуру в гуглы, фейсбуки и уберыа потом и на работу, прошли собеседование в несколько часов по алгоритмам и другим вещам, а ты мне о сложности гита и смены строчки в хедере вордпресса.
Вот и думай теперь, на этом и закончим.
Извини, но твой поток сознания невозможно читать. Стареешь небось?
.parent {
.child_1 {
...
}
.child_2 {
...
}
}
Спасибо
Не спеши это использовать, даже гиганты вроде facebook и twitter обходят их стороной. Там недостатков не меньше, чем преимуществ.
for($i=1;$i<=100;++$i){echo (''==($x=($i%5==0?'Fizz':'').($i%3==0?'Buzz':''))?$i:$x).'<br>';}
При твоём решении возможны ситуации, когда делимость на три проверяется дважды, а это не круто.
Зато коротко и стильно.
Сосни хуйца, девочка.
Чувак скачивал сайты через программу наподобии Teleport, и потом убирал следы того что это телепорченая поебень. Для простых сайтов без бэкенда, на html+css+js, это работает отлично. Так к примеру можно выкачивать демки платных макетов(правда многие сайты знают как распозновать подобных пиратов и банят по ИП за это). Но если сайт имеет сколь либо весомый бэкенд, то в результате получается хуита.
Так что тут либо анон наибал тех горе клиентов, либо горе клиенты наебывали сами себя.
Тебе необходимо добавить сверку роста уже вызываемых одноклассников с ростом анона и сделать так чтобы код подсчитал количество одноклассников что оказались выше Анона.
Спс няша, схороню и буду по твоему алгоритму изучать, сначала надо верстку осилить, думаю там все просто. Верстка же это уже какой никакой доход?
А вот как учить? книжки справки? и что будет лучше книжка типа C++ Язык программирования или C++ за 28 дней?
Кстати Я выбрал веб потому что думаю что в C++ надо скилл немного больше, и портфолио годное что по времени долго будет, думаю вкатится в веб, а там уже может и еще че.
Кодировка это таблица которая говорит какой символ каким кодом обозначается. Соответственно русская буква А например в разных кодировках обозначается разными кодами. Например:
в cp1251 это С0 (я пишу в 16-чной системе, в 10-чной это будет 192)
в utf-8 это D0 90 (тут используется 2 байта для одной буквы так как utf-8 это многобайтовая кодировка)
в ISO 8859-5 это B0
в cp866 это 80
Браузер не видит букв, компьютер хранит и передает файлы в виде байт, то есть чисел. Соответственно если не знать кодировку то непонятно каким буквам соответствуют эти числа.
С латинницей проще, так как она почти во всех кодировках обозначается одними и теми же кодами и потому почти всегда отображается правильно. Например латинская буква A во всех 4 упомянуты кодировках обозначается кодом 41 (65 если в десятичной системе).
В общем, компьютер все, включая текст, хранит в виде чисел и люди успели за историю развития компьютеров придумать кучу кодировок, потому надо указывать какая именно используется.
Ты должен использовать всегда utf-8 без BOM.
Права на файлы поставь 0666
>>500829
Конечно неожиданные моменты есть, но если ты знаешь как решать такие проблемы, как отлаживать, и понимаешь что там происходит, то ты разберешься. А во второй раз уже без ошибок все сделаешь.
>>500892
Ну так эти стажеры ведь учились не в нашем треде, верно?
>>500882
Пусть делает.
>>500873
Я могу сделать блог за 2 минуты, зарегистрировав аккаунт на сайте вордпресса, и что дальше?
>>500876
Гит надо изучать не на работе, а например во время учебы, мы анонов учим ему.
>>500885
> по цене, за которую обычные макаки делают целый сайт
До кризиса «обычный сайт» стоил около 3000 рублей, как я помню, в той же фабрике сайтов. Работают там в основном студенты.
>>500893
Только ты с ума сойдешь от такой работы через полгода, если ты конечно не робот которому нравятся повторяющиеся механические действия. Что же ты анонов не предупреждаешь. Алсо, насколько я знаю, в тех конторах где нет высоких требований к знаниям, практикуются переработки, штрафы за опоздания и прочий эффективный менеджемнт и тимбилдинг, аноны, имейте в виду, лучше сейчас выучить побольше чем потом на своей шкуре испытывать атмосферу макдональдса.
>>500900
Ты сейчас вытекать из треда начнешь. Очевидно что для человека знакомого с HTTP и отладчиком решение проблемы заголовков займет одно время, а для незнакомого совсем другое. Вообще, если человек теории не знает то в интернете он ответ быстро не найдет и ему остается только пробовать все способы в надежде что что-нибудь заработает.
>>500915
Браузер андроида тоже по моему Safari содержит, сомнительная таблица. Алсо для разбора User Agent должна быть какая-то библиотека.
>>500921
Уплывать он еще пару недель будет.
>>500923
Хочу прокомментировать про LESS. Сколько я не видел код который пишут в «CSS шаблонизаторах», чаще всего он выглядит как
div {
span {
div {
То есть этим людям рано за LESS браться, они еще CSS и как правильно писать селекторы не осилили (для тех кто не понял: селекторы типа div span div не читаемы и ломаются при малейшей правке в верстке).
>>500933
Потому что на практике большинство их возможностей не требуется.
>>501140
Есть список каких-то задач https://github.com/codedokode/pasta/blob/master/interview-tasks.md
На средней позиции попросят рассказать про опыт работы, достижения, что именно ты сделал, а вопросы мне кажется должны быть в стиле «как сделать такую шткук» или «как поступать в такой ситуации»
>>501141
Я хочу прокомментировать, что скачивание платных макетов может аукнуться, так как на западе серьезное отношене к авторскому праву и соответственно если будет суд то нарушитель получит хороший штраф. И потому американские заказчики боятся нарушить права как огня, и требуют обычно чтобы все фотографии и макеты были как-то официально куплены либо специально для них сделаны.
>>501157
В Оп посте есть годные задачи на HTML/CSS
Си++ ты будешь полгода-год минимум учить, это сложный язык. За 28 дней его выучить можно только если ты гений-вундеркинд.
>>501168
Поддерживается, просто по умолчанию ты создаешь изображение с черным фоном и на этот черный фон накладываешь прозрачную картинку. Надо создавать изначально прозрачную картинку, плюс там есть несколько опций для управления прозрачностью при рисовании и сохранении.
Права на файлы поставь 0666
>>500829
Конечно неожиданные моменты есть, но если ты знаешь как решать такие проблемы, как отлаживать, и понимаешь что там происходит, то ты разберешься. А во второй раз уже без ошибок все сделаешь.
>>500892
Ну так эти стажеры ведь учились не в нашем треде, верно?
>>500882
Пусть делает.
>>500873
Я могу сделать блог за 2 минуты, зарегистрировав аккаунт на сайте вордпресса, и что дальше?
>>500876
Гит надо изучать не на работе, а например во время учебы, мы анонов учим ему.
>>500885
> по цене, за которую обычные макаки делают целый сайт
До кризиса «обычный сайт» стоил около 3000 рублей, как я помню, в той же фабрике сайтов. Работают там в основном студенты.
>>500893
Только ты с ума сойдешь от такой работы через полгода, если ты конечно не робот которому нравятся повторяющиеся механические действия. Что же ты анонов не предупреждаешь. Алсо, насколько я знаю, в тех конторах где нет высоких требований к знаниям, практикуются переработки, штрафы за опоздания и прочий эффективный менеджемнт и тимбилдинг, аноны, имейте в виду, лучше сейчас выучить побольше чем потом на своей шкуре испытывать атмосферу макдональдса.
>>500900
Ты сейчас вытекать из треда начнешь. Очевидно что для человека знакомого с HTTP и отладчиком решение проблемы заголовков займет одно время, а для незнакомого совсем другое. Вообще, если человек теории не знает то в интернете он ответ быстро не найдет и ему остается только пробовать все способы в надежде что что-нибудь заработает.
>>500915
Браузер андроида тоже по моему Safari содержит, сомнительная таблица. Алсо для разбора User Agent должна быть какая-то библиотека.
>>500921
Уплывать он еще пару недель будет.
>>500923
Хочу прокомментировать про LESS. Сколько я не видел код который пишут в «CSS шаблонизаторах», чаще всего он выглядит как
div {
span {
div {
То есть этим людям рано за LESS браться, они еще CSS и как правильно писать селекторы не осилили (для тех кто не понял: селекторы типа div span div не читаемы и ломаются при малейшей правке в верстке).
>>500933
Потому что на практике большинство их возможностей не требуется.
>>501140
Есть список каких-то задач https://github.com/codedokode/pasta/blob/master/interview-tasks.md
На средней позиции попросят рассказать про опыт работы, достижения, что именно ты сделал, а вопросы мне кажется должны быть в стиле «как сделать такую шткук» или «как поступать в такой ситуации»
>>501141
Я хочу прокомментировать, что скачивание платных макетов может аукнуться, так как на западе серьезное отношене к авторскому праву и соответственно если будет суд то нарушитель получит хороший штраф. И потому американские заказчики боятся нарушить права как огня, и требуют обычно чтобы все фотографии и макеты были как-то официально куплены либо специально для них сделаны.
>>501157
В Оп посте есть годные задачи на HTML/CSS
Си++ ты будешь полгода-год минимум учить, это сложный язык. За 28 дней его выучить можно только если ты гений-вундеркинд.
>>501168
Поддерживается, просто по умолчанию ты создаешь изображение с черным фоном и на этот черный фон накладываешь прозрачную картинку. Надо создавать изначально прозрачную картинку, плюс там есть несколько опций для управления прозрачностью при рисовании и сохранении.
>Поддерживается, просто по умолчанию ты создаешь изображение с черным фоном и на этот черный фон накладываешь прозрачную картинку.
А чего он не белый? Было бы логичнее. Хотя в принципе уже похуй, т.к. довольно быстро нагуглил решение и теперь все норм работает.
Потому что нули в картинке обозначают отсутсвие свечения, а память под новую картинку видимо заполняетя нулями.
Нет, там ищут не обычную макаку, а
>опытного HTML верстальщика
Это значит минимум год опыта (не решения детских задачек от опа, а реальных проектов), и безошибочное быстрое исполнение.
>Оптимизировать загрузку страниц;
Ты в курсе тонкостей кэширования?
>Валидная кроссбраузерная верстка
Ты досконально знаешь особенности каждого браузера?
>Точное соответствие макетам
>Responsive-вёрстка под iOS/Android;
Нелохая вакансия, профессионалам действительно хорошо платят.
извиняюсь за отвратное письмо, всю ночь не спал.
смотрел как тут парни делали. Пытался сделать так же как и у них (http://www.cyberforum.ru/php-database/thread1194083.html), но нихуя не пашет в обоих вариантах
Да там ничего сложного же. Получаешь из базы массив со всеми элементами и затем его через цикл foreach выводишь.
в том то и дело, что своим опухшим уже мозгом я понимаю, что ничего сложного. получаешь значения из таблицы выводишь их через цикл, и вроде много информации и все пытаюсь сделать правильно, но ничего не выходит
может у кого- то есть опыт с выпадающими списками и вы можете пояснить мне. только не в двух словах потому, что толку не будет. Возможно, есть какой-то работающий пример, с которого я раздуплюсь?
сейчас. но боюсь, там вообще ничего нет правильного =(
Это неправильно
echo '<option value="'$object['id_country'].'">'$object['country_name']'</option>';
Аргументы в конструкцию echo нужно передавать либо через запятую, либо склеивать их точкой (оператор конкатенации - объединения строк)
echo '<option value="' . $object['id_country'] . '">' . $object['country_name'] . '</option>';
А лучше подставлять переменные в двойные кавычки
echo "<option value={$object['id_country']}">{$object['country_name']}</option>";
Что в файле test_db.php? Правильное ли там подключение к базе?
Расширение mysql сейчас никто не использует, я даже не уверен, что оно вообще поддерживается. Ты скопировал какой-то очень старый пример. Нужно использовать либо mysqli, либо объекты PDO.
Вообще лучше сядь и несколько месяцев потрать на изучение хотя бы основ php и sql. Потому что вопросы постоянно будут возникать.
В оп-посте есть ссылки на хорошие статьи для начинающих, где последовательно все излагается.
То ли тамошняя подача материала плохая, то ли задачи составляли по пьяни, то ли я тугодум необучаемый. Есть какая-нибудь книжка по PHP, чтобы все подробно, разжеванно и с большим количеством примеров?
Нет такой книги. Если тебе даже детский учебник из оп-поста кажется сложным, то лучше не стоит вскрывать эту тему.
Серьезно. Дальше будет в десять раз сложнее.
Ну попробуй вот это http://www.ozon.ru/context/detail/id/30957824/
Хотя тоже далеко не идеально, но лучше ничего нет.
Изучаю сейчас phalcon, пикрелейтед кусок шалона с использованием volt и без, в чем принципиальная разница?
>Серьезно
Наверное так и есть. Печально. Скажи хоть, как здесь http://codepad.org/DUbYE5tP надо было сделать расшифровку с помощью array_flip()?
Не понял, это вопрос? Ты же сам ответил. Да, поменять местами ключи массива со значениями при помощи array_flip и еще раз вызвать strtr, чтобы расшифровать обратно.
http://ideone.com/fqfogw
Внимательно читай, что делает каждая функция.
http://php.net/manual/ru/function.strtr.php
strtr заменяет в строке, которая передается первым параметром те символы, которые в массиве заданы в ключах на их соответствующие значения.
strtr($text, array $code) означает, что если в строке $text есть символ, который находится в ключе массива $code, то он будет заменен на значение этого элемента.
$code = array(
'а'\t=>\t'1',
'б'\t=>\t'2',
);
$text = 'нас предали...';
Функция strtr берет строку $text и по очереди проверяет, есть ли в ней подстрока 'a', если есть заменить ее на '1'; есть ли подстрока 'б', если есть заменить на '2' и так далее.
array_flip тупо меняет ключ и значение местами.
$code = array(
'а'\t=>\t'1',
'б'\t=>\t'2',
);
$flipped = array_flip($code);
В $flipped теперь ['1'=>'a', '2'=>'б'].
>>501501
> то ли задачи составляли по пьяни
Не, автор этого учебника - извращенец, который любит головоломки, сидеть над задачей по несколько часов. Он думает, что это всем нравится.
Задачи там часто с подвохом, на логику, а не на знание простой теории, но зато материал объясняется как по мне вполне доходчиво.
И я подозреваю что ты пропускаешь материал. Ты точно решил задачи про генератор имен, на рост одноклассников, про айфон в кредит?
Задания нужно решать последовательно.
Не понял, это вопрос? Ты же сам ответил. Да, поменять местами ключи массива со значениями при помощи array_flip и еще раз вызвать strtr, чтобы расшифровать обратно.
http://ideone.com/fqfogw
Внимательно читай, что делает каждая функция.
http://php.net/manual/ru/function.strtr.php
strtr заменяет в строке, которая передается первым параметром те символы, которые в массиве заданы в ключах на их соответствующие значения.
strtr($text, array $code) означает, что если в строке $text есть символ, который находится в ключе массива $code, то он будет заменен на значение этого элемента.
$code = array(
'а'\t=>\t'1',
'б'\t=>\t'2',
);
$text = 'нас предали...';
Функция strtr берет строку $text и по очереди проверяет, есть ли в ней подстрока 'a', если есть заменить ее на '1'; есть ли подстрока 'б', если есть заменить на '2' и так далее.
array_flip тупо меняет ключ и значение местами.
$code = array(
'а'\t=>\t'1',
'б'\t=>\t'2',
);
$flipped = array_flip($code);
В $flipped теперь ['1'=>'a', '2'=>'б'].
>>501501
> то ли задачи составляли по пьяни
Не, автор этого учебника - извращенец, который любит головоломки, сидеть над задачей по несколько часов. Он думает, что это всем нравится.
Задачи там часто с подвохом, на логику, а не на знание простой теории, но зато материал объясняется как по мне вполне доходчиво.
И я подозреваю что ты пропускаешь материал. Ты точно решил задачи про генератор имен, на рост одноклассников, про айфон в кредит?
Задания нужно решать последовательно.
правильное подключение. создавал отдельно файл , подключался с помощью test_db.php, выводил таблицы в массив, а вот как вывести в сам Select я не знаю
сталкивался с PDO и очень понравилось, смотрел manual, но там не очень все понятно, попытался использовать и были ошибки. если знаешь где можно почитать толково про PDO, то скажи, пожалуйста, мне это очень пригодиться.
но мне кровь из носу нужно сделать выпадающий список. Если знаешь как, то растолкуй. ща попробую исправить то , что ты заметил у меня.
Доставляют восторженные отзывы быдланчиков:
>Практически сразу идет ознакомление с phpMyAdmin, вкратце с языком SQL и PHP и сразу мастерим небольшую страничку с применением БД. "Воды" практически нет
А потом эти ебланы засирают форумы с вопросом "чо у миня не работает echo, памагите".
Хотя я и сам недалеко ушел, сказать по правде.
Хочется видеть хоть какой-то результат своих трудов, нет сил уже обмазываться теорией с хелловорлдами.
>От новичка к профессионалу
>384 стр.
>1198 руб.
http://www.amazon.com/Objects-Patterns-Practice-Matt-Zandstra/dp/1430260319
>Доставляют восторженные отзывы быдланчиков:
>>Практически сразу идет ознакомление с phpMyAdmin, вкратце с языком SQL и PHP и сразу мастерим небольшую страничку с применением БД. "Воды" практически нет
>А потом эти ебланы засирают форумы с вопросом "чо у миня не работает echo, памагите".
>
Хоть в книге и знакомят с пхпмайадмин, таблицы там создаются вручную.
Если ты уже хорошо знаком с синтаксисом пхп, то почитай. В оп-посте ОП её советует.
Хорошая книга, но не для начинающих.
Нету книг для начинающих. Смиритесь с этим.
В книжках типа "PHP за неделю!" вам покажут пару фокусов, которые будете копипастить до конца своих дней, не понимая значения. К тому же большинство из них устаревшие, как ни странно даже книги 2013-2015 года используют устаревшие подходы.
Есть разрозненные статьи. Есть видеоуроки разной степени убогости.
Курс от учебного центра "специалист" еще с натяжкой можно назвать неплохим.
Ведет шустрый мужичок по имени Игорь Борисов, портрет коего красуется в шапке данного треда.
Объясняет неплохо, информация излагается последовательно.
Но примеров мало, и они не наглядные.
Длительность более 50 часов, можно умереть от скуки в процессе просмотра.
Есть на nnm.club, с рутрекера выпилили копиразды.
Ничем. Кто сказал, что это плохо?
На всякий случай: под "вручную" я подразумевал "не через графический интерфейс".
Да хуй знает, где-то слышал пару раз, что мол через phpMyAdmin только нубы создают, Ъ пацаны пишут километровые запросы. Правда так и не сказали почему.
Кал собачий.
Но может для старта и сойдет. Как легкое введение в веб-разработку. Но научить такая книга ничему не может. Хотя да, написать пару простых сайтов, скопировав оттуда код, можно.
>>501600
Может потому что на рабочем сервере нет ни phpmyadmin, ни браузера, ни значка "мой компьютер"? Как же сука к себе в папку-то попасть?
Хз, курил наверно много.
>на рабочем сервере нет ни phpmyadmin
А, ну в этом случае то понятно все. Я просто думал какие-то еще причины есть помимо невозможности использования GUI.
Помимо этого есть еще такие вещи как компетентность и профессионализм.
Представь себе, что тебя будет лечить врач, который только и умеет, что измерить давление при помощи аппаратика, который надевается на руку, и прописать таблетки в случае отклонения от нормы.
Наверное, врачу тоже не нужно знать биохимический состав крови, классификацию сердечно-сосудистых заболеваний, причины образования тромбов и т.д. А нахуя, если есть вот та хуйня, которая измеряет давление?
Зачем физикам, которые работают на андронном коллайдере знать таблицу умножения, епты? В двацать первом веке живем, можно и на калькуляторе перемножить 7х8.
зачем нужна знать руский езык, я чо в школе нахуй?
Ничего не нужно знать. Ведь есть phpmyadmin.
Ты перед тем, как сортиром воспользоваться тоже его устройство изучаешь? Проблемы надо решать по мере поступления, а то велика вероятность того, что к тому времени как тебе знания понадобятся ты уже все забудешь нахуй. Хотя конечно общее представление о том, как оно все работает иметь не помешает.
Алсо, проиграл от сравнения макакокодеров с врачами и физиками. Это совсем разные уровни, аналогия неуместна.
>Ты перед тем, как сортиром воспользоваться тоже его устройство изучаешь?
Это демагогия: ты подменяешь пользователя и производителя. Для пользования сортиром не нужны знания (и сортир не нужен, потому что есть лифт и подъезд). Для проектирования санузлов и канализации знания нужны.
>сравнения макакокодеров с врачами и физиками
Да, макакокодеров сравнивать с врачами и физиками неуместно.
Профессиональных программистов - уместно.
(Программист - это тот, кто программирует. Макакокодер - кто подражает программисту, заучивая последовательность нажатий кнопок во всяких вордпрессах и пхпадминах)
А ларчик просто открывался... Блин. Спасибо.
> извращенец, который любит головоломки, сидеть над задачей по несколько часов. Он думает, что это всем нравится.
Пиздец. Мне и так тяжело, тем более с моим-то характером, испсиховался и проклял все и вся, а он тут со своим головоломками.
> материал объясняется как по мне вполне доходчиво.
Местами, да, а порой тупо даётся кусок кода с никаким комментарием и предложение решить очередную задачу.
>пропускаешь материал
Рост одноклассников, да, ниасилил пропустил.
>нужно решать последовательно.
>>501563
Ну её. Моего английского хватает чтобы понять, но постоянная необходимость концентрироваться на правильности перевода, отвлекает от сути.
Ладно, попробую эту >>501504 книжку покурить, может лучше пойдёт.
Вуд ю кайндли?
Ну так я и пользуюсь пхпадмином, как обычным инструментом, типа молотка. Я конечно могу научиться как гвозди забивать с помощью камня, на случай если вдруг у меня молотка не будет, но пожалуй я не буду этого делать.
Нет, программистов любого уровня неуместно сравнивать с такими сложными профессиями как врач или физик. Как бы не выебывались некоторые кодерки, это совершенно иной уровень. Они просто нажимают кнопочки в определенной последовательности и ВСЕ. Даже мозг включать не нужно. Сравнивать это с работой какого-нибудь нейрохирурга это просто смешно.
https://blockly-games.appspot.com/maze?lang=ru
>Они просто нажимают кнопочки в определенной последовательности и ВСЕ
Да, нужно уметь правильно нажимать кнопочки на клавиатуре, не прибегая к стороннему программному обеспечению типа графических интерфейсов.
>Даже мозг включать не нужно.
Нужно.
>Сравнивать это с работой какого-нибудь нейрохирурга это просто смешно.
Не смешно.
Но ведь если не использовать GUI, то ты превратишься в прыщавого пердолика. Как по мне, то слишком большая цена за то, чтобы называться программистом. Лучше уж буду макакой со здоровой кожей и активной сексуальной жизнью.
Ты вопрос задай корректно, тыжпрограммист.
>>501684
Я не говорил, что вообще не нужно использовать GUI (значение знаешь?). Нужно только понимать, надстройкой над чем они являются.
>если не использовать GUI, то ты превратишься в прыщавого пердолика
Не вижу связи.
И ты отчаянно толстишь, так неинтересно. Хотя спасибо, что помогаешь утопить тред. А то оп до 800 постов наверное будет ждать.
Оп не ждет конкретного колличества постов, ему просто нужно проверить все задачи и ответить на все вопросы в треде, прежде чем запилить новый. Поэтому перекат здесь это такая проблема.
Говорил, что пересоздаст после бамплимита. Картинки не окей. У меня от этой рожи сразу демотивация и анальный пожар от безысходности жизни.
А чем оф.документация плоха?
Нубы еще могут жаловаться на сложности в понимании документации, но если ты считаешь, что дорос до Симфони, то как бы уже пора остепениться.
Я нашел какой-то туториал у себя в закладках.
symfony.in.ua/symfony2-tutorial-for-beginners.html
Сейчас не могу почему-то перейти.
Зачем скроллить? Родина дала тебе каталог!
>>501590
>>501585
>>501580
Я знаю, что многие начинающие хотят использовать phpmyadmin потому что не хотят изучать SQL. Так не пойдет, мы тут готовим программистов, а не эникеев умеющих нажимать кнопки мышкой.
Начинающие должны создавать таблицы вручную, так как иначе они никогда не выучат SQL. Когда ты напрактикуешься, можешь пользоваться хоть пхпмайадмином, хоть чем хочешь. Я им не пользуюсь например, я вообще обнаружил что в большинстве случаев он бесполезен и нужную информацию быстрее найти написав запрос. Потому что когда у тебя в таблице миллионы записей и десятки колонок тебе эти табличка выводящая по 20 строк никак не помогает.
Форма в phpmyadmin в конечном счете создает запрос. Потому если ты не знаешь разных особенностей MySQL то ты не сможешь понять почему та или иная вещь не работает.
Наконец если в проекте используются миграции (а в любом нормальном проекте они используются, они есть и в Yii и в Symfony), то тебе надо будет писать запросы руками.
Я считаю, любой уважающий себя джуниор должен решить минимум 2 моих задачи на SQL (про лайки и про кинотеатр) иначе его незачем даже допускать к собеседованию (жаль работодатели так не всегда считают).
В общем, если ты можешь написать нужный SQL запрос бьез ошибок, можешь пользоваться хоть чем, если не можешь в твоих же интересах подучить SQL.
ОП. А ты можешь примерно хотя бы смоделировать собеседование?? Ну типо вопросов и тестового задания???
Хотябы в 3-х словах. Чтобы знать к чему готовится.
Умение создавать SQL таблицы запросом это базовое знание, без которого тебе в веб-разработке делать нечего. И я не понимаю, из-за чего так активно спорить, CREATE/ALTER изучается за 20 минут.
>>501728
Ок, в этот раз перекатимся чуть раньше чем обычно, но да, проверить задачи все равно надо.
>>501667
Перед пхпмайадмином надо выучить SQL. И разумеется надо создать руками хотя бы несколько таблиц.
>>501684
Не бойся, с таким подходом ты программистом все равно не станешь. Алсо, первый раз слышу что от программирования портится кожа, я думал она портится от плохого питания и ошибок в генах.
>>501849
Не закрывай наш тред и скроллить не придется. Я например не закрываю.
Я вряд ли угадаю что у тебя спросят. Но если у тебя 0 опыта то будут спрашивать:
— php: вопросы по особеностям языка, сравнение значений разных типов (что выведет var_dump("asad" == true); или $a = "aa"; $a++; echo $a;), вопросы по работе с массивами, строками, регулярками, может что-нибьудь заковыристое по особенностям ООП и наследования. Лучше всего перечитать мануал.
Спросят, какие фреймворки, библиотеки знаешь.
Могут дать несложную задачку типа таких: https://github.com/codedokode/pasta/blob/master/interview-tasks.md
— ООП, MVC: что это такое, инкапсуляция, наследование, полиморфизм
— базы данных: напишите запрос, расскажите про транзакции, внешние ключи, нормализацию
— JS: не знаю, спросят наверно какие библиотеки знаешь и может задачку дадут
В общем, если ты прошел все наши задания то наверно бояться особо нечего.
Спс Оп.
Блять, нигде от этих дибильных задачек не спрячешься. Что они всем так нравятся, я понять не могу?
Решение задач это часть нашей культуры инженеров программного обеспечения. Мы любим задачки и головоломки.
Не понять мне вас. Я могу хоть неделю убить на решение РЕАЛЬНОЙ задачи и меня это ничуть напрягать не будет, но мне жалко даже 5 минут потратить на решение какой-то абстрактной задачки, которая все равно никогда не пригодится.
Все задачи которые тут есть, они все сделаны чтобы проверить знание какой-то вещи (а если ты не знаеь то помочь изучить). Также, задачи заставляют тебя писать код, сам понимаешь что теория без практики плохо усваивается.
Например задачи из учебника помогают запомнить использование определенных функций PHP, работу с массивами, регулярками, ООП. Задача на список студентов/файлообменник проверяет и помогает изучить умение работы с таблицами, формами.
Потому решение задач это часть обучения. Пригодится тебе не сама задача, а полученные знания. Реальные задачи решать ты будешь на работе, а пока учишься — решай учебные.
Ну и я не понимаю почему их считают «головоломками». На мой взгляд, все задачи у нас элементарные, я стараюсь их делать максимально простыми, такими что профессиональный программист их в уме за полминуты решит.
Да я вообще-то про собеседования говорил. Поначалу то понятное дело без них никак.
>Ну и я не понимаю почему их считают «головоломками».
Ага, особенно "Кошки-мышки" и рисование круга текстом ( или что-то подобное) вообще ни разу не головоломки, а стандартные задачи, которые каждый день решаются. Вот такую парашу я терпеть не могу. А против файлообменника ничего против не имею. Скоро его доделаю кстати и выложу на всеобщее обозрение. Правда я его на на Слиме делал, а на SimpleMVC, мне он гораздо больше понравился. Там из под коробки все что надо есть и практически ничего настраивать не надо.
> Ага, особенно "Кошки-мышки"
Эта задача проверяет умение раскладывать большую задачу на более маленькие и решать их (а также умение писать классы). На первый взгляд начинающему она может показаться нереально сложной. Но если приглядеться, то мы увидим что она разбивается на части:
— кошка и алгоритм ее движения
— мышка и алгоритм
— карта и алгоритмы проверяющие, свободна ли клеточка, кто кого видит
— класс игры, который создает карту и животных и ходит ими
Далее, алгоритм движения кошки или мышки может показать сложным. Но он тоже разбивается на части:
— получить список всех возможных ходов
— оценить каждый в баллах
— выбрать ход с максимальным числом баллов
— сделать этот ход
Я считаю это очень важное умение, раскладывать задачу на составляющие и делать простой и понятный код для сложных задач. На практике такое встречается часто, так как практически любой проект веб-приложения по объему в десятки и сотни раз больше. Те люди, кто не умеет раскладывать на составляющую, на работе начинают писать длинные неитаемые простыни кода, в которых часто возникают ошибки.
Если ты не работал с реальными проектами, то ты можешь этого не видеть, но я видел эти простыни кода не раз. Тем, кто их пишет, надо не программистами работать, а учиться сначала.
С чем я могу согласиться, так это с тем что к этой задаче нужны пояснения, как именно ее решать, чтобы то что я написал выше, было в учебнике.
Ну и даже на наших небольших задачах некоторые аноны умудряются скатиться к написанию простыней. Нет, этого я не одобряю.
> и рисование круга текстом ( или что-то подобное) вообще ни разу не головоломки, а стандартные задачи, которые каждый день решаются.
Ну это вообще мелочь, в цикле вывести буквы. Будем считать что эта задача проверяет твое умение реализовать данную тебе формулу в виде кода.
> Ага, особенно "Кошки-мышки"
Эта задача проверяет умение раскладывать большую задачу на более маленькие и решать их (а также умение писать классы). На первый взгляд начинающему она может показаться нереально сложной. Но если приглядеться, то мы увидим что она разбивается на части:
— кошка и алгоритм ее движения
— мышка и алгоритм
— карта и алгоритмы проверяющие, свободна ли клеточка, кто кого видит
— класс игры, который создает карту и животных и ходит ими
Далее, алгоритм движения кошки или мышки может показать сложным. Но он тоже разбивается на части:
— получить список всех возможных ходов
— оценить каждый в баллах
— выбрать ход с максимальным числом баллов
— сделать этот ход
Я считаю это очень важное умение, раскладывать задачу на составляющие и делать простой и понятный код для сложных задач. На практике такое встречается часто, так как практически любой проект веб-приложения по объему в десятки и сотни раз больше. Те люди, кто не умеет раскладывать на составляющую, на работе начинают писать длинные неитаемые простыни кода, в которых часто возникают ошибки.
Если ты не работал с реальными проектами, то ты можешь этого не видеть, но я видел эти простыни кода не раз. Тем, кто их пишет, надо не программистами работать, а учиться сначала.
С чем я могу согласиться, так это с тем что к этой задаче нужны пояснения, как именно ее решать, чтобы то что я написал выше, было в учебнике.
Ну и даже на наших небольших задачах некоторые аноны умудряются скатиться к написанию простыней. Нет, этого я не одобряю.
> и рисование круга текстом ( или что-то подобное) вообще ни разу не головоломки, а стандартные задачи, которые каждый день решаются.
Ну это вообще мелочь, в цикле вывести буквы. Будем считать что эта задача проверяет твое умение реализовать данную тебе формулу в виде кода.
Ну неужели нельзя то же самое делать с нормальными задачами, а не с этой фигней? Чтобы совмещать приятное с полезным.
Алсо, я знаю, что мне никогда не стать первоклассным программистом, т.к. у меня к этому способностей нет. Да если честно и желания тоже. Меня от одной мысли всю жизнь сидеть кодить в дрожь бросает. Конечно забавная фигня, но явно не стоит того, чтобы ей жизнь посветить. Но это один из самых лучших способов съебать из рашки на данный момент, так что придется поднапрячься.
Вообще, мне показалось что слишком близкие к реальности задачи будут скучными. Ты на работе их еще нарешаешься вдоволь.
Ну а умение писать ООП код, оно универсальное, пишешь ты алгоритм поиска мышки или алгоритм расчета скидки.
Если у тебя есть желание, мы всегда можем изменить условие задачи под твои нужды. Например, если ты хочешь к файлообменнику какие-то фичи добавить или изучить определенную технологию. Или если ты хочешь сделать какое-то приложение, напиши и подумаем как это реализовать с использованием современных библиотек и практик программирования. Ну например если ты хочешь попасть на работу в компанию делающую интернет-магазины, может имеет смысл сделать какую-то связанную с этим задачу.
Да я сам себе задачи придумываю. Обмазал файлообменник теми фичами, которые считаю нужными и не стал делать те, которые считаю бесполезными. Например галерею делать не стал, зато запилил регу и прочие плюшки.
Я советую такие вещи обсуждать тут, так как можешь быть есть определенная библиотека или способ реализации той или иной фичи. Велосипедисты, не умеющие в гугл, никому не нужны.
Я же говорю, в SimpleMVC из под коробки почти все что нужно для небольшого сайта есть. Можешь глянуть функционал на http://simplemvcframework.com
Разве что капча убогая, пришлось гугловскую прикручивать.
http://ideone.com/lcM6Ne
>>498356
Проверил твою задачу. Почти все готово, но есть пока еще замечания.
В базе данных есть такая штука, как уникальный ключ (индекс), UNIQUE KEY. Она запрещает вставлять в колонку (или набор колонок) повторяющиеся значения (NULL при этом может повторяться, если он разрешен, так как NULL значит «неизвестно»). Я думаю, надо добавить уникальные индексы на колонки email и password чтобы гарантировать что в них не будет повторов:
http://www.oooportal.ru/?cat=article&id=1355
http://www.mysql.ru/docs/man/ALTER_TABLE.html
> https://github.com/Si0n/register3/blob/master/lib/StudentsMapper.php#L99
> return 'failed';
Вот это не очень хорошо, что функция возвращает либо массив либо строку. Функции, которые возвращают данные разного типа, неудобны в использовании, так как ты вынужден после ее вызова ставить if.
В данном случае проще всего при неправильной сортировке ставить для нее значение по умолчанию. Или можно выбрасывать исключение (которое завершит скрипт), как вариант.
> $legitSort = array_search($sort, $sortVariations);
Чтобы проверить есть ли в массиве такой элемент, есть in_array:
if (in_array($x, $array)) ....
> https://github.com/Si0n/register3/blob/master/lib/StudentsMapper.php#L85
> LIMIT $offset, 4";
Число 4 встречается в нескольких местах кода и его очень тяжело из-за этого поменять (и легко допустить ошибку, поменяв в одном месте и забыв поменять в другом). Такого быть не должно. Это число (как и любые другие параметры) должно задаваться только в одном месте. Я думаю, можно передавать число записей как аргумент в функцию выборки студентов из базы.
> https://github.com/Si0n/register3/blob/master/lib/StudentsMapper.php#L125
> return StudentsMapper::isThisEmailInDB($email);
:: используется для вызова статических методов. Для обычных надо использовать ->
> https://github.com/Si0n/register3/blob/master/lib/StudentValidator.php#L18
> $student->getMark() > 200)
А разве нельзя набрать больше 200 баллов? Как я понимаю, там 100 баллов за один предмет, а за 3 предмета может быть наверно 300.
> https://github.com/Si0n/register3/blob/master/lib/StudentValidator.php#L21
> if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i"
Читал статью про валидацию email? http://habrahabr.ru/post/55820/, http://habrahabr.ru/post/175375/
> https://github.com/Si0n/register3/blob/master/lib/Student.php#L18
> public function setFields($data='')
> if (is_array($data)) {
Это неправильно. Лучше когда функция принимает только данные определенного типа, а не что попало. Так и работать проще, и ошибку допустить сложнее.
Если тебе надо очистить значения полей, то сделай для этого отдельный метод.
> $navbarEditClass = $navbarActive;
> $navbarListClass = $navbarActive;
> $navbarInspectClass = $navbarActive;
По моему, 3 переменных это перебор. Тут хватит одной переменной, в которую ты помещаешь обозначение текущей страницы, например $currentPage = 'registration', а уже в шаблоне ты можешь на основании этой переменной присвоить значения трем переменным с классами.
> header( 'Refresh: 1.5; url=index.php?page=inspect' );
Что за странная конструкция? Редирект делается через заголовок Location. Если ты хотел так показать сообщение, то это плохая идея, так как пользователь мог например пойти налить себе чаю и не увидеть это сообщение. Сообщение об успешной регистрации лучше показывать после редиректа, чтобы оно никуда не исчезло. Для этого ты можешь добавить параметр в URL, например index.php?page=xxx®ister=ok
> require './scripts/register.php';
Что-то у нас код регистрации и редактирования данных о себе оказался размазан по куче файлов, причем без всякой логики. Вот, что я сейчас вижу:
scripts/register.php
case 'registration' в index.php
reg.php
Целых три файла занимаются непонятно чем.
Я считаю, регистрацию надо полностью перенести в reg.php. То, что упоминается про нее в index.php, думаю, надо удалить и поставить ссылку в меню на reg.php. Чтобы reg.php отвечал и за вывод формы регистрации, и за вывод формы личных данных, и за обработку данных от формы. Потому что у тебя сейчас все как-то размазано по куче файлов.
> $studentValidator = new StudentValidator(); // data mapper(проверка данных при регистрации)
Это не дата маппер, дата маппер это класс который загружает и сохраняет объекты в базу данных.
> https://github.com/Si0n/register3/blob/master/scripts/register.php#L6
> if ($student->getLocal() == $student::RESIDENCE_LOCAL)
Это лучше писать в самом шаблоне, то есть:
<input <?= ($student->getLocal() == $student::RESIDENCE_LOCAL) ? 'checked' : '' ?> ...
Тут как видишь используется тернарный оператор, мы выводим либо checked либо пустую строку.
Текущий режим сортировки надо бы подсвечивать или как-то показывать. Традиционно его обозначают треугольничком у поля, по которому идет сортировка, причем при повторном клике направление меняется, вот так:
Имя | Фамилия
Кликаем на Имя:
Имя (▼) | Фамилия
Еще раз кликаем:
Имя (▲) | Фамилия
Попробуй сделать так же.
«Место жительства:» и «Пол:» у тебя оформлены по-другому, не как остальные поля. Тебе стоит начать изучать HTML/CSS, они не такие и сложные, но зато ты не будешь испытывать проблем с оформлением страницы.
При поиске надо выводить искомое слово в поле ввода, а также писать:
> Показаны только абитуриенты, найденные по запросу «Иван».
> [Показать всех абитуриентов]
Это можно выводить там же, где пишется количество студентов.
Для постраничной навигации в бутстрапе есть готовый шаблон, где текущая страница подсвечивается синим:
http://getbootstrap.com/components/#pagination (англ, но это можно найти и на русском)
Кружочки предназначены не для номеров страниц, а для надписей предыдущая/следующая, и у тебя они как-то странно смотрятся.
>>498356
Проверил твою задачу. Почти все готово, но есть пока еще замечания.
В базе данных есть такая штука, как уникальный ключ (индекс), UNIQUE KEY. Она запрещает вставлять в колонку (или набор колонок) повторяющиеся значения (NULL при этом может повторяться, если он разрешен, так как NULL значит «неизвестно»). Я думаю, надо добавить уникальные индексы на колонки email и password чтобы гарантировать что в них не будет повторов:
http://www.oooportal.ru/?cat=article&id=1355
http://www.mysql.ru/docs/man/ALTER_TABLE.html
> https://github.com/Si0n/register3/blob/master/lib/StudentsMapper.php#L99
> return 'failed';
Вот это не очень хорошо, что функция возвращает либо массив либо строку. Функции, которые возвращают данные разного типа, неудобны в использовании, так как ты вынужден после ее вызова ставить if.
В данном случае проще всего при неправильной сортировке ставить для нее значение по умолчанию. Или можно выбрасывать исключение (которое завершит скрипт), как вариант.
> $legitSort = array_search($sort, $sortVariations);
Чтобы проверить есть ли в массиве такой элемент, есть in_array:
if (in_array($x, $array)) ....
> https://github.com/Si0n/register3/blob/master/lib/StudentsMapper.php#L85
> LIMIT $offset, 4";
Число 4 встречается в нескольких местах кода и его очень тяжело из-за этого поменять (и легко допустить ошибку, поменяв в одном месте и забыв поменять в другом). Такого быть не должно. Это число (как и любые другие параметры) должно задаваться только в одном месте. Я думаю, можно передавать число записей как аргумент в функцию выборки студентов из базы.
> https://github.com/Si0n/register3/blob/master/lib/StudentsMapper.php#L125
> return StudentsMapper::isThisEmailInDB($email);
:: используется для вызова статических методов. Для обычных надо использовать ->
> https://github.com/Si0n/register3/blob/master/lib/StudentValidator.php#L18
> $student->getMark() > 200)
А разве нельзя набрать больше 200 баллов? Как я понимаю, там 100 баллов за один предмет, а за 3 предмета может быть наверно 300.
> https://github.com/Si0n/register3/blob/master/lib/StudentValidator.php#L21
> if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i"
Читал статью про валидацию email? http://habrahabr.ru/post/55820/, http://habrahabr.ru/post/175375/
> https://github.com/Si0n/register3/blob/master/lib/Student.php#L18
> public function setFields($data='')
> if (is_array($data)) {
Это неправильно. Лучше когда функция принимает только данные определенного типа, а не что попало. Так и работать проще, и ошибку допустить сложнее.
Если тебе надо очистить значения полей, то сделай для этого отдельный метод.
> $navbarEditClass = $navbarActive;
> $navbarListClass = $navbarActive;
> $navbarInspectClass = $navbarActive;
По моему, 3 переменных это перебор. Тут хватит одной переменной, в которую ты помещаешь обозначение текущей страницы, например $currentPage = 'registration', а уже в шаблоне ты можешь на основании этой переменной присвоить значения трем переменным с классами.
> header( 'Refresh: 1.5; url=index.php?page=inspect' );
Что за странная конструкция? Редирект делается через заголовок Location. Если ты хотел так показать сообщение, то это плохая идея, так как пользователь мог например пойти налить себе чаю и не увидеть это сообщение. Сообщение об успешной регистрации лучше показывать после редиректа, чтобы оно никуда не исчезло. Для этого ты можешь добавить параметр в URL, например index.php?page=xxx®ister=ok
> require './scripts/register.php';
Что-то у нас код регистрации и редактирования данных о себе оказался размазан по куче файлов, причем без всякой логики. Вот, что я сейчас вижу:
scripts/register.php
case 'registration' в index.php
reg.php
Целых три файла занимаются непонятно чем.
Я считаю, регистрацию надо полностью перенести в reg.php. То, что упоминается про нее в index.php, думаю, надо удалить и поставить ссылку в меню на reg.php. Чтобы reg.php отвечал и за вывод формы регистрации, и за вывод формы личных данных, и за обработку данных от формы. Потому что у тебя сейчас все как-то размазано по куче файлов.
> $studentValidator = new StudentValidator(); // data mapper(проверка данных при регистрации)
Это не дата маппер, дата маппер это класс который загружает и сохраняет объекты в базу данных.
> https://github.com/Si0n/register3/blob/master/scripts/register.php#L6
> if ($student->getLocal() == $student::RESIDENCE_LOCAL)
Это лучше писать в самом шаблоне, то есть:
<input <?= ($student->getLocal() == $student::RESIDENCE_LOCAL) ? 'checked' : '' ?> ...
Тут как видишь используется тернарный оператор, мы выводим либо checked либо пустую строку.
Текущий режим сортировки надо бы подсвечивать или как-то показывать. Традиционно его обозначают треугольничком у поля, по которому идет сортировка, причем при повторном клике направление меняется, вот так:
Имя | Фамилия
Кликаем на Имя:
Имя (▼) | Фамилия
Еще раз кликаем:
Имя (▲) | Фамилия
Попробуй сделать так же.
«Место жительства:» и «Пол:» у тебя оформлены по-другому, не как остальные поля. Тебе стоит начать изучать HTML/CSS, они не такие и сложные, но зато ты не будешь испытывать проблем с оформлением страницы.
При поиске надо выводить искомое слово в поле ввода, а также писать:
> Показаны только абитуриенты, найденные по запросу «Иван».
> [Показать всех абитуриентов]
Это можно выводить там же, где пишется количество студентов.
Для постраничной навигации в бутстрапе есть готовый шаблон, где текущая страница подсвечивается синим:
http://getbootstrap.com/components/#pagination (англ, но это можно найти и на русском)
Кружочки предназначены не для номеров страниц, а для надписей предыдущая/следующая, и у тебя они как-то странно смотрятся.
Так в чем конкретно ошибка?
Кроме того, что список нужно выводить в цикле (там, где у тебя сейчас какой-то <p>Запись id=) и того что ты используешь устаревшее расширение mysql, все должно работать.
Только не в jsfiddle, который не понимает языка php, а на твоем локальном сервере.
Что у тебя установлено? Какой-нибудь денвер или wamp? (Есть подозрения, что ничего, и ты ожидал что оно заработает на jsfiddle)
Иди установи wamp, после чего скопируй файлы проекта в директорию c:\wamp\www\projectName (вместо projectName пиши название папки, в которой лежит index.php твоего проекта. Файл должен быть именно с расширением php, не html)
Запусти wamp, потом набери в адресной строке браузера localhost/projectName
Скопируй сюда ошибку, которую увидишь на экране, мы переведем.
Настрой свой редактор на вставку 4 пробелов вместо таба, так как код на гитхабе разъезжается.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/.htaccess#L4
> (.+)/(.+)$
Это ненадежная конструкция, так как в случае наличия нескольких слешей непонятно, куда они пойдут. Вместо точки лучше написать «не-слеш» чтобы не было сомнений.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L17
> } catch (Exception $e) {
Не надо ловить исключение. Слим сам его поймает и выведет страницу-заглушку, выдаст код 503, залоггирует подробности. А твой код ничего этого не делает, и ты даже не узнаешь об ошибке.
Вот урок про исключения кстати, может пригодится: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L24
> '../protected/views/index.tpl',
Там должна быть опция, чтобы задать папку с шаблонами, изучи код модуля и документацию:
https://github.com/slimphp/Slim-Views/blob/master/Smarty.php
https://github.com/slimphp/Slim/blob/master/Slim/View.php
http://docs.slimframework.com/configuration/settings/
И разберись как ее задать.
> array('noticeMessage'=>'', 'errorMessage'=>'')
Если какие-то данные надо передать в любой шаблон, то проще не копипастить это, а сделать передачу данных в начале index.php. Там у view, объекта который отвечает за вывод шаблонов, есть свойство data, файктически это массив, и ты можешь в него добавлять ключи. Почитай код по ссылкам выше, документацию, и разберись как это сделать.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L83
> header( "HTTP/1.1 404 Not Found" );
В Слиме есть метод notFound() для этого (кстати ты можешь задать свой шаблон для этой страницы).
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L92
> $list = array_map(
> function($el){
Этот некрасивый код тебе приходится писать из-за массиво-ориентированного программирования. Переделай маппер, чтобы он возвращал не массив массивов, а массив объектов File и этот код будет не нужен.
> https://github.com/nsdvw/file-sharing/blob/master/protected/Classes/Model/File.php#L20
> $mediaInfo = new \Model\File\MediaInfo($tmp_name);
> $this->properties = json_encode($mediaInfo);
Я думаю, это неудачное решение. Я думаю, надо сделать чтобы в объекте File было свойство mediaInfo содержащее объект MediaInfo. А при загрузке/сохранении в базу маппер бы кодировал/раскодировал его. Это задача маппера, преобразоывать данные в нужный вид для сохранения в базу, а на стороне PHP нам удобнее иметь нормальный объект с которым удобно работать.
А у тебя код маппинга фактиески размазан по обработчикам в index.php. Нехорошо.
Также, придется переделать MediaInfo. Сейчас у тебя при его создании надо указать имя файла, но нам нужна возможность также создавать MediaInfo на основе сохраненных в JSON данных. Это можно сделать, сделав статические конструкторы:
$m = MediaInfo::parseFile($file);
$m = MediaInfo::fromJson($json);
Аналогично с File. Сейчас у тебя модель File можно создать только привязав ее к загружаемому файлу. Нужна более универсальная модель, которую можно создать например на основе данных из БД. Я советую убрать все аргументы из конструктора, и перенести заполнение свойств модели куда-нибудь в другое место.
Нужно чтобы объекты File можно было загрузить из базы данных.
> https://github.com/nsdvw/file-sharing/blob/master/protected/Classes/Model/Mapper.php#L24
> return $this->connection->lastInsertId();
Обычно data mapper при сохранении вписывает id в объект-файл (а дополнительно можно возвращать его).
config.txt лучше переименовать в config.ini
Папку Classes я бы назвал с маленькой буквы, а то создается впечатление что Classes это часть неймспейса, а это не так.
Папка protected мне кажется лишней, ведь у нас защищенной является корневая папка и можно было все класть в нее. Но если это сложно, то можешь оставить как есть.
Жаль, что ты не выбрал twig, на мой взгляд, он интереснее, и новее.
В шаблонах необходимо избавиться от копипасты, шапка, подвал, все что повторяется. Странно, если ты сидишь в нашем треде, ты должен знать что копипаста абсолютно неприемлема. Она раздувает код и усложняет внесение в него изменений.
> {htmlspecialchars($file['name'])}
В смарти используют модификатор escape для этого
> href="../css/main.css">
Это хлипкий код, так как он зависит от текущего URL и легко ломается если мы добавим туда пару сегментов. Используй путь относительно baseUrl который упомянут тут:
http://docs.slimframework.com/request/paths/
https://github.com/slimphp/Slim-Views
Аналогично надо сделать со всеми ссылками.
> https://github.com/nsdvw/file-sharing/blob/master/protected/views/image_view.tpl#L26
> <a href="../download/{$file['id']}/{$file['name']}">
Ссылка на скачивание, я думаю, должна генерироваться функцией или методом
> https://github.com/nsdvw/file-sharing/blob/master/protected/views/list.tpl#L25
> {$i++}
В смарти есть счетчик цикла: http://www.smarty.net/docsv2/ru/language.function.foreach.tpl {$smarty.foreach....}
После успешной загрузки файла (или обработки POST формы) надо делать редирект чтобы при обновлении страницы запрос не отправлялся повторно. Соответственно выводить уведомление надо там. В твоем случае логично редиректить на страницу файла.
В слиме для редиректа наверняка есть готовый метод.
> if (in_array($file['properties']->mime_type, array('image/jpeg', 'image/gif',
> 'image/png', 'image/tiff',
Лучше в MediaInfo сделать метод isImage()
> \Model\File\Mapper
Лучше дописать вверху use и использовать короткое имя, а то это у тебя много раз повторяется
Проверку поддержки браузера надежнее делать яваскриптом, если ты его знаешь. Смотри, есть такой справочник по поддерживаемым типам:
https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats
И есть такая функция canPlayType:
MDN: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#Methods
Стандарт: http://www.w3.org/TR/html5/embedded-content-0.html#dom-navigator-canplaytype
MSDN: https://msdn.microsoft.com/en-us/library/ff975191(v=vs.85).aspx
Как видишь, он может возврщать разные значения. Заметь кстати, что тип файла обычно определеяет тип контейнера (например, AVI, MKV — это контейнеры: https://ru.wikipedia.org/wiki/Audio_Video_Interleave ), и браузер может поддерживать воспроизведение, только если он поддерживает контейнер и только если видео/аудио в нем закодированы определенным кодеком (что добавляет проблем).
Этот способ, с проверкой яваскриптом в браузере, самый надежный из доступных без перекодирования видео.
Если ты знаешь JS на достаточном уровне, можешь попробовать сделать. То есть провеять поддерживается ли тип файла, если да или «может», создавать и вставлять в DOM видеоплеер.
Настрой свой редактор на вставку 4 пробелов вместо таба, так как код на гитхабе разъезжается.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/.htaccess#L4
> (.+)/(.+)$
Это ненадежная конструкция, так как в случае наличия нескольких слешей непонятно, куда они пойдут. Вместо точки лучше написать «не-слеш» чтобы не было сомнений.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L17
> } catch (Exception $e) {
Не надо ловить исключение. Слим сам его поймает и выведет страницу-заглушку, выдаст код 503, залоггирует подробности. А твой код ничего этого не делает, и ты даже не узнаешь об ошибке.
Вот урок про исключения кстати, может пригодится: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L24
> '../protected/views/index.tpl',
Там должна быть опция, чтобы задать папку с шаблонами, изучи код модуля и документацию:
https://github.com/slimphp/Slim-Views/blob/master/Smarty.php
https://github.com/slimphp/Slim/blob/master/Slim/View.php
http://docs.slimframework.com/configuration/settings/
И разберись как ее задать.
> array('noticeMessage'=>'', 'errorMessage'=>'')
Если какие-то данные надо передать в любой шаблон, то проще не копипастить это, а сделать передачу данных в начале index.php. Там у view, объекта который отвечает за вывод шаблонов, есть свойство data, файктически это массив, и ты можешь в него добавлять ключи. Почитай код по ссылкам выше, документацию, и разберись как это сделать.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L83
> header( "HTTP/1.1 404 Not Found" );
В Слиме есть метод notFound() для этого (кстати ты можешь задать свой шаблон для этой страницы).
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L92
> $list = array_map(
> function($el){
Этот некрасивый код тебе приходится писать из-за массиво-ориентированного программирования. Переделай маппер, чтобы он возвращал не массив массивов, а массив объектов File и этот код будет не нужен.
> https://github.com/nsdvw/file-sharing/blob/master/protected/Classes/Model/File.php#L20
> $mediaInfo = new \Model\File\MediaInfo($tmp_name);
> $this->properties = json_encode($mediaInfo);
Я думаю, это неудачное решение. Я думаю, надо сделать чтобы в объекте File было свойство mediaInfo содержащее объект MediaInfo. А при загрузке/сохранении в базу маппер бы кодировал/раскодировал его. Это задача маппера, преобразоывать данные в нужный вид для сохранения в базу, а на стороне PHP нам удобнее иметь нормальный объект с которым удобно работать.
А у тебя код маппинга фактиески размазан по обработчикам в index.php. Нехорошо.
Также, придется переделать MediaInfo. Сейчас у тебя при его создании надо указать имя файла, но нам нужна возможность также создавать MediaInfo на основе сохраненных в JSON данных. Это можно сделать, сделав статические конструкторы:
$m = MediaInfo::parseFile($file);
$m = MediaInfo::fromJson($json);
Аналогично с File. Сейчас у тебя модель File можно создать только привязав ее к загружаемому файлу. Нужна более универсальная модель, которую можно создать например на основе данных из БД. Я советую убрать все аргументы из конструктора, и перенести заполнение свойств модели куда-нибудь в другое место.
Нужно чтобы объекты File можно было загрузить из базы данных.
> https://github.com/nsdvw/file-sharing/blob/master/protected/Classes/Model/Mapper.php#L24
> return $this->connection->lastInsertId();
Обычно data mapper при сохранении вписывает id в объект-файл (а дополнительно можно возвращать его).
config.txt лучше переименовать в config.ini
Папку Classes я бы назвал с маленькой буквы, а то создается впечатление что Classes это часть неймспейса, а это не так.
Папка protected мне кажется лишней, ведь у нас защищенной является корневая папка и можно было все класть в нее. Но если это сложно, то можешь оставить как есть.
Жаль, что ты не выбрал twig, на мой взгляд, он интереснее, и новее.
В шаблонах необходимо избавиться от копипасты, шапка, подвал, все что повторяется. Странно, если ты сидишь в нашем треде, ты должен знать что копипаста абсолютно неприемлема. Она раздувает код и усложняет внесение в него изменений.
> {htmlspecialchars($file['name'])}
В смарти используют модификатор escape для этого
> href="../css/main.css">
Это хлипкий код, так как он зависит от текущего URL и легко ломается если мы добавим туда пару сегментов. Используй путь относительно baseUrl который упомянут тут:
http://docs.slimframework.com/request/paths/
https://github.com/slimphp/Slim-Views
Аналогично надо сделать со всеми ссылками.
> https://github.com/nsdvw/file-sharing/blob/master/protected/views/image_view.tpl#L26
> <a href="../download/{$file['id']}/{$file['name']}">
Ссылка на скачивание, я думаю, должна генерироваться функцией или методом
> https://github.com/nsdvw/file-sharing/blob/master/protected/views/list.tpl#L25
> {$i++}
В смарти есть счетчик цикла: http://www.smarty.net/docsv2/ru/language.function.foreach.tpl {$smarty.foreach....}
После успешной загрузки файла (или обработки POST формы) надо делать редирект чтобы при обновлении страницы запрос не отправлялся повторно. Соответственно выводить уведомление надо там. В твоем случае логично редиректить на страницу файла.
В слиме для редиректа наверняка есть готовый метод.
> if (in_array($file['properties']->mime_type, array('image/jpeg', 'image/gif',
> 'image/png', 'image/tiff',
Лучше в MediaInfo сделать метод isImage()
> \Model\File\Mapper
Лучше дописать вверху use и использовать короткое имя, а то это у тебя много раз повторяется
Проверку поддержки браузера надежнее делать яваскриптом, если ты его знаешь. Смотри, есть такой справочник по поддерживаемым типам:
https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats
И есть такая функция canPlayType:
MDN: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#Methods
Стандарт: http://www.w3.org/TR/html5/embedded-content-0.html#dom-navigator-canplaytype
MSDN: https://msdn.microsoft.com/en-us/library/ff975191(v=vs.85).aspx
Как видишь, он может возврщать разные значения. Заметь кстати, что тип файла обычно определеяет тип контейнера (например, AVI, MKV — это контейнеры: https://ru.wikipedia.org/wiki/Audio_Video_Interleave ), и браузер может поддерживать воспроизведение, только если он поддерживает контейнер и только если видео/аудио в нем закодированы определенным кодеком (что добавляет проблем).
Этот способ, с проверкой яваскриптом в браузере, самый надежный из доступных без перекодирования видео.
Если ты знаешь JS на достаточном уровне, можешь попробовать сделать. То есть провеять поддерживается ли тип файла, если да или «может», создавать и вставлять в DOM видеоплеер.
Ну что ж, ценные замечания, особенно относительно структуры проекта.
Вопрос только в том, как это все реализовать. Мысль о том, что опять на неделю придется закопаться в эти бестолковые статьи и документации, делает меня грустным.
>В шаблонах необходимо избавиться от копипасты
Знал бы как, сделал бы. Должно быть, это где-то настраивается в смарти. Буду искать, что ж поделать.
Смарти выбрал, потому что базовые знания по нему уже были. Твиг придется учить с нуля, сделаю это при подготовке к последнему твоему квесту на сайт с тестами. И в симфони он используется.
По шаблонизаторам кстати чувачок выше спрашивал >>501505
, мне тоже будет интересно послушать. Нафиг они вообще нужны, если сам php поддерживает шаблонизацию?
В таблице students надо добавить уникальный ключ по email и по password чтобы гарантировать что они не повторяются и защитить от ошибок в коде, из-за которых они могут вставиться.
По этому файлу https://github.com/V3N0m21/StudentList/blob/master/textAreaTest.php — у тебя там данные из GET выводятся без экранирования, это XSS уязвимость. Попробуй например textAreaTest.php?text=<s>test
> https://github.com/V3N0m21/StudentList/blob/master/index.php#L10
> if ($_GET['notify'] == 'saved') {$message = "Ваша информация была сохранена";}
Переменная $message может существовать, а может нет. Такого не должно быть, сделай чтобы она всегда существовала и заодно отформатируй ифы нормально.
> https://github.com/V3N0m21/StudentList/blob/master/profile.php#L34
> authStudent($student->password);
> $data->saveStudent($student);
Надежнее сначала сохранять студента, а только после успешного сохранения ставить куку, иначе можно получить хорошую трудноотлаживаемую ошибку, когда кука проставилась, а данные не сохранились.
> https://github.com/V3N0m21/StudentList/blob/master/lib/Paginator.php#L30
> public function setPages()
непонятная функция, и непонятно почему бы не вызвать ее сразу из конструктора, чтобы после создания объекта все поля в нем имели актуальные значения
> https://github.com/V3N0m21/StudentList/blob/master/lib/Paginator.php#L42
> if(isset($_GET['current'])){
работу с GET надо вынести отсюда.
> https://github.com/V3N0m21/StudentList/blob/master/lib/Paginator.php#L49
> $link = "?current=$page";
для этого удобнее использовать http_build_query
> https://github.com/V3N0m21/StudentList/blob/master/lib/Student.php#L34
> if ($this->sex == "M") {
заведи-ка константы в классе Student для пола и места проживания. Константы надо использовать когда у нас есть один из нескольких вариантов. Они делают код понятнее, читабельнее и защищают от ошибок.
> https://github.com/V3N0m21/StudentList/blob/master/lib/StudentMapper.php
Пропусти этот файл через phpformatter (или настрой свою IDE и отформатируй ей). Я обычно игнорирую мелкие отступления от стиля кода, но тут ад какой-то.
Длинные строки и SQL запросы надо разбить переносами. В SQL запросах можно использовать переводы строк, так что проблем не будет.
> https://github.com/V3N0m21/StudentList/blob/master/lib/StudentMapper.php#L53
> if ($result[0] !== 0) {
Вот это опасное место. Ты уверен что драйвер mysqli вернет именно число 0, а не строку "0", из-за которой твое сравнение провалится? Я бы привел данные к числовому типу через intval.
База различает числа и строки, но вот различает ли из драйвер mysqli, я не уверен.
> https://github.com/V3N0m21/StudentList/blob/master/lib/StudentMapper.php#L62
> $password = $this->db->real_escape_string($password);
Лишний real_escape
> https://github.com/V3N0m21/StudentList/blob/master/lib/StudentMapper.php#L82
> $sql = $this->db->real_escape_string($sql);
То же самое. Кто пытается экранировать весь запрос целиком? Что это вообще?
> https://github.com/V3N0m21/StudentList/blob/master/lib/functions.php#L35
> u($link);
эта строчка ничего не делает. Более того, экранировать надо не всю ссылку, а только значения параметров (иначе они все склеятся в один большой параметр).
> https://github.com/V3N0m21/StudentList/blob/master/views/list.php#L4
> value="<?= !empty($students) ? $search : '';?>" name="search"
Это XSS, ты вставляешь данные в HTML без экранирования. Почитай урок про XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md
> https://github.com/V3N0m21/StudentList/blob/master/views/main.php#L6
> <?=$_SERVER['REQUEST_URI'] == '/index.php'
Это ненадежно так как после index.php могут идти GET-параметры и сравнение не сработает. Лучше завести переменную «текущая страница» и присваивать ей разные значения.
> https://github.com/V3N0m21/StudentList/blob/master/views/reg.php#L12
> $validation->errors['name']
Сообщения об ошибках лучше экранировать тоже, так как ты можешь захотеть в них подставлять полученные от пользователя данные. Лучше вообще экранировать все, что выводится.
> https://github.com/V3N0m21/StudentList/blob/master/views/reg.php#L35
> isset($student->sex)
Непонятно зачем эта проверка, ведь поле у объекта есть всегда.
В таблице students надо добавить уникальный ключ по email и по password чтобы гарантировать что они не повторяются и защитить от ошибок в коде, из-за которых они могут вставиться.
По этому файлу https://github.com/V3N0m21/StudentList/blob/master/textAreaTest.php — у тебя там данные из GET выводятся без экранирования, это XSS уязвимость. Попробуй например textAreaTest.php?text=<s>test
> https://github.com/V3N0m21/StudentList/blob/master/index.php#L10
> if ($_GET['notify'] == 'saved') {$message = "Ваша информация была сохранена";}
Переменная $message может существовать, а может нет. Такого не должно быть, сделай чтобы она всегда существовала и заодно отформатируй ифы нормально.
> https://github.com/V3N0m21/StudentList/blob/master/profile.php#L34
> authStudent($student->password);
> $data->saveStudent($student);
Надежнее сначала сохранять студента, а только после успешного сохранения ставить куку, иначе можно получить хорошую трудноотлаживаемую ошибку, когда кука проставилась, а данные не сохранились.
> https://github.com/V3N0m21/StudentList/blob/master/lib/Paginator.php#L30
> public function setPages()
непонятная функция, и непонятно почему бы не вызвать ее сразу из конструктора, чтобы после создания объекта все поля в нем имели актуальные значения
> https://github.com/V3N0m21/StudentList/blob/master/lib/Paginator.php#L42
> if(isset($_GET['current'])){
работу с GET надо вынести отсюда.
> https://github.com/V3N0m21/StudentList/blob/master/lib/Paginator.php#L49
> $link = "?current=$page";
для этого удобнее использовать http_build_query
> https://github.com/V3N0m21/StudentList/blob/master/lib/Student.php#L34
> if ($this->sex == "M") {
заведи-ка константы в классе Student для пола и места проживания. Константы надо использовать когда у нас есть один из нескольких вариантов. Они делают код понятнее, читабельнее и защищают от ошибок.
> https://github.com/V3N0m21/StudentList/blob/master/lib/StudentMapper.php
Пропусти этот файл через phpformatter (или настрой свою IDE и отформатируй ей). Я обычно игнорирую мелкие отступления от стиля кода, но тут ад какой-то.
Длинные строки и SQL запросы надо разбить переносами. В SQL запросах можно использовать переводы строк, так что проблем не будет.
> https://github.com/V3N0m21/StudentList/blob/master/lib/StudentMapper.php#L53
> if ($result[0] !== 0) {
Вот это опасное место. Ты уверен что драйвер mysqli вернет именно число 0, а не строку "0", из-за которой твое сравнение провалится? Я бы привел данные к числовому типу через intval.
База различает числа и строки, но вот различает ли из драйвер mysqli, я не уверен.
> https://github.com/V3N0m21/StudentList/blob/master/lib/StudentMapper.php#L62
> $password = $this->db->real_escape_string($password);
Лишний real_escape
> https://github.com/V3N0m21/StudentList/blob/master/lib/StudentMapper.php#L82
> $sql = $this->db->real_escape_string($sql);
То же самое. Кто пытается экранировать весь запрос целиком? Что это вообще?
> https://github.com/V3N0m21/StudentList/blob/master/lib/functions.php#L35
> u($link);
эта строчка ничего не делает. Более того, экранировать надо не всю ссылку, а только значения параметров (иначе они все склеятся в один большой параметр).
> https://github.com/V3N0m21/StudentList/blob/master/views/list.php#L4
> value="<?= !empty($students) ? $search : '';?>" name="search"
Это XSS, ты вставляешь данные в HTML без экранирования. Почитай урок про XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md
> https://github.com/V3N0m21/StudentList/blob/master/views/main.php#L6
> <?=$_SERVER['REQUEST_URI'] == '/index.php'
Это ненадежно так как после index.php могут идти GET-параметры и сравнение не сработает. Лучше завести переменную «текущая страница» и присваивать ей разные значения.
> https://github.com/V3N0m21/StudentList/blob/master/views/reg.php#L12
> $validation->errors['name']
Сообщения об ошибках лучше экранировать тоже, так как ты можешь захотеть в них подставлять полученные от пользователя данные. Лучше вообще экранировать все, что выводится.
> https://github.com/V3N0m21/StudentList/blob/master/views/reg.php#L35
> isset($student->sex)
Непонятно зачем эта проверка, ведь поле у объекта есть всегда.
> Вопрос только в том, как это все реализовать.
задавай конкретные вопрсоы, я постараюсь ответить.
>>В шаблонах необходимо избавиться от копипасты
> Знал бы как, сделал бы.
Вынеси шапку/подвал в отдельные шаблоны, и подключай через include или что там в смарти есть для этого.
> Нафиг они вообще нужны, если сам php поддерживает шаблонизацию?
Синтаксис более удобный, короткий и читабельный, в твиге есть автоескейпинг (он экранирует выводимые данные, не надо писать htmlspecialchars руками, а вот в смарти надо), есть всякие фичи вроде наследования шаблонов, макросов, и тд. если разберешься с твигом то отказываться от него не захочешь.
PHP:
<?= htmlspecialchars(trimUrl($user->getProfile()->getUrl()), ENT_QUOTES) ?>
Twig:
{{ user.getProfile().getUrl() | trimUrl }}
Не все идеально, значит. Если есть желание поковыряться в форматах файлов, можешь заняться исправлением бага.
>>500706
Месяца 2-3 может уйти. Начинать лучше с HTML/CSS/JS тогда можно браться за задачи на верстку. У нас кстати в шапке есть задачи по всем этим темам.
>>500785
Нет, все пишем в utf-8
>>500869
Заведи переменную положи в нее ноль, а когда видишь анона выше чем ты, увеличивай на единицу. Тогда в ней окажется число высоких одноклассников.
>>500872
Смотри лог ошибок сервера, что там написано.
>>500870
Все зависит от ситуации
Правый, короче
>>501468
А ты PHP хорошо знаешь? Надо сначала язык наверно изучить, а потом списки выпадающие делать.
> Сейчас в тупике потому, как не знаю как же правильно написать код, чтоб все работало.
Выбрать список в массив. Вывыести из массива циклом нужное число тегов option.
>>501471
Это старье какое-то
>>501475
Тебе лучше начать с более простых вещей. Или делать по частям, получить данные в массив, сдампить массив, проверить что все есть.
>>501550
Пиши какие именно ошибки, иначе не можем помочь
>>501553
Тебе надо с основ работы с базой данных начинать, а не списки делать пока что.
>>501501
По моему это один из простейших учебников.
Правый, короче
>>501468
А ты PHP хорошо знаешь? Надо сначала язык наверно изучить, а потом списки выпадающие делать.
> Сейчас в тупике потому, как не знаю как же правильно написать код, чтоб все работало.
Выбрать список в массив. Вывыести из массива циклом нужное число тегов option.
>>501471
Это старье какое-то
>>501475
Тебе лучше начать с более простых вещей. Или делать по частям, получить данные в массив, сдампить массив, проверить что все есть.
>>501550
Пиши какие именно ошибки, иначе не можем помочь
>>501553
Тебе надо с основ работы с базой данных начинать, а не списки делать пока что.
>>501501
По моему это один из простейших учебников.
Синтаксис лаконичнее и читабельнее наверно. Судя по всему, он twig имитирует (а тот имитрует питоновский jinja). Ну и я не знаком с шаблонизатром, может там автоескейпинг есть например? Я бы почитал документацию по нему чтобы узнать про фичи.
Алсо верстка это ад какой-то, position relative top 90px — как такое можно писать?
И вот это foreach () { то же ужасно, для шаблонов есть версия с двоеточием.
И htmlspecialchars никто не использует у них.
И слеш в конце img зачем-то поставили.
Ты явно читаешь какой-то плохой учебник, люди которые его пишут сами многого не знают.
ОП, а посоветуй что-нибудь что вообще можно почитать по правильной структуре проектов, потому что делаю задачу на файлообменник, и что-то мне как-то совсем не понятно куда и в какие папки пихать классы, модели, шаблоны, ткни пожалуйста носом если есть какая-то документация официальная по этому поводу
Алсо это плохая идея вот так разрывать классы:
from-{% if ... %}right
это подложит тебе свинью при поиске. Лучше писать имя класса всегда целиком.
>>501511
Не пропускай задачи и бейся с ними пока не решишь каждую, иначе толком ничего не усвоишь.
>>501511
array_flip меняет местами клбчи и значения в элементах массива.
>>501553
В программировании подход «кровь из носу» не работает. Это работает в других сферах, это может сработать если ты администратор, но в программировании надо знать теорию, а вариант нагуглить похожее решение и подправить скорее всего не сработает.
>>501635
Будешь ли ты макакокодером, зависит от тебя
>>501651
Если что-то непонятно, задавай вопросы в треде, желательно приложив написанный код и написав на каком месте завис.
>>501684
Вероятнее получится просто «буду макакой»
>>501995
Так если ты не богач, то тебе в любом случае всю жизнь работать придется, тем более за рубежом, где все дорогое.
А насчет первоклассности — во многих местах и второклассному будут рады.
Алсо это плохая идея вот так разрывать классы:
from-{% if ... %}right
это подложит тебе свинью при поиске. Лучше писать имя класса всегда целиком.
>>501511
Не пропускай задачи и бейся с ними пока не решишь каждую, иначе толком ничего не усвоишь.
>>501511
array_flip меняет местами клбчи и значения в элементах массива.
>>501553
В программировании подход «кровь из носу» не работает. Это работает в других сферах, это может сработать если ты администратор, но в программировании надо знать теорию, а вариант нагуглить похожее решение и подправить скорее всего не сработает.
>>501635
Будешь ли ты макакокодером, зависит от тебя
>>501651
Если что-то непонятно, задавай вопросы в треде, желательно приложив написанный код и написав на каком месте завис.
>>501684
Вероятнее получится просто «буду макакой»
>>501995
Так если ты не богач, то тебе в любом случае всю жизнь работать придется, тем более за рубежом, где все дорогое.
А насчет первоклассности — во многих местах и второклассному будут рады.
Случайно написал в старом треде. Продублирую здесь.
>ОП отвечает даже на самые нубские вопросы.
Решил задачу про палиндром.
http://ideone.com/Ac42um
Вопрос: что со мной не так? Я чувствую, что все как-то через жопу сделал.
> for ($month = 1; $credit != 0; $month++) {
Тут есть риск, если результат будет не 0, а чуть-чуть меньш нуля, то цикл никогда не остановитя. В компьютере же математика приближенная. Лучше писать $credit > 0
> ($credit >= 5000) {
> $credit = $credit - 5000;
Вынести 5000 в переменную. И в переменную вынеси число процентов. Это во-первых сделает код понятнее, во-вторых будет проще менять числа. Ну и копипасты не будет.
А так, хорошо, считает верно.
Боюсь что нет, если ты будешь изучать фреймворки то можно на их примере учиться.
В файлообменнике нужна папка с классами и кодом, например app, src, папка с шаблонами, например templates, views, папка для статики, (css, js). Ну получается так:
/app
/css
/js
/views
/composer.json
/index.php
Тут правда есть недостаток, все файлы находятся в публичной папке веб сервера, хотя мы бы не хотели выкладывать их. Надежнее сделать папку с публичными файлами отдельно, а весь код вынести за ее пределы:
/app
/views
/composer.json
/public
/public/css
/public/js
/public/index.php
Так будет гораздо безопаснее, но в настройках веб-сервера надо будет правильно пропсиать нужный Document Root. Вообще, это хорошая идея выкладывать в публичную папку только то, что должно быть публично доступно.
Алсо если ты исплоьзуешь git и папку .git выкладываешь на сервер, то через нее можно выкачать репозиторий и украст весь код твоего сайта.
Боюсь что нет, если ты будешь изучать фреймворки то можно на их примере учиться.
В файлообменнике нужна папка с классами и кодом, например app, src, папка с шаблонами, например templates, views, папка для статики, (css, js). Ну получается так:
/app
/css
/js
/views
/composer.json
/index.php
Тут правда есть недостаток, все файлы находятся в публичной папке веб сервера, хотя мы бы не хотели выкладывать их. Надежнее сделать папку с публичными файлами отдельно, а весь код вынести за ее пределы:
/app
/views
/composer.json
/public
/public/css
/public/js
/public/index.php
Так будет гораздо безопаснее, но в настройках веб-сервера надо будет правильно пропсиать нужный Document Root. Вообще, это хорошая идея выкладывать в публичную папку только то, что должно быть публично доступно.
Алсо если ты исплоьзуешь git и папку .git выкладываешь на сервер, то через нее можно выкачать репозиторий и украст весь код твоего сайта.
Имена переменных ужасные. Почитай-ка статью http://learn.javascript.ru/write-unmain-code
> $n_text =
> $length_n
Что значит n?
надо переименовать эти переменные и удалить те, которые не нужны.
> $res;
Что делает эта строка? по моему это ошибка, так как ты пытаешься получить значение переменной и ничего с ним не делаешь.
> $halfLength = floor($length/2);
тут переменная вычисляется из старой длины, с пробелами. и это непраивльно.
> \tif (mb_substr($n_text,$i,1)==mb_substr($n_text,$res,1)) {
> $k=$k+1;
тебе незачем считать число правильных букв. Ты можешь при первом же несовпадении сохранять в переменную признак что произошло несовпадение и слово не палиндром, и выходить из цикла.
Так, идея правильная, но код надо привести в порядок.
Спасибо, ОП! Ты единственный, кто меня хвалит, кроме мамы.
>И в переменную вынеси число процентов
т.е. именно тройку вынести? и будет что-то типа:
$bankRate = 3;
...
$credit = round($credit + ($credit*$bankRate/100) + 1000, 2);
Спасибо большое, буду работать.
>Надежнее сделать папку с публичными файлами отдельно, а весь код вынести за ее пределы
Это для этого на хостингах есть папка public_html?
>Информация: далее в данном руководстве предполагается, что Yii установлен в директорию basic/web, которая, в свою очередь, установлена как корневой каталог в настройках Web сервера. В результате, обратившись по URL http://hostname/index.php, Вы получите доступ к приложению, расположенному в basic/web. Детальнее с процессом начальной настройки можно познакомиться в разделе Установка Yii.
так воот, как мне сделать папку web корневой папкой вебсервера?
>Информация: далее в данном руководстве предполагается, что Yii установлен в директорию basic/web, которая, в свою очередь, установлена как корневой каталог в настройках Web сервера. В результате, обратившись по URL http://hostname/index.php, Вы получите доступ к приложению, расположенному в basic/web. Детальнее с процессом начальной настройки можно познакомиться в разделе Установка Yii.
Проект у меня находится по адресу
D:\OpenServer\OpenServer\domains\localhost\basic\web
так вот как сделать папку web корневой?
А где здесь должна находится папка vendor?
Оно должно быть так?
/app
/views
>/vendor
/composer.json
/public
/public/css
/public/js
/public/index.php
И еще один вопрос по неймспейсам и их взаимодействию с аутолоадером композера, нужно ли их использовать в файлобменнике, и что по ним почитать, можно на английском, и наверно даже лучше на английском
Имеется ввиду корневой каталог твоего проекта, а никак не опенсервера.
Так ты создавал сайты на своем опенсервере раньше:
D:\OpenServer\domains\localhost\example.com\index.php
А такой должна быть структура директорий под Yii2:
D:\OpenServer\domains\localhost\basic\web\index.php
Хотя переводчики начудили, конечно. Такое впечатление, что переводами документации занимаются люди, очень далекие от программирования, какие-нибудь рерайтеры.
>в директорию basic/web, которая, в свою очередь, установлена как корневой каталог в настройках Web сервера
В оригинале http://www.yiiframework.com/doc-2.0/guide-start-installation.html#verifying-the-installation
>This URL assumes you have installed Yii in a directory named basic, directly under the Web server's document root directory
>UNDER the Web server's document root directory
under здесь нужно было перевести не "как корневой каталог", а "в корневой каталог"
Мне кажется, тебе рано браться за большие фреймворки. Там в документации подобные неточности одна на другой, и третьей погоняют.
Может, сначала стоит сделать задание про регистрацию студентов и файлообменник?
В задании про студентов ты отшлифуешь общие принципы ООП и MVC. В файлообменнике можно познакомиться с микрофреймворками типа Slim или Silex, шаблонизаторами, библиотеками и т.д.
Тогда можно будет переходить к более навороченным фреймворкам типа yii2 или тем более симфони, который рассчитан на суровых профи.
Могу ошибаться но вендор же компосер генерирует вроде как. Поправьте если не прав.
Папку vendor создает композер там же где и лежит composer.json, обычно это корень проекта.
> И еще один вопрос по неймспейсам и их взаимодействию с аутолоадером композера, нужно ли их использовать в файлобменнике,
Не обязательно, но хорошо бы. Придется прочесть мануал http://php.net/manual/ru/language.namespaces.php
> и их взаимодействию с аутолоадером композера
Композер умеет делать автозагрузку если имена классов и файлов соответствуют PSR-4
http://www.php-fig.org/psr/psr-4/ru/
https://getcomposer.org/doc/01-basic-usage.md#autoloading
Ты просто прописываешь в composer.json корневой неймспейс (можно пустой) и папку для него. Ну например если твой класс называется
\FileSharing\Model\File
и его код лежит в
app/Model/File.php
То тебе достаточно прописать корневой неймспейс \FileSharing и папку app
По моему Yii можно поставить и не перенастраивая сервер, но тогда ты должен имя папки писать в URL то есть http://hostname/web/index.php
Корневой каталог это DocumentRoot. Когда ты в Апаче создаешь виртуальный хост, ты указываешь где будет его корень, в какой папке. В твоем опенсервере это вряд ли возможно, так что ставь все в localhost и подирай правильный URL.
Алсо сборки не для наичнающих. начинающим надо ставить Апач/PHP руками.
О, мои старые посты, у меня тогда люто бомбило.
А сейчас вроде раздуплился, вовсю использую композер и неймспейсы.
Иногда полезно оглядываться назад, на объем проделанной работы. Это помогает мотивироваться.
Прикатился к вам из верстка треда в воркаче.
Верстку худо-бедно изучил, но во всех вакансиях нужно знание php.
Я так полагаю, для того чтобы натягивать эту самую верстку на всякие цмс без проблем. Поэтому я здесь. Буду выполнять задачки, которые на сайте если не дропну через пару дней, вероятность этого высока, но чтобы не было скучно, буду их сразу применять на практике. Для этого запилил сайтик http://rf.hol.es . Для удобства, там на каждой странице в левом верхнем углу есть ссылка на сурс каждой страницы на гитхабе.
В общем, пока сделал конвертер валют http://rf.hol.es/currency.php
Шлюха для привлечения внимания.
Симпатично выглядит (хотя я бы на гербе градиент сделал посветлее или буквы обвел светлым, а то у тебя как-то неконтрастно получилось).
> ©
забыл точку с запятой
Алсо советую сразу отучиваться перемешивать php и html. Ты пишешь:
html
php
html
php
html
А надо писать:
php
html
То есть сначала посчитал все что надо, потом вывел, а не вперемешку. Алсо вместо <?php echo короче и удобнее писать <?=
Ну и имей в виду, учебник дает только основы. Пройдя его тебе надо будет еще осилить задачу про список студентов и файлообменник (есть в ОП посте) как минимум.
Вот тут неправильно:
> $rubHave = mt_rand(1 , 10000).' руб. '.mt_rand(1 , 99). ' коп.';
> $dollarAmount = round($rubHave / $dollarCost, 2);
Нельзя делить строку на строку (фактически можно, но PHP берет только первую цифру игнорируя копейки и это неправильно). Делить надо числа.
Чтобы сгенерировать рандомное число с копейками, сгенерируй рандомное число и подели на 100. Чтобы вывести это число в виде текста
X руб Y копеек
придется вспомнить пару формул математики, но я уверен что ты справишься, я вижу у тебя хорошо получается.
Вот я только что поставил себе минималистичный pdf-ридер zathura (стандартный ридер тормозит на моем нетбуке).
Вбиваю в гугл "zathura горячие клавиши".
Перехожу по первой ссылке.
http://softhelp.org.ua/?p=2869
Здесь идет перечисление просмотрщиков. А мне нужны именно горячие клавиши для конкретного ридера.
Вторая ссылка.
https://xakep.ru/2011/07/05/55792/
Название домена оправдало мои опасения: малолетние долбоебы обсуждают, что нужно установить себе на компьютер, чтобы считаться хакером, линуксоидом и вообще небыдлом. Искомых мною хоткеев нет.
Третья ссылка.
http://www.unix-lab.org/posts/top-programms/
Вот наконец я нашел то что искал.
Итого: мною потрачено лишних пять минут жизни на скроллинг гугла и посторонних статей.
Это еще ничего, при поиске материала по программированию бывает и похуже.
Что я делаю не так?
Документацию надо читать.
https://pwmt.org/projects/zathura/documentation/
Вот там на первой же строчке путь к конфигу, открыл - посмотрел.
Я использую SumatraPDF (на основе mupdf) и встроенный в хром просмотрщик. Насчет гугла, попробуй читать текст в сниппете, может это поможет отсеять плохие результаты.
>>502428
Ок, пожалуй так.
Делаю вывод, что причиной сложности поиска является плохое знание английского и нежелание вникать в сухую документацию.
Особенно это касается материалов по программированию.
Буду больше ориентироваться на англоязычные материалы, и читать исходную документацию.
Конечно, гораздо приятнее и удобнее было бы найти урок на русском языке по какому-нибудь фреймворку, чем читать его исходный код в api.
Но чего нет, того нет.
$login = $_POST['login'];
\tif($login == NULL){
\t\techo "l null ";
\t}
\t
$password = $_POST['password'];
\tif($password == NULL){
\t\techo "p null ";
\t}
\t
$passwordcontrol = $_POST['passwordcontrol'];
$tel = $_POST['tel'];
if($tel == NULL){
\t\techo "t null ";
\t}
$country = $_POST['country'];
if($country == NULL){
\t\techo "c null ";
\t}
$city = $_POST['city'];
if($city == NULL){
\t\techo "ci null ";
\t}
$invite = $_POST['invite'];
if($invite == NULL){
\t\techo "i null ";
\t}
\t\t
$date = date("H:i d.m.y");
if($date == NULL){
\t\techo "d null ";
\t}
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
$login = trim($login);
$password = trim($password);
$result = include ("test_db.php");
\tif (!$result){
\t\techo "файл не подключился";
\t\t}
$hgv = mysql_query('SET NAMES utf8');
$result = mysql_query ("INSERT INTO `users` (login,password,phone,id_city(FK),invite(FK)) VALUES ('$login','$password','$tel','$city','$invite')");
if ($result == 'TRUE')
{
echo "Вы успешно зарегистрированы!";
}
\telse {
\t\techo "Ошибка! Вы не зарегистрированы.";
}
$login = $_POST['login'];
\tif($login == NULL){
\t\techo "l null ";
\t}
\t
$password = $_POST['password'];
\tif($password == NULL){
\t\techo "p null ";
\t}
\t
$passwordcontrol = $_POST['passwordcontrol'];
$tel = $_POST['tel'];
if($tel == NULL){
\t\techo "t null ";
\t}
$country = $_POST['country'];
if($country == NULL){
\t\techo "c null ";
\t}
$city = $_POST['city'];
if($city == NULL){
\t\techo "ci null ";
\t}
$invite = $_POST['invite'];
if($invite == NULL){
\t\techo "i null ";
\t}
\t\t
$date = date("H:i d.m.y");
if($date == NULL){
\t\techo "d null ";
\t}
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
$login = trim($login);
$password = trim($password);
$result = include ("test_db.php");
\tif (!$result){
\t\techo "файл не подключился";
\t\t}
$hgv = mysql_query('SET NAMES utf8');
$result = mysql_query ("INSERT INTO `users` (login,password,phone,id_city(FK),invite(FK)) VALUES ('$login','$password','$tel','$city','$invite')");
if ($result == 'TRUE')
{
echo "Вы успешно зарегистрированы!";
}
\telse {
\t\techo "Ошибка! Вы не зарегистрированы.";
}
Чувак, просто смирись. Я тоже пару месяцев назад думал, что щас по-быстренькому найду годный учебник или онлайн-курс, типа htmlacademy и быстренько все выучу. Ведь PHP один из самых популярных языков программирования, наверняка к нему кучу охуенных учебных материалов написали! Однако реальность провела мне хуем по губам и отправила штурмовать гугл, вооружив вилкой. Вот и приходится по крохам собирать информацию из разных источников, пытаясь все это в какую-то общую картину в голове сформировать. Хорошо хоть ОП есть, который помогает. Без него вообще не представляю что было бы.
Эмм, а с чего ты взял, что include возвращает какие-то значения? Если ты хочешь проверить существование файла базы, то можешь использовать функцию file_exists. Ну или как вариант is_readable.
include может возвращать значение если в инклюженном файле стоит return: https://php.net/manual/ru/function.include.php
Это я уже давно понял, бро.
Суть в том, что я думаю над тем, как повысить КПД гугления.
Очень много времени тратится впустую. Ну вобью я в гугл "как сделать что-то_нэйм во фреймворк_нэйм". Мне выдает десятки статей. Читаю первую: не по теме. Читаю вторую: устаревшая. Третья непонятная.
В результате все равно приходится возвращаться к справочнику. Где ничего не объясняется, нет примеров, только краткое описание:
есть такой метод, есть такое свойство и т.д.
Приходится самостоятельно делать сотни хелловорлдов, чтобы разобраться. С одной стороны это хорошо, потому что на всю жизнь потом запомнишь решение. Но трата времени чудовищная.
>>502450
> if ($result == 'TRUE')
Я не в курсе тонких нюансов расширения mysql, которое устарело уже лет десять как.
Но оно точно возвращает строку 'TRUE', а не булев тип true?
<?php
$server = 'localhost';
$user = 'root';
$password = '';
$dblink = mysql_connect($server, $user, $password);
if($dblink){
}
\telse{
\tdie('Ошибка подключения к серверу баз данных.');
}\t
$database = 'test_db';
$selected = mysql_select_db($database, $dblink);
if($selected){
\t
\t}
\telse{
\tdie(' База данных не найдена или отсутствует доступ.');
\t}
\t
?> \t
У тебя этот файл ничего не возвращает. Следовательно и в переменную $result ничего не пишется.
В статьях ты ищешь варианты решения. затем открываешь документацию фреймворка (исходный код в тяжелых случаях) и изчаешь что делает та или иная функция которая упомянута в решении, чтобы понять как оно работает.
Поначалу сложно, но со временем это становится проще. Ну и опять же, одно дело если ты начинаешь изучать фреймворк и другое дело если у тебя полгода работы с ним.
Проставь в коде var_dump($result) в том месте, где может быть ошибка, и отслеживай таким образом.
Убери все эти дурацкие условия типа if($login == NULL){echo "l null ";}. Так ты проверяешь значение, но лучше использовать var_dump($переменная), чтобы отловить ошибку.
Еще лучше использовать IDE с отладчиком, но лучше не будем вскрывать эту тему.
После строки $result = include ("test_db.php");
Добавь var_dump($result)
Если увидишь что-то вроде null или bool(false), значит в переменной $result либо null, либо false.
Кстати, это не ты выше спрашивал про выпадающий список? Уровень знаний того анона приблизительно такой же.
>>502417
>Нельзя делить строку на строку
Точно, вот ведь я дебил. И даже не понял вообще никакого подвоха.
В общем, я там переделал, но в итоговой величине так и не получилось отделить центы от целых долларов.
>перемешивать php и html.
Запилил отдельный файл и теперь оттуда все тащу.
><?php echo короче и удобнее писать <?=
>пропустил ;
>картинка
Это тоже все поправил.
http://archive-ipq-co.narod.ru/l1/strings.html
Вроде ответ правильный и даже понимаю алгоритм действий, но может где перемудрил? В общем оцените.
https://ideone.com/MlKeOx
Чтобы сократить код, можно пробелы и переносы строк присоединить к текущей строке, например
echo $word1[mt_rand(0, count($word1) - 1)] . ' ';
count($word1) повторяется в коде более одного раза, можно было бы вынести в переменную.
В данном случае это неважно, всего два повтора, но не вздумай писать функцию в условии цикла, вроде
for($i = 0; $i < count($array); $i++)
А так все правильно. Подожди опа, может он найдет еще к чему придраться.
Понял, спасибо. Сейчас переделаю покороче.
Уже и подзабыл. В каких-то кавычках больше возможностей вроде. А в чем дело?
Ни в чем, просто это нужно знать.
Скопируй на идеоне код
$x = 10;
echo '$x шлюх.\n';
echo "$x шлюх.";
и посмотри, что получилось.
Освежил память, спасибо.
Вот я тут твой код немного для наглядности еще переделал.
https://ideone.com/YqIVpj
да. это был я. конечно мои знания слабоваты, но через пару месяцев я все подтяну. спасибо, я попробую поменять все, то ты сказал.
да. это был я. конечно мои знания слабоваты, но через пару месяцев я все подтяну. спасибо, я попробую поменять все, то ты сказал.
https://ideone.com/j2YstD
https://www.youtube.com/watch?v=ryd449IOUeM
>А роза уgала на лапу Азора
>палиндром
У тебя там опечатка, g в слове упала. Это уже никак не может быть палиндромом.
И у тебя там стоит break еще для первой итерации. По сути он проверяет только первую и последнею букву после чего завершает цикл.
Используя паттерн из http://habrahabr.ru/post/55820/,/ получаю вот это Warning: preg_match(): Unknown modifier '_' in
http://ideone.com/YBI8ph
Оно работает, но я чувствую, что сделал хуйню и можно было гораздо проще. Подскажи, что можно поправить?
Что ты имеешь в виду под словом «проверить»? На каком сайте, твоем или не твоем? И если не на твоем, то по моему тут симфони не при чем.
У меня есть две версии сайта, мобильная (м.сайт.ру) и обычная (сайт.ру), мне нужно сделалть редирект, но каких то страниц в мобильной версии может не быть, мне нужно проверить их наличие
«Место жительства:» и «Пол:» у тебя оформлены по-другому, не как остальные поля. Тебе стоит начать изучать HTML/CSS, они не такие и сложные, но зато ты не будешь испытывать проблем с оформлением страницы.
Так, а что не так с текущим оформлением радиокнопок? Я не совсем понимаю как же они должны выглядеть если текущий вид почему-то не приемлем.
В чем ошибка? Должно ведь работать по логике.
Я имею в виду, у других полей подпись находится над полем ввода, а тут слева и они выбиваются из общего вида. Лучше бы сделать аналогично, подпись сверху, а снизу 2 варианта.
Про HTML/CSS это общий совет.
ОП, а почему ты агришься на таблицы в верстке?
Кроме педантичного аргумента "таблицы только для таблиц", есть основания их не применять?
Зачем лепить кучу плавающих дивов с относительным позиционированием, если можно сделать обычной таблицей?
Ладно, когда саму сетку сайта (хедер, футер и т.д.) делали таблицей. Выглядело странно, плюс были аргументы типа того что пока таблица полностью не построится в памяти, она не отрендерится.
Но сейчас с трафиком вроде все хорошо, грузится быстро.
Почему не использовать таблицы для оформления мелких объектов типа форм?
Отдохнул и разобрался как сделать красивее, помощь больше не требуется.
> а почему ты агришься на таблицы в верстке?
Потому что у них нет ни одного преимущества перед нормальной CSS версткой. Кто их использует? Только тот кто учился 10 лет назад по устаревшим учебникам и принипиально не хочет переучиваться. такие люди у меня симпатии не вызывают, пусть они остаются в своем прошлом.
Если ты не старикан с закисшими мозгами, то у тебя вообще нет ни одной причины использовать технологии 2000 года.
Формы верстаются несложно, делаем строчку формы с клеаром, в ней 2 дива, один зафлоачен влево, другой с margin left, отвечающий за правую часть.
Также, в CSS есть display: table для тех кому проще мыслить таблицами, но его стоит изучить на предмет подводных камней.
> Зачем лепить кучу плавающих дивов с относительным позиционированием,
Что плохого в флоатах?
> плюс были аргументы типа того что пока таблица полностью не построится в памяти, она не отрендерится.
скорость загрузки тут не при чем. Аргументы против таблиц другие:
— это плохой код, который неприятно читать и править, уродливая разметка, это несемантично, так как теги должны обозначать то что в них написано, если написано table то это настоящая таблица. Зачем путать людей и программы чтения с экрана?
— таблицы не адаптивны
— таблицы труднее и неудобнее верстать через CSS, меньше возможностей для оформления, есть ограничения, например нельзя делать абс. поз-е относительно ячейки таблицы, нельзя сделать закругление/тень, нельзя поместить ячейку поверх другой ячейки. То есть к такой верстке приделать что-то требует лишних усилий.
Но главный вопрос, если есть CSS и стандартный способ верстки, зачем надо вместо прямого пути искать обходные и запутанные? Кому-то лень потратить несколько дней на изучение позиционирования, а другим потом в их быдлокоде надо ковыряться? Нет, не надо так делать.
Алсо на htmlacademy есть курсы посвященные позиционированию, они доступны бесплатно. Алсо на softwaremaniacs хороший хоть и старый учебник по теме.
Думаю, да. Ты можешь посмотреть api docs по классу Router чтобы узнать что именно надо передавать.
>Если ты не старикан с закисшими мозгами
Я наоборот только учусь.
Просто если в форме поля идут колонками, как в таблице, первая мысль приходит делать ее таблицей.
> Зачем лепить кучу плавающих дивов с относительным позиционированием,
>Что плохого в флоатах?
Ничего, только это кажется более запутанным и неочевидным решением.
>программы чтения с экрана
Все о них говорят, но никто в глаза не видел. Они правда существуют?
Это вообще что, для слепых? Или для хипсторов, которые везде демонстративно ходят в наушниках, мол презираю вас всех?
> таблицы труднее и неудобнее верстать через CSS, меньше возможностей для оформления, есть ограничения
Ну вот это пожалуй разумно, принимаю.
>если есть стандартный способ верстки
Ссылку на стандарт, плиз.
Не, ну серьезно, вдруг в верстке тоже есть что-то типа паттернов, которых нужно придерживаться.
Лично мне по-барабану, какой способ выбрать. Ты вроде удебил пользоваться дивами, у них больше возможностей, ок.
Кстати, насколько часто php-программисту придется заниматься версткой? Знать html и css безусловно нужно. Но верстать я надеюсь не придется? У меня нет дизайнерского вкуса. Когда есть готовый макет, я с горем пополам могу его реализовать. Но если нужно продумать дизайн, получается что-то убогое, даже бутстрап с его заебавшим ариалом и огромными кнопками выглядит не так плохо.
Автор правда склонен к графоманству и блоггерству, но зато пишет доступно, с объяснениями и пошагово, не посылает на гугл как мудаки с хабра.
Решаю задачу про Айпад в кредит http://archive-ipq-co.narod.ru/l1/functions.html
Ты самостоятельно проверил хотя бы один раз, прежде чем писать сюда?
Мы подскажем, если серьезный вопрос, но исправлять за тебя опечатки...
>>программы чтения с экрана
Для слепых.
> Просто если в форме поля идут колонками, как в таблице, первая мысль приходит делать ее таблицей.
Значит ты плохо усвоил разницу между HTML и CSS. HTML используется для смысловой разметки текста, теги HTML говорят чем является тот или иной фрагмент страницы. CSS задает оформление и внешний вид. Если ты это понимаешь то для тебя должно быть очевидным что использовать HTML тег таблицы для задания внешнего вида недопустимо. Для этого надо использовать CSS.
И как я написал выше, для таблицеподобного позиционирования есть display: table
>>если есть стандартный способ верстки
> Ссылку на стандарт, плиз.
Стандарт CSS? Ну вот например CSS2.1: http://www.w3.org/TR/CSS2/
Там на первой странице написано:
> CSS 2.1 is a style sheet language that allows authors and users to attach style (e.g., fonts and spacing) to structured documents (e.g., HTML documents and XML applications). By separating the presentation style of documents from the content of documents , CSS 2.1 simplifies Web authoring and site maintenance.
Как видишь речь про разделение контента и стилей оформления.
> Лично мне по-барабану, какой способ выбрать.
Я только не понимаю почему ты вообще рассматриваешь «верстку таблицами» как вариант. Это не вариант.
> насколько часто php-программисту придется заниматься версткой?
зависит от компании, но уметь что-то добавить на страницу или поменять самостоятельно в любом случае надо.
> Но верстать я надеюсь не придется? У меня нет дизайнерского вкуса.
Тебе не нужен вкус, тебе надо сделать как на макете. Но вообще, есть книга, «Дизайн для недизайнеров», она маленькая и она объясняет базовые вещи, вроде контрастности или близости, может быть полезно ее почитать для развития.
> Но если нужно продумать дизайн, получается что-то убогое,
Обычно этим занимается дизайнер либо покупается готовый шаблон, а тебе надо только адаптировать его под сайт. То есть CSS знать надо, уметь сжимать картинки надо, а уметь рисовать красивые страницы в фотошопе не надо.
>>программы чтения с экрана
Для слепых.
> Просто если в форме поля идут колонками, как в таблице, первая мысль приходит делать ее таблицей.
Значит ты плохо усвоил разницу между HTML и CSS. HTML используется для смысловой разметки текста, теги HTML говорят чем является тот или иной фрагмент страницы. CSS задает оформление и внешний вид. Если ты это понимаешь то для тебя должно быть очевидным что использовать HTML тег таблицы для задания внешнего вида недопустимо. Для этого надо использовать CSS.
И как я написал выше, для таблицеподобного позиционирования есть display: table
>>если есть стандартный способ верстки
> Ссылку на стандарт, плиз.
Стандарт CSS? Ну вот например CSS2.1: http://www.w3.org/TR/CSS2/
Там на первой странице написано:
> CSS 2.1 is a style sheet language that allows authors and users to attach style (e.g., fonts and spacing) to structured documents (e.g., HTML documents and XML applications). By separating the presentation style of documents from the content of documents , CSS 2.1 simplifies Web authoring and site maintenance.
Как видишь речь про разделение контента и стилей оформления.
> Лично мне по-барабану, какой способ выбрать.
Я только не понимаю почему ты вообще рассматриваешь «верстку таблицами» как вариант. Это не вариант.
> насколько часто php-программисту придется заниматься версткой?
зависит от компании, но уметь что-то добавить на страницу или поменять самостоятельно в любом случае надо.
> Но верстать я надеюсь не придется? У меня нет дизайнерского вкуса.
Тебе не нужен вкус, тебе надо сделать как на макете. Но вообще, есть книга, «Дизайн для недизайнеров», она маленькая и она объясняет базовые вещи, вроде контрастности или близости, может быть полезно ее почитать для развития.
> Но если нужно продумать дизайн, получается что-то убогое,
Обычно этим занимается дизайнер либо покупается готовый шаблон, а тебе надо только адаптировать его под сайт. То есть CSS знать надо, уметь сжимать картинки надо, а уметь рисовать красивые страницы в фотошопе не надо.
Там внизу написано где ошибка:
> PHP Notice: Undefined variable: creditsum in /home/QXApT6/prog.php on line 26
> $creditsum - 39999;
ты наверно хотел равно вместо минуса написать
Также, не называй переменные транслитом по-русски, это ужасно, это реально ужасно. Открой гугл транслейт или яндекс-словари и посмотри там перевод нужного слова.
И еще у тебя сбились отступы, советую пропустить код через phpformatter.com, он его отформатирует как надо.
Еще, ты вызываешь функцию:
> $homoCreditTotal = credit($creditsum, 1.04, 500, 0, $payount);
но в самой функции нет return, значит она ничего не вернет (точнее вернет null который при выводе выводится как пустая строка, в итоге твоя программа ничего не печатает)
В общем, исправь, чтобы программа выводила что-нибудь, и тогда проверим.
https://ideone.com/ii5Uir
Извиняйте за глупость, новичок совсем.
Дело не в глупости, а в несамостоятельности.
И тебе гуру выше подсказал уже, нужно чтобы функция что-то возвращала. Читай про конструкцию return
http://www.php.su/learnphp/cs/?rc
Эта функция ничего не возвращает:
function foo()
{
x = 2 + 2;
}
Она тупо что-то считает и умирает, результат ее работы улетает в пустоту.
Нужно так:
function foo()
{
x = 2 + 2;
return x;
}
Тогда ты сможешь получить из нее значение $result = foo();
Это риторический вопрос.
Вопрос, который меня сейчас действительно волнует (аж будоражит, фигурально выражаясь), это что обозначает \w в регулярных выражениях?
В разных статейках противоречивые данные: кто-то говорит, что это буквы лат.алфавита+цифры+_
http://www.php.su/articles/?cat=regexp&page=006
>Обычно все буквы, все цифры и знак подчеркивания ('_')
как вам нравится слово "обычно"? Мы уже не программисты, мы уже гуманитарии нахуй.
И что они подразумевают под "буквой"? Только латинские символы, или букву из любого алфавита utf, хоть кириллицу, хоть иврит?
http://www.exlab.net/tools/sheets/regexp.html
> \w соответствует буквам и цифрам
Еще точнее, молодцы. А подчеркивание?
https://msdn.microsoft.com/ru-ru/library/az24scfc(v=vs.110).aspx
>Соответствует любому алфавитно-цифровому знаку.
Казалось бы, msdn это тебе не хухры-мухры. А в ту же калитку.
http://phpclub.ru/detail/article/regexp_1
>\w - спецсимвол, который призван заменить целый символьный класс, в него входят все символы, которые могут входить в слово, обычно это [a-zA-Z_], хотя много может зависеть от установленной локали, поддержки юникода и т.д.
Ну хоть один порядочный человек среди толпы мудаков.
Хотя у него урок для начинающих, и он не вдается в подробности, как узнать эту самую "локаль" на конкретной машине?
Плюнув на все это, делаем то, с чего нужно было начинать: ищем какую-нибудь официальную спецификацию.
Для начала я захожу на википедию, чтобы узнать, как по-умному называются регулярные выражения.
Они называются Perl-compatible regular expressions
По этому запросу попадаю на сайт http://www.pcre.org/ , который поражает своей внеземной красотой и удобным юзабилити.
Я ожидаю сразу увидеть заметную ссылку, но мои ожидания оказываются обманутыми.
Проскроллив это полотно, нахожу наконец где-то на втором-третьем экране ссылку на документацию.
http://perldoc.perl.org/perlre.html#Regular-Expressions
>Match a "word" character (alphanumeric plus "_", plus other connector punctuation chars plus Unicode marks)
:(
Что значит aplphanumeric? Это лат.алфавит + \d? Что такое "other connector punctuation chars"? Что такое "Unicode marks"? У меня неважный английский, я это перевожу как "знаки юникода". Какие знаки? Там же помимо алфавитных символов типа иероглифов или арабской вязи еще куча всяких сердечек и прочей хуиты. Это подпадает под определение или нет?
Это какой-то инфернальный пиздец, господа.
Мне всего-то нужно узнать, что означает \w.
Когда я буду опытным кодером, я буду держать все это в голове. Но пока я слегка охуеваю от всей этой неразберихи.
Это риторический вопрос.
Вопрос, который меня сейчас действительно волнует (аж будоражит, фигурально выражаясь), это что обозначает \w в регулярных выражениях?
В разных статейках противоречивые данные: кто-то говорит, что это буквы лат.алфавита+цифры+_
http://www.php.su/articles/?cat=regexp&page=006
>Обычно все буквы, все цифры и знак подчеркивания ('_')
как вам нравится слово "обычно"? Мы уже не программисты, мы уже гуманитарии нахуй.
И что они подразумевают под "буквой"? Только латинские символы, или букву из любого алфавита utf, хоть кириллицу, хоть иврит?
http://www.exlab.net/tools/sheets/regexp.html
> \w соответствует буквам и цифрам
Еще точнее, молодцы. А подчеркивание?
https://msdn.microsoft.com/ru-ru/library/az24scfc(v=vs.110).aspx
>Соответствует любому алфавитно-цифровому знаку.
Казалось бы, msdn это тебе не хухры-мухры. А в ту же калитку.
http://phpclub.ru/detail/article/regexp_1
>\w - спецсимвол, который призван заменить целый символьный класс, в него входят все символы, которые могут входить в слово, обычно это [a-zA-Z_], хотя много может зависеть от установленной локали, поддержки юникода и т.д.
Ну хоть один порядочный человек среди толпы мудаков.
Хотя у него урок для начинающих, и он не вдается в подробности, как узнать эту самую "локаль" на конкретной машине?
Плюнув на все это, делаем то, с чего нужно было начинать: ищем какую-нибудь официальную спецификацию.
Для начала я захожу на википедию, чтобы узнать, как по-умному называются регулярные выражения.
Они называются Perl-compatible regular expressions
По этому запросу попадаю на сайт http://www.pcre.org/ , который поражает своей внеземной красотой и удобным юзабилити.
Я ожидаю сразу увидеть заметную ссылку, но мои ожидания оказываются обманутыми.
Проскроллив это полотно, нахожу наконец где-то на втором-третьем экране ссылку на документацию.
http://perldoc.perl.org/perlre.html#Regular-Expressions
>Match a "word" character (alphanumeric plus "_", plus other connector punctuation chars plus Unicode marks)
:(
Что значит aplphanumeric? Это лат.алфавит + \d? Что такое "other connector punctuation chars"? Что такое "Unicode marks"? У меня неважный английский, я это перевожу как "знаки юникода". Какие знаки? Там же помимо алфавитных символов типа иероглифов или арабской вязи еще куча всяких сердечек и прочей хуиты. Это подпадает под определение или нет?
Это какой-то инфернальный пиздец, господа.
Мне всего-то нужно узнать, что означает \w.
Когда я буду опытным кодером, я буду держать все это в голове. Но пока я слегка охуеваю от всей этой неразберихи.
break не нужен, return прерывает саму функцию, естественно цикл тоже будет прерван
код, который идет после return, никогда не исполнится.
> Что значит aplphanumeric?
Слово «alphanumeric» значит алфавитно-цифровой символ, то есть буквы и цифры.
Подробнее:
http://php.net/manual/ru/regexp.reference.escape.php
> \w Любой символ, образующий "слово"
> Символ, образующий "слово" - это произвольная цифра, буква или символ подчеркивания, проще говоря, любой символ, который может являться частью "слова" в Perl. Определение букв и цифр управляется символьными таблицами, с которыми была собрана PCRE.
От себя добавлю что если исплоьзуется флаг u (его надо всегда использовать) то под «буквой» имеется в виду буква любого алфавита, и \w соответствует цифрам (любых языков), подчеркиванию и буквам любых алфавитов.
Вот если брать термины отсюда: http://php.net/manual/ru/regexp.reference.unicode.php то:
\w any character that matches \p{L} or \p{N}, plus underscore
(написано тут: http://pcre.org/pcre.txt , это мануал по библиотеке PCRE которую исплоьзует PHP)
> Хотя у него урок для начинающих, и он не вдается в подробности, как узнать эту самую "локаль" на конкретной машине?
Локаль определяется из переменных окружения LANG, LC_ALL и других: https://help.ubuntu.com/community/Locale
Локаль задает язык выводимых сообщений, настройки форматирования чисел и дат, кодировку.
Локаль обозначается названием, и эти названия не кроссплатформенны, на линуксе одни, на windows другие. Также локаль должна быть установлена в системе чтобы она работала.
Как видишь локаль весьма хрупкая и неудоюная вещь.
если ты используешь флаг u то используется utf-8 и локаль игнорируется. Используй этот флаг всегда.
http://archive-ipq-co.narod.ru/
Меня интересуют в частности употребление регулярных выражений в mod_rewrite.
Куда мне здесь флажки засовывать? Русские буквы он поймет в урле?
RewriteRule ^download/(\w+)/(\w+)$ /upload/$1_$2.txt
Это выражение кстати почему-то не работает. Выдает 404.
Работает так:
RewriteRule ^download/(.+)/(.+)$ /upload/$1_$2.txt
Но ты мне сказал поправить, чтобы не проходили слеши. Сделал пока так, вроде работает:
RewriteRule ^download/([^/]+)/([^/]+)$ /upload/$1_$2.txt
Стажер/джуниор.
Нормальный человек - за пять лет в университете.
А так полгода-год, если будешь заниматься по 6-12 часов в день.
1-2 месяца, если есть опыт программирования на других языках.
Вообще, искать информацию надо в 2 местах, в официальной документации:
http://php.net/manual/ru/book.pcre.php — информация от авторов PHP, менее подробная чем вторая ссылка
http://www.pcre.org/ — библиотека PCRE котоаря используется в PHP
Если этого не достаточно то открываем исходники PHP и отправляемся в увлекательное путешествие...
> как вам нравится слово "обычно"?
Статья же не официальная.
Обычно = когда не стоит флаг u и когда не задана конкретная локаль. Тогда буква значит символ из диапазона a-z. Если флаг u то буква значит буква любого алфавита, и в юникоды этих букв тысячи: http://unicode-table.com/ru/
Если флага u нет и задана локаль, то буква значит символ который считается буквой в этой локали. Локали используются с 8-битными кодировками так что больше 255 символов в них быть не может. для европейской локали например буква это латинские символы + латинские символы с точками и кружочками.
Лучше всегда ставить флаг u.
> олько латинские символы, или букву из любого алфавита utf,
Если флаг u то буква любого алфавита.
> Казалось бы, msdn это тебе не хухры-мухры. А в ту же калитку.
Это справка по .NET, там другие регулярки. Но насколько я знаю, в дотнете с поддержкой юникода все в порядке.
> По этому запросу попадаю на сайт http://www.pcre.org/ , который поражает своей внеземной красотой и удобным юзабилити.
Ты редко бываешь на таких сайтах и тебе непривычно. Мне например так же непривычно ориентироваться в твиттере. А вот на сайте pcre я сразу вижу где что и прокручиваю к слову documentation. То есть это вопрос привычки.
> Проскроллив это полотно, нахожу наконец где-то на втором-третьем экране ссылку на документацию.
Достаточно нажать text version of the PCRE2 man pages либо PCRE2 HTML documentation
То, что ты открыл, это мануал языка perl, а не библиотеки pcre. Не беда, со временем научишьяс не путаться.
> Что значит aplphanumeric? Это лат.алфавит + \d? Что такое "other connector punctuation chars"? Что такое "Unicode marks"?
Там стоит ссылка [3] и по ней мы видим:
> See Backslash sequences in perlrecharclass for details.
Там есть подробное описание. Оно сложное но его суть в том что все зависит от того включен режим utf-8 или нет, если нет то от локали.
> У меня неважный английский, я это перевожу как "знаки юникода".
Там написано что это комбинационные знаки вроде кружочков и точек над буквами которые в юникоде можно прикреплять к любой букве.
Вот такие:
https://en.wikipedia.org/wiki/Combining_character
http://unicode.org/faq/char_combmark.html
> Но пока я слегка охуеваю от всей этой неразберихи.
Хороший шанс получше узнать особенности юникода.
Вообще, искать информацию надо в 2 местах, в официальной документации:
http://php.net/manual/ru/book.pcre.php — информация от авторов PHP, менее подробная чем вторая ссылка
http://www.pcre.org/ — библиотека PCRE котоаря используется в PHP
Если этого не достаточно то открываем исходники PHP и отправляемся в увлекательное путешествие...
> как вам нравится слово "обычно"?
Статья же не официальная.
Обычно = когда не стоит флаг u и когда не задана конкретная локаль. Тогда буква значит символ из диапазона a-z. Если флаг u то буква значит буква любого алфавита, и в юникоды этих букв тысячи: http://unicode-table.com/ru/
Если флага u нет и задана локаль, то буква значит символ который считается буквой в этой локали. Локали используются с 8-битными кодировками так что больше 255 символов в них быть не может. для европейской локали например буква это латинские символы + латинские символы с точками и кружочками.
Лучше всегда ставить флаг u.
> олько латинские символы, или букву из любого алфавита utf,
Если флаг u то буква любого алфавита.
> Казалось бы, msdn это тебе не хухры-мухры. А в ту же калитку.
Это справка по .NET, там другие регулярки. Но насколько я знаю, в дотнете с поддержкой юникода все в порядке.
> По этому запросу попадаю на сайт http://www.pcre.org/ , который поражает своей внеземной красотой и удобным юзабилити.
Ты редко бываешь на таких сайтах и тебе непривычно. Мне например так же непривычно ориентироваться в твиттере. А вот на сайте pcre я сразу вижу где что и прокручиваю к слову documentation. То есть это вопрос привычки.
> Проскроллив это полотно, нахожу наконец где-то на втором-третьем экране ссылку на документацию.
Достаточно нажать text version of the PCRE2 man pages либо PCRE2 HTML documentation
То, что ты открыл, это мануал языка perl, а не библиотеки pcre. Не беда, со временем научишьяс не путаться.
> Что значит aplphanumeric? Это лат.алфавит + \d? Что такое "other connector punctuation chars"? Что такое "Unicode marks"?
Там стоит ссылка [3] и по ней мы видим:
> See Backslash sequences in perlrecharclass for details.
Там есть подробное описание. Оно сложное но его суть в том что все зависит от того включен режим utf-8 или нет, если нет то от локали.
> У меня неважный английский, я это перевожу как "знаки юникода".
Там написано что это комбинационные знаки вроде кружочков и точек над буквами которые в юникоде можно прикреплять к любой букве.
Вот такие:
https://en.wikipedia.org/wiki/Combining_character
http://unicode.org/faq/char_combmark.html
> Но пока я слегка охуеваю от всей этой неразберихи.
Хороший шанс получше узнать особенности юникода.
Здесь стоит открыть мануал Апача.
http://httpd.apache.org/docs/current/rewrite/intro.html
http://httpd.apache.org/docs/current/mod/mod_rewrite.html
> The mod_rewrite module uses a rule-based rewriting engine, based on a PCRE regular-expression parser,
Тут написано что используется PCRE но увы, не написано используется ли utf-8 режим, и я так чувствую что не используется. Значит стоит считать что \w значит латинскиу буквы, цифры, подчеркивание и может быть европейские буквы с точками над ними (ты можешь написать комментарий внизу чтобы разработчики прояснили ситуацию, какой редим используется и что значит \w)
> Сделал пока так, вроде работает:
> RewriteRule ^download/([^/]+)/([^/]+)$ /upload/$1_$2.txt
Так и надо было
В шаблоне делаешь ссылку на скрипт-генератор:
<img href="preview.php?img=name">
В скрипте preview.php спокойно генерируешь нужное изображение и отдаешь вместе с нужным заголовком.
Смотри пример1, где показана генерация ватермарки.
http://www.php.su/functions/?cat=image
Спасибо, то что нужно
https://ideone.com/ylcIXh
Естественно оно не будет работать. Как одна и та же строка может одновременно соответствовать трем разным шаблонам?
Ты не путаешь && и || ?
>>503408
И там не должно быть трех регулярок. Суть регулярных выражений в том, чтобы одним шаблоном описать все возможные варианты.
Напиши одно регулярное выражение, под которое попадут все три варианта написания номера телефона.
Кстати, в php в отличие от js есть не только && и ||, еще or и and.
Они отличаются разными приоритетами, это нужно знать, чтобы не ошибиться в выражениях типа
$e = false || true;
$f = false or true;
http://php.net/manual/ru/language.operators.logical.php
http://php.net/manual/ru/language.operators.precedence.php
А если у тебя будет десять разных форматов номера телефона, ты под каждый будешь писать регулярное выражение?
Нужно написать одно регулярное выражение, под которое подпадут все варианты написания номера телефона.
Сделай лучше это задание, с большим списком телефонов
http://arhivach.org/thread/88638/#489368
Я всю голову сломал пока делал и так и не сделал. Намного же легче было в моем варианте, чем в том что сейчас делаю. Или я вообще не то делаю?
https://ideone.com/3tsFFm
https://ideone.com/EE3pn4
Или может как-то так нужно? Я не понимаю, голова раскалывается уже.
У кого-нибудь же должно быть правильное решение, можно посмотреть? Я бы хоть врубился как нужно делать.
HTML - http://pastebin.com/wfVKXGv1
CSS - http://pastebin.com/Qb7Tmhsm
Может, сначала нужно выучить синтаксис регулярных выражений, а потом ломать голову?
http://php.net/manual/ru/reference.pcre.pattern.syntax.php
http://www.php.su/articles/?cat=regexp&page=008
Вот твой список допустимых форматов:
«8(ххх)-ххх хх хх», «8-ххх-ххх-хх-хх» или «8хххххххххх»
Мы видим, что номер обязан начинаться с цифры 8. Начало строки обозначается ^
/^8
Дальше может идти либо открывающая скобка (в 1-ом выражении), либо дефис (во 2-ом), либо ничего (в третьем). Для перечисления вариантов есть такая вещь как символьный класс. Например [3-7] цифры в диапазоне от 3 до 7. Знак минус тут выступает в роли служебного символа диапазона. Если нужно использовать его как обычный литерал, можно поставить в начало строки
/^8[-(]?
Знак ? означает, что символ слева может встретиться от 0 до 1 раз. То есть может быть, а может не быть.
Затем идут три цифры подряд. Цифры можно задать символьным классом [0-9] либо сокращенно \d (от слова digit). Кол-во повторов символа слева пишется в фигурных скобках
/^8[-(]?\d{3}
Дальше идет либо )- в первом выражении, либо - во втором, либо ничего в третьем. Круглые скобки являются оператором группировки, поэтому чтобы их использовать как обычный литерал, нужно заэкранировать бэкслешем.
/^8[-(]?\d{3}(\)-|-)?
Кстати, тут интересный момент: если попалась открывающая скобка, значит должна быть и закрывающая.
Значит нужно сгруппировать несколько символов. Либо (ххх)-, либо -ххх-, либо ххх. "Либо" обозначается знаком pipeline |
/^8(\(\d{3}\)-|-\d{3}-)?
Дальше сам, короче. Выучи теорию, попрактикуйся на элементарных примерах. Потом сделай улучшенную задачу на список телефонов.
http://arhivach.org/thread/88638/#489368
Html, css и js лучше выкладывать на jsfiddle, там можно увидеть внешний вид верстки и результат работы скрипта.
http://jsfiddle.net/4ghygt4L/
>padding: 10px;
Разницу между margin и padding знаешь? Паддинг это внутреннее поле, марджины это отступы.
Поля по умолчанию не входят в ширину, то есть общая ширина твоего контейнера это width + padding-left + padding-right, то есть 320px.
Если ты хочешь, чтобы контейнер был 300 px, а вложенные в него дивы занимали 66%, то можно использовать свойство box-sizing: padding-box, чтобы переопределить width. Теперь width будет отсчитываться вместе с полями.
http://htmlbook.ru/css/box-sizing
Обрати внимание, что это новое нестандартное свойство, нужно использовать альтернативные варианты с префиксами -webkit- и -moz- для совместимости.
https://github.com/V3N0m21/Uppu2
Баг: в поле «оценка за ЕГЭ» можно ввести строку вроде 999asdasdasd и он не жалуется. Также, можно ввести число вроде 99999. Проверь, что вводятся только числа в разумных пределах.
Можно не заполнить выбор «Приезжий/Местный», в этом случае выпадает ошибка при вставке в БД (спасибо строгому режиму). Надо проверять заполненность этого поля.
Уведомление «Ваша информация была сохранена» надо сделать более заметным, я бы выводил его, используя такую зеленую бутстраповскую плашку: http://getbootstrap.com/components/#alerts
Когад уведомлений нет, пустой <p> добавляет некрасивый отступ сверху меню. Я думаю, надо не выводить его в этом случае или переделать уведомления на плашки под меню.
Кнопка «Редактировать мои данные» на 4-5 пикселей левее чем input выше, некрасиво как-то. Почему так? Надо открыть инспектор (Ctrl + Shift + I) и разобраться. Я вижу, что строки form-row у тебя почему-то шире самой страницы (из-за margin-right/left: -15px;). Потому внутри form-row «2 колонки» имеют немного другую ширину, нежели не внутри. Как решение, можно засунуть строчку с кнопкой тоже внутрь form-row.
Ну и когда ты выровянешь кнопку, у нас остается проблема того, что страница с формой имеет горизонтальную прокрутку. Как я выше написал, form-row имеет отрицательный margin и вылезает за пределы страницы. Очевидно, ты забыл добавить где-то выше (на форме например) класс, который бы добавлял поля и ограничивал ширину. Ну к примеру, можно для формы задать какую-то ширину, к примеру 5 или 6 колонок сетки.
Также, я замечу, вместо того чтобы к каждой строчке формы приписывать класс для ширины (col-sm-2), может быть проще задать ширину только для элемента form, а все дочерние элементы растянутся на 100% от нее. А, хотя это так в документации бутстрапа написано, тогда можно оставить как есть.
Где-то в коде у тебя написано «Exeption» вместо Exception (судя по ошибке автозагрузки), найди место поиском и поправь.
> https://github.com/V3N0m21/StudentList/blob/master/lib/Paginator.php#L43
> $search = u($search);
> $link = http_build_query($data);
Не надо делать urlencode если ты используешь build_query так как она делает это сама и у тебя данные получаются лишний раз закодированы.
> https://github.com/V3N0m21/StudentList/blob/master/lib/init.php#L5
> #if (file_exists($file)) {
Надо сделать чтобы это заработало. Автозагрузчик должен подключать файл только если тот существует.
> https://github.com/V3N0m21/StudentList/blob/master/views/list.php#L6
> "Показаны студенты соответствующие запросу '$search'" :
Это XSS. Обойди все шаблоны, все места, где что-то выводится, и либо поставь там h( ) либо аргументируй комментарием почему оно не нужно тут.
> https://github.com/V3N0m21/StudentList/blob/master/views/main.php#L8
Шаблон не должен лезть в COOKIE/GET, я советую либо выставлять нужную переменную в init.php либо сделать функцию, првоеряющую залогиненность.
Мне кажется в твоем случае удобнее сделать третье значение для переменной $page.
> https://github.com/V3N0m21/StudentList/blob/master/views/reg.php#L35
> $student->sex == 'M'
> value="M"
Здесь надо использовать константу
Для id="M" можно не использовать константу, так как этот id никуда все равно не передается.
Аналогично с местом жительства.
Также, потрать 5 минут на исправление форматирования в файле StudentList/views/reg.php. Я попробовал найти форматтер HTML, и единственный, который не ломает PHP код, оказался этот: http://ctrlq.org/beautifier/ — но после него придется руками подрправить PHP код.
Файл должен быть отформатирован примерно по такому принципу:
— для HTML можно использовать 2 или 4 пробела, у тебя код не сложный так что 4 вполне подойдет
— после блочных тегов вроде div, form, отступ увеличивается
— парные открывающий/закрывающий теги находятся друг под другом
— строчные теги вроде span, label, можно писать в одну строку с их содержимым, можно на разных
— если тег очень длинный, то мы его переносим, добавляя отступ к перенесенной части:
<div lala lala lala
....lalala="...">
</div>
— внутри PHP блоков вроде foreach, if, отступ увеличивается
<?php include_once './views/main.php'; ?>
<form ....>
....<div class="form-group <?= !empty($validation->errors['name']) ? "has-error" : '' ?>">
........<label for="Name" class="control-label col-sm-2">
............Имя:
........</label>
........<div class="col-sm-3">
............<input type="text" class="form-control" id="Name" name="Name" placeholder="Введите имя"
.................value="<?=h($student->name);?>">
.........</div>
То, что у тебя, тяжело читать, так как все идет сплошной стеной и не видно что внутрь чего вложено.
Я стараюсь не придираться к мелким косякам в оформлении, но у тебя там каждый второй файл не выровнен. Может твой редактор не позволяет удобно это делать?
Ну и к следующему проекту разберись с форматированием, редактором, чтобы больше такого бардака не было, так как такого я давно не видел.
Теперь вернемся к багу, который я обнаружил ранее, а именно чувствительность поиска к регистру. Если я ввожу «Семе» то он находит Семенов, а вот если ввести в нижнем регистре, ничего не находится. Я сначала подумал что проблемы в моих настройках, но дело не в них. Если я меняю запрос c CONCAT на
Читать дальше (спам лист): http://pastebin.com/uGkWqK8n
Баг: в поле «оценка за ЕГЭ» можно ввести строку вроде 999asdasdasd и он не жалуется. Также, можно ввести число вроде 99999. Проверь, что вводятся только числа в разумных пределах.
Можно не заполнить выбор «Приезжий/Местный», в этом случае выпадает ошибка при вставке в БД (спасибо строгому режиму). Надо проверять заполненность этого поля.
Уведомление «Ваша информация была сохранена» надо сделать более заметным, я бы выводил его, используя такую зеленую бутстраповскую плашку: http://getbootstrap.com/components/#alerts
Когад уведомлений нет, пустой <p> добавляет некрасивый отступ сверху меню. Я думаю, надо не выводить его в этом случае или переделать уведомления на плашки под меню.
Кнопка «Редактировать мои данные» на 4-5 пикселей левее чем input выше, некрасиво как-то. Почему так? Надо открыть инспектор (Ctrl + Shift + I) и разобраться. Я вижу, что строки form-row у тебя почему-то шире самой страницы (из-за margin-right/left: -15px;). Потому внутри form-row «2 колонки» имеют немного другую ширину, нежели не внутри. Как решение, можно засунуть строчку с кнопкой тоже внутрь form-row.
Ну и когда ты выровянешь кнопку, у нас остается проблема того, что страница с формой имеет горизонтальную прокрутку. Как я выше написал, form-row имеет отрицательный margin и вылезает за пределы страницы. Очевидно, ты забыл добавить где-то выше (на форме например) класс, который бы добавлял поля и ограничивал ширину. Ну к примеру, можно для формы задать какую-то ширину, к примеру 5 или 6 колонок сетки.
Также, я замечу, вместо того чтобы к каждой строчке формы приписывать класс для ширины (col-sm-2), может быть проще задать ширину только для элемента form, а все дочерние элементы растянутся на 100% от нее. А, хотя это так в документации бутстрапа написано, тогда можно оставить как есть.
Где-то в коде у тебя написано «Exeption» вместо Exception (судя по ошибке автозагрузки), найди место поиском и поправь.
> https://github.com/V3N0m21/StudentList/blob/master/lib/Paginator.php#L43
> $search = u($search);
> $link = http_build_query($data);
Не надо делать urlencode если ты используешь build_query так как она делает это сама и у тебя данные получаются лишний раз закодированы.
> https://github.com/V3N0m21/StudentList/blob/master/lib/init.php#L5
> #if (file_exists($file)) {
Надо сделать чтобы это заработало. Автозагрузчик должен подключать файл только если тот существует.
> https://github.com/V3N0m21/StudentList/blob/master/views/list.php#L6
> "Показаны студенты соответствующие запросу '$search'" :
Это XSS. Обойди все шаблоны, все места, где что-то выводится, и либо поставь там h( ) либо аргументируй комментарием почему оно не нужно тут.
> https://github.com/V3N0m21/StudentList/blob/master/views/main.php#L8
Шаблон не должен лезть в COOKIE/GET, я советую либо выставлять нужную переменную в init.php либо сделать функцию, првоеряющую залогиненность.
Мне кажется в твоем случае удобнее сделать третье значение для переменной $page.
> https://github.com/V3N0m21/StudentList/blob/master/views/reg.php#L35
> $student->sex == 'M'
> value="M"
Здесь надо использовать константу
Для id="M" можно не использовать константу, так как этот id никуда все равно не передается.
Аналогично с местом жительства.
Также, потрать 5 минут на исправление форматирования в файле StudentList/views/reg.php. Я попробовал найти форматтер HTML, и единственный, который не ломает PHP код, оказался этот: http://ctrlq.org/beautifier/ — но после него придется руками подрправить PHP код.
Файл должен быть отформатирован примерно по такому принципу:
— для HTML можно использовать 2 или 4 пробела, у тебя код не сложный так что 4 вполне подойдет
— после блочных тегов вроде div, form, отступ увеличивается
— парные открывающий/закрывающий теги находятся друг под другом
— строчные теги вроде span, label, можно писать в одну строку с их содержимым, можно на разных
— если тег очень длинный, то мы его переносим, добавляя отступ к перенесенной части:
<div lala lala lala
....lalala="...">
</div>
— внутри PHP блоков вроде foreach, if, отступ увеличивается
<?php include_once './views/main.php'; ?>
<form ....>
....<div class="form-group <?= !empty($validation->errors['name']) ? "has-error" : '' ?>">
........<label for="Name" class="control-label col-sm-2">
............Имя:
........</label>
........<div class="col-sm-3">
............<input type="text" class="form-control" id="Name" name="Name" placeholder="Введите имя"
.................value="<?=h($student->name);?>">
.........</div>
То, что у тебя, тяжело читать, так как все идет сплошной стеной и не видно что внутрь чего вложено.
Я стараюсь не придираться к мелким косякам в оформлении, но у тебя там каждый второй файл не выровнен. Может твой редактор не позволяет удобно это делать?
Ну и к следующему проекту разберись с форматированием, редактором, чтобы больше такого бардака не было, так как такого я давно не видел.
Теперь вернемся к багу, который я обнаружил ранее, а именно чувствительность поиска к регистру. Если я ввожу «Семе» то он находит Семенов, а вот если ввести в нижнем регистре, ничего не находится. Я сначала подумал что проблемы в моих настройках, но дело не в них. Если я меняю запрос c CONCAT на
Читать дальше (спам лист): http://pastebin.com/uGkWqK8n
Все нормально, Yii не очень сложный, я думаю анон все же разберется.
>>502464
Разные вещи для разного.
Туториал в стиле «скопируйте этот код» не учит ничему, но он дает тебе понимание, как решать ту или иную проблему и по каким словам гуглить. Берешь функции или слова из него и гуглишь в докуменатции.
Документация объясняет разные особенности библиотек или фреймворков.
API docs это обычно сгенерированная документация, она описывает особенности конкретных функций.
В сложных случаях открываешь исходный код.
> Но трата времени чудовищная.
Я думаю. со временем научишься лучше отличать хорошие источники от плохих.
>>502539
Сейчас ты сделал так что HTML-файл подключает PHP. Но обычно делают наоборот: запускается PHP файл, генерирует нужные значения, а в конце подключает HTML-шаблон.
В следдующий раз сделай главным именно PHP файл.
> \t$date = explode(".", date("d.m.Y"));
> switch ($date[1]) {
Почитай мануал по date(). Ты можешь сразу получить цифру месяца без explode, так как строка "d.m.y" задает форма вывода даты, и ты мжешь сделать чтобы выводился только месяц: http://php.net/manual/ru/function.date.php
> case 1: $m ='января'; break;
> case 2: $m ='февраля'; break;
Проще сделать массив вида 1 => 'января'.
В остальном все верно.
Все нормально, Yii не очень сложный, я думаю анон все же разберется.
>>502464
Разные вещи для разного.
Туториал в стиле «скопируйте этот код» не учит ничему, но он дает тебе понимание, как решать ту или иную проблему и по каким словам гуглить. Берешь функции или слова из него и гуглишь в докуменатции.
Документация объясняет разные особенности библиотек или фреймворков.
API docs это обычно сгенерированная документация, она описывает особенности конкретных функций.
В сложных случаях открываешь исходный код.
> Но трата времени чудовищная.
Я думаю. со временем научишься лучше отличать хорошие источники от плохих.
>>502539
Сейчас ты сделал так что HTML-файл подключает PHP. Но обычно делают наоборот: запускается PHP файл, генерирует нужные значения, а в конце подключает HTML-шаблон.
В следдующий раз сделай главным именно PHP файл.
> \t$date = explode(".", date("d.m.Y"));
> switch ($date[1]) {
Почитай мануал по date(). Ты можешь сразу получить цифру месяца без explode, так как строка "d.m.y" задает форма вывода даты, и ты мжешь сделать чтобы выводился только месяц: http://php.net/manual/ru/function.date.php
> case 1: $m ='января'; break;
> case 2: $m ='февраля'; break;
Проще сделать массив вида 1 => 'января'.
В остальном все верно.
> но в итоговой величине так и не получилось отделить центы от целых долларов.
Для разделения чисел по разрядам есть такие способы:
// получить последние 3 цифры числа:
echo 1234567 % 1000; // выведет 567
// получить число миллионов
echo floor(1234678 / 1000000); // выведет 12
Комбинируя их, можно получить что угодно.
>>502595
Все хорошо, хотя если что есть еще функция array_rand, возвращающая случайный ключ из массива.
>>502586
> но не вздумай писать функцию в условии цикла, вроде
> for($i = 0; $i < count($array); $i++)
Это актуально только если там миллионы элементов. Count это очень быстрая O(1) операция.
>>502598
Разница написана в мануале: http://php.net/manual/ru/language.types.string.php
>>502668
>\techo "Результат: {$result1}";
> break;
Вот это неверно. Он сравнивает первую и последнюю буквы, так как они равны то он выводит что слово палиндром и выходит из цикла. Это неправильно. Выходить можно если буквы не совпали. но если они совпали. то надо проверить и остальные.
Также, не называй переменные русскими словами, открой гугл транслейт и найди там перевод нужного слова.
Вот пример: https://translate.google.com/m/translate#auto/en/%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%BE%D0%B2
> но в итоговой величине так и не получилось отделить центы от целых долларов.
Для разделения чисел по разрядам есть такие способы:
// получить последние 3 цифры числа:
echo 1234567 % 1000; // выведет 567
// получить число миллионов
echo floor(1234678 / 1000000); // выведет 12
Комбинируя их, можно получить что угодно.
>>502595
Все хорошо, хотя если что есть еще функция array_rand, возвращающая случайный ключ из массива.
>>502586
> но не вздумай писать функцию в условии цикла, вроде
> for($i = 0; $i < count($array); $i++)
Это актуально только если там миллионы элементов. Count это очень быстрая O(1) операция.
>>502598
Разница написана в мануале: http://php.net/manual/ru/language.types.string.php
>>502668
>\techo "Результат: {$result1}";
> break;
Вот это неверно. Он сравнивает первую и последнюю буквы, так как они равны то он выводит что слово палиндром и выходит из цикла. Это неправильно. Выходить можно если буквы не совпали. но если они совпали. то надо проверить и остальные.
Также, не называй переменные русскими словами, открой гугл транслейт и найди там перевод нужного слова.
Вот пример: https://translate.google.com/m/translate#auto/en/%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%BE%D0%B2
Вот, починил почти всё кроме регулярки на почту, так как с ней вылетает ошибка >>502813 пробовал экранировать нижнее подчеркивание - толку не дало.
https://github.com/Si0n/register3
Добавил загрузку фото к профилю, просмотр своего профиля с уменьшенной копией фото, просмотры чужих профилей (хочу узнать можно ли как нибудь сделать, чтобы вся строка таблицы была ссылкой, а не только первая ячейка как у меня?) Не все фото отображаются (тестил на jpg. jpeg и png, все загружались, но не все прорисовывались через imagejpg. И ещё хотел узнать как можно поставить проверку, чтобы если картинка не прорисовалась - не отображало пустой квадратик.
Emmet отличная вещь, я использую тоже, хотя только для простых вещей вроде ввода имени класса.
Также, в Sublime он еще умеет автодополнять CSS, например вводишь ml0 а он пишет margin-left: 0;
>>502813
В статье выражение не заключено в разделители. В PHP мы пишем выражение внутри разделителей:
/выражение/флаги
!выражение!флаги
разделители ты выбираешь сам, важно чтобы такой символ не встречался в самом выражении.
>>502834
> $rand1 = array_rand($words1, 2);
> echo $words1[$rand1[0]] . " ";
Удобнее получать один ключ и сразу брать элемент с ним:
.... $words1[array_rand($words1)] ....
>>502989
>>502986
Тут лучше сделать по-другому:
результат = палиндром;
...
если буквы не совпали, то резудльтат = не плаиндром, выходим из цикла;
...
>>503091
Поменьше критики, он же новичок, мы ему объясним и он не будет делать такие ошибки.
Emmet отличная вещь, я использую тоже, хотя только для простых вещей вроде ввода имени класса.
Также, в Sublime он еще умеет автодополнять CSS, например вводишь ml0 а он пишет margin-left: 0;
>>502813
В статье выражение не заключено в разделители. В PHP мы пишем выражение внутри разделителей:
/выражение/флаги
!выражение!флаги
разделители ты выбираешь сам, важно чтобы такой символ не встречался в самом выражении.
>>502834
> $rand1 = array_rand($words1, 2);
> echo $words1[$rand1[0]] . " ";
Удобнее получать один ключ и сразу брать элемент с ним:
.... $words1[array_rand($words1)] ....
>>502989
>>502986
Тут лучше сделать по-другому:
результат = палиндром;
...
если буквы не совпали, то резудльтат = не плаиндром, выходим из цикла;
...
>>503091
Поменьше критики, он же новичок, мы ему объясним и он не будет делать такие ошибки.
Имена переменных лучше писать по ангийски, исплоьзуй янедкс словари или гугл транслейт.
> $vsyaSumma = $vsyaSumma - $plataVMes;
это повторяется 2 раза, можно просто вынести это после if чтобы не повторялось.
break не нужен после return так как return выходит из функции.
Считает верно.
>>503170
> Почему у веб-организаций (w3.org, например) такие убогие сайты
Не сказал бы, нормальный сайт, тем более что на нем куча документов. Что не так? По моему вполне нормально, я сам на нем спецификации читал, правда найти их непросто, я искал через гугл.
>>503309
Ты не должен вызывать imagejpeg внутри HTML страницы. Генерирует HTMl страницу один скрипт, генерирует картинку совсем другой.
Иначе сам подумай как будет выглядеть HTML код?
<img src="asdadjabdyuaduanhdaydca8bda8 ... куча бинарных данных
Так что ли? Нет, не так. В src должна стоять ссылка на картинку, а не ее содержимое.
>>503405
В этой задаче надо одно выражние и надо ее проверить на большм числе номеров.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Имена переменных лучше писать по ангийски, исплоьзуй янедкс словари или гугл транслейт.
> $vsyaSumma = $vsyaSumma - $plataVMes;
это повторяется 2 раза, можно просто вынести это после if чтобы не повторялось.
break не нужен после return так как return выходит из функции.
Считает верно.
>>503170
> Почему у веб-организаций (w3.org, например) такие убогие сайты
Не сказал бы, нормальный сайт, тем более что на нем куча документов. Что не так? По моему вполне нормально, я сам на нем спецификации читал, правда найти их непросто, я искал через гугл.
>>503309
Ты не должен вызывать imagejpeg внутри HTML страницы. Генерирует HTMl страницу один скрипт, генерирует картинку совсем другой.
Иначе сам подумай как будет выглядеть HTML код?
<img src="asdadjabdyuaduanhdaydca8bda8 ... куча бинарных данных
Так что ли? Нет, не так. В src должна стоять ссылка на картинку, а не ее содержимое.
>>503405
В этой задаче надо одно выражние и надо ее проверить на большм числе номеров.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
Нет, надо одно выражение которое проверяет любые номера.
>>503428
>>503433
ВЫражение там не сложное, оно выглядит так:
в начале строки (+7 или 8), за ними 10 раз повторяется (пробелы, дефисы, скобки и одна цифра), за ними конец строки
Тренироваться можно на сайте regex101, только там надо бекслеш писать один раз.
Мы пишем \\s
Они пишут \s
(потому что мы вставляем выражение в строку в кавычках, а у них оно напрямую передается движку регулярок и экранировать бекслеш не требуется)
> сли ты хочешь, чтобы контейнер был 300 px, а вложенные в него дивы занимали 66%, то можно использовать свойство box-sizing: padding-box
Не-не, это тут не сработает, так как паддинг тут у родителя а не у цветных детей-дивов. Тут надо просто писать width: 66% либо margin 34%.
Padding у него поставлен правильно, тут как раз требуется задать внутренние поля у родителя. Другой вопрос что в задаче не очень ясно от чего брать «66%», от ширины родителя без или вместе с паддингом. Надо, конечно, 66% от внутренней ширины без учета паддинга.
>>503446
код лучше выкладывать на jsfiddle, codepen.io, jsbin или аналогчиный сайт.
Сделано верно.
>>503491
Тут другой принцип. Не надо писать где может быть какая скобка. лучше сделать так:
10 раз повторяется (любое число скобок минусов пробелов и 1 цифра)
composer.phar надо убрать из репозитория и добавить в gitignore.
> \Classes\Model\FileMapper
не, неймспейс неудачный. Ты либо кладешь все в корневой неймспейс:
\Model\FileMapper
либо используешь в качестве префикса название твоего приложения:
\Uppu2\Model\FileMapper
Classes вообще ничего не значит, и так очевидно что у тебя там классы, мы же в век ООП живем.
Соответственно папку можно назвать либо
app/Uppu2/Model/FileMapper.php
либо
app/Model/FileMapper.php
Базовый класс маппера логично назвать BaseMapper или AbstarctMapper, а не Model. Model это например File, а маппер это маппер.
Также, маппер и модель вряд ли могут наследоваться от одного класса. Это же разные вещи.
> class Connection extends ORM {
Почему соединение с Бд наслежуетя от ORM? Наследуются сущности которые улучшают или расширяют друг друга, напрмер:
Танк от Транспорта
Волшебник от Персонажа
Соединение это не улучшенная версия ORM и не может от него наследоваться.
Ты решал задачу про вектор, кстати? Там мы как раз наследование использовали.
Resize это не модель, это скорее сервис или хелпер или утилита.
> https://github.com/V3N0m21/Uppu2/blob/master/app/Classes/Model/Resize.php#L11
Что будет если передан файл с неверным расширением? Молча притворимся что ничего не произошло? Так не должно быть.
> switch($extension)
Тип файла лучше определять по содержимому функцией getimagesize
> $optionArray = $this->getDimensions($newWidth, $newHeight, strtolower($option));
Типы обрезки должны быть константами а не строками.
> if ($option == 'crop') {
> $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
Проще просто не копировать лишнее чем потом обрезать
Вместо private function getDimensions($newWidth, $newHeight, $option) возможно удобнее сделать 2 функции, вычисления ширины и высоты.
> if (imagetypes() & IMG_GIF) {
А что если условие не выполняется?
> // * No extension - No save.
Молчаливое игнорирование ошибок приводит к тому что их не замевчают. Так не должно быть. Выбрасывай исключение.
Также, у тебя в классе 2 публичных функции
saveImage($savePath, $imageQuality="100")
resizeImage($newWidth, $newHeight, $option="auto")
Я ведь могу их вызывать в произвольном порядке и все будет работать? Если нет, то надо исправить. Также, не лучше ли вообще сделать одну функцию вместо двух? Какая выгода от того что их две?
> $files = $this->factory('Files')->order_by_desc('uploaded')->limit(100)->offset(0)->find_many();
По моему ты переусложняешь код без надобности. Такие Query Builder используются когда у нас запрос зависит от условий и надо собирать его по частям (а не потому что кому-то больше нравятся стрелочки):
if ($sort) {
$qb->sort($sort);
}
Но когда запрос неизменен, язык SQL гораздо удобнее и лаконичнее.
Также, Query Builder писать не так просто, посмотри например исходники Doctrine DBAL:
https://github.com/doctrine/dbal
http://www.doctrine-project.org/projects/dbal.html
Стоит ли за это браться? Ну и если тебе нужен Query Builder, я бы рассмотрел возможность подключения готового.
> public function insertFile($data) {
> $file->name = $data->name;
В чем смысл копирования свойств из одного объекта в другой? Алсо, где тайп хинт?
Мне кажется, ты как-то переусложнаяешь data mapper.
> https://github.com/V3N0m21/Uppu2/blob/master/public/index.php#L20
Тут стена кода, надо упрощать и выносить в функции
Templates наверно стоит вынести наружу из публичной папки.
composer.phar надо убрать из репозитория и добавить в gitignore.
> \Classes\Model\FileMapper
не, неймспейс неудачный. Ты либо кладешь все в корневой неймспейс:
\Model\FileMapper
либо используешь в качестве префикса название твоего приложения:
\Uppu2\Model\FileMapper
Classes вообще ничего не значит, и так очевидно что у тебя там классы, мы же в век ООП живем.
Соответственно папку можно назвать либо
app/Uppu2/Model/FileMapper.php
либо
app/Model/FileMapper.php
Базовый класс маппера логично назвать BaseMapper или AbstarctMapper, а не Model. Model это например File, а маппер это маппер.
Также, маппер и модель вряд ли могут наследоваться от одного класса. Это же разные вещи.
> class Connection extends ORM {
Почему соединение с Бд наслежуетя от ORM? Наследуются сущности которые улучшают или расширяют друг друга, напрмер:
Танк от Транспорта
Волшебник от Персонажа
Соединение это не улучшенная версия ORM и не может от него наследоваться.
Ты решал задачу про вектор, кстати? Там мы как раз наследование использовали.
Resize это не модель, это скорее сервис или хелпер или утилита.
> https://github.com/V3N0m21/Uppu2/blob/master/app/Classes/Model/Resize.php#L11
Что будет если передан файл с неверным расширением? Молча притворимся что ничего не произошло? Так не должно быть.
> switch($extension)
Тип файла лучше определять по содержимому функцией getimagesize
> $optionArray = $this->getDimensions($newWidth, $newHeight, strtolower($option));
Типы обрезки должны быть константами а не строками.
> if ($option == 'crop') {
> $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
Проще просто не копировать лишнее чем потом обрезать
Вместо private function getDimensions($newWidth, $newHeight, $option) возможно удобнее сделать 2 функции, вычисления ширины и высоты.
> if (imagetypes() & IMG_GIF) {
А что если условие не выполняется?
> // * No extension - No save.
Молчаливое игнорирование ошибок приводит к тому что их не замевчают. Так не должно быть. Выбрасывай исключение.
Также, у тебя в классе 2 публичных функции
saveImage($savePath, $imageQuality="100")
resizeImage($newWidth, $newHeight, $option="auto")
Я ведь могу их вызывать в произвольном порядке и все будет работать? Если нет, то надо исправить. Также, не лучше ли вообще сделать одну функцию вместо двух? Какая выгода от того что их две?
> $files = $this->factory('Files')->order_by_desc('uploaded')->limit(100)->offset(0)->find_many();
По моему ты переусложняешь код без надобности. Такие Query Builder используются когда у нас запрос зависит от условий и надо собирать его по частям (а не потому что кому-то больше нравятся стрелочки):
if ($sort) {
$qb->sort($sort);
}
Но когда запрос неизменен, язык SQL гораздо удобнее и лаконичнее.
Также, Query Builder писать не так просто, посмотри например исходники Doctrine DBAL:
https://github.com/doctrine/dbal
http://www.doctrine-project.org/projects/dbal.html
Стоит ли за это браться? Ну и если тебе нужен Query Builder, я бы рассмотрел возможность подключения готового.
> public function insertFile($data) {
> $file->name = $data->name;
В чем смысл копирования свойств из одного объекта в другой? Алсо, где тайп хинт?
Мне кажется, ты как-то переусложнаяешь data mapper.
> https://github.com/V3N0m21/Uppu2/blob/master/public/index.php#L20
Тут стена кода, надо упрощать и выносить в функции
Templates наверно стоит вынести наружу из публичной папки.
> И ещё хотел узнать как можно поставить проверку, чтобы если картинка не прорисовалась - не отображало пустой квадратик.
Пустой квадратик значит что по ссылке либо нет картинки либо битые данные. Ты не должен с ним бороться, а должен не ставить ссылки на несуществующие картинки. В твоем случае, ты должен для каждого студента хранить информацию, есть ли у него картинка или нет и если нет то не пытаться ее вывести.
Это хорошо, что ты решил усложнить задачу, я проверою обязательно.
К регулярке ты забыл добавить разделители.
>мы вставляем выражение в строку в кавычках, а у них оно напрямую передается движку регулярок и экранировать бекслеш не требуется
Что? Всю жизнь писал \ один слеш, и все работало.
Я что-то пропустил? Зачем два раза экранировать?
Если ты хочешь найти бекслеш регуляркой ты должен написать
\\
но если ты напиешшь это в строке то PHP заменит 2 бекслеша на 1 и движок регулярок увидит
\
Потому ты должен написать
\\\\
\\s и \s дают одно и то же, движок регулярок получит \s так как во втором случае нет такой escape последовательности и PHP передаст символы как есть.
Но это создает путаницу, что в некоторых слуаях мы удваиваем бекслеш, в некоторых нет. Чтобы ее не было, я решил всегда его удваивать.
Сейчася вижу что в других туториалах и коде его не удваивают и подумыаю поменять на такой вариант.
Мануал про escape последовательности: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double
Например \$ PHP заменит на $ и чтобы передать эту конструкцию в регулярку, придется писать \\$
Как видишь, все не так просто. Другие языки обычно для регулярок используют тип строк, которые передает все символы дословно, не заменяя их.
Если ты хочешь найти бекслеш регуляркой ты должен написать
\\
но если ты напиешшь это в строке то PHP заменит 2 бекслеша на 1 и движок регулярок увидит
\
Потому ты должен написать
\\\\
\\s и \s дают одно и то же, движок регулярок получит \s так как во втором случае нет такой escape последовательности и PHP передаст символы как есть.
Но это создает путаницу, что в некоторых слуаях мы удваиваем бекслеш, в некоторых нет. Чтобы ее не было, я решил всегда его удваивать.
Сейчася вижу что в других туториалах и коде его не удваивают и подумыаю поменять на такой вариант.
Мануал про escape последовательности: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double
Например \$ PHP заменит на $ и чтобы передать эту конструкцию в регулярку, придется писать \\$
Как видишь, все не так просто. Другие языки обычно для регулярок используют тип строк, которые передает все символы дословно, не заменяя их.
Мне кажется платить имеет смысл за время преподавателя и консультации, а за видеозапись или учебник не стоит так как аналогичную информацию можно найти в других местах.
Сам я про эти приложеняи слышу в первый раз. там есть какой-нибудь интерактив, проверка решений или это просто книга?
Дизайн на картинке мне кажется немного перегруженным.
Надо изучить почему. Может в имени файла русские буквы или пробелы есть? Ты их корректно обрабатываешь на сервере и корректно экранируешь?
Начни с того что посмотри какая ссылка стоит в src у картинок и попробуй открыть ее отдельно.
Стоит, стоит!! У меня брат накупил всяких курсов на 30 тысяч рублей а теперь он заробатывает 3000$ в месяц!
>>503605
может у тебя просто нет 899 руб, ахахах)))
Кстати, никому не нужен складной режиссерский стул?
Складной компактный режиссерский стул
из цельной древесины бука украсит любой
интерьер. Оптимально подходит для дома,
дачи и отдыха на природе.
Перейди по ссылке domen3lvl.trojan.net и получи скидку 800% НА ВСЕ!!!
>>503556
И еще кое-что. Ты вписал код загрузки картинки прямо в reg.php, но лучше бы вынести его в функции или методы. Очевидно что надо миниумм 2 функции:
— проверка правильности загруженной картинки и выдача сообщений об ошибке
— сохранение картинки
Логично сделать класс ЗагрузчикКартинок с 2 такими методами.
Да, есть интерактив. Я бы и не покупал, просто уезжаю на два месяца, а взять с собой могу только ipad.
Обрати внимание, тут http://softwarerecs.stackexchange.com/questions/66/ipad-app-for-offline-html-css-javascript-testing советуют 2 приложения, одно бесплатное, где можно просто протестировать написанный HTML/JS код в браузере, оффлайн.
>>503654
В чем смысл благодарности? Объясните битарду.
Никогда не испытывал этого чувства (а может и испытывал, но стыжусь сентиментальности), и ничего не ощущаю, когда меня благодарят.
Иногда помогаю, когда могу. Но делаю это не для того, чтобы передо мной ползали и целовали ноги (Лавров.джипег), а скорее из расчета. Ты мне, я тебе, divide et impera.
Я считаю, что это рудиментарное стадное чувство. Людям хочется находить подобных себе, объединяться против тех, кого они боятся и ненавидят. Эти враги объявляются злыми, плохими людьми. Себя непросвещенный человек по-дефолту считает хорошим. Отсюда истоки моралфажества. Слабый омежка считает злым быдлана, который его обругал по пьяни. Быдланы считают мерзавцами и подлецами омежек, которые не уступают место шлюхам и старухам в транспорте.
Вся философия бобра и козла строится на глупости, страхе и понятиях о норме данной особи. Следовательно, не существует злых и добрых, хороших и плохих, нормальных и ненормальных людей. Это значение устанавливается текущей локалью и переменными среды.
Подамся в буддизм, наверное. Я как тупая пизда слышал, что это модно и молодежно, и там проповедуется нейтральное отношение к жизни.
---------------------------------------------------------------
Ладно, вы тут скучные, питухи))
Возвращаюсь к увлекательному чтению документации slim.
Ты ничего не ощущаешь, а другим приятно благодаритть и когда их благдарят. Алсо есть еще нормы вежливости.
>ВЫражение там не сложное, оно выглядит так:
>в начале строки (+7 или 8), за ними 10 раз повторяется (пробелы, дефисы, скобки и одна цифра), за ними конец строки
Ну и что? Я смогу написать тогда 8--0123---) и засчитает.
Бред какой-то.
Кто-то ведь решил уже эту задачу. Покажите пожалуйста.
> Я смогу написать тогда 8--0123---) и засчитает.
Там обязательно должно 10 цифр так что не можешь. смотри внимательно:
> 10 раз повторяется (пробелы, дефисы, скобки и одна цифра)
Понятно. Спасибо. Пошел заниматься другими делами.
10 раз повторяются пробелы, дефисы, скобки и одна цифра, ну что за малафья. Вчера еще голова взорвалась от километровой строчки кода, так еще и сейчас ничего не понял.
10 раз повторяется комбинация из идущих последовательно любого числа пробелов, скобок, дефисов и одной цифры
>комбинация из идущих последовательно любого числа пробелов, скобок, дефисов и одной цифры
)))(()()() () () ( ) ( ) ( ) ( ) () _ ) _ ( _( _ ( )_ (2
Я, видимо, слишком туп чтобы так на словах это понять. Только просмотр решения поможет.
http://ideone.com/aAjp1g
Антоны подскажите отчего не работает код.
Почему на 19 и 20 строчке замена работает не коректно? Почему она заменяет массив строкой?
Как правильно написать условие "Если $массив пустой, то прервать цикл". А то на 25 и 33 строках условия не срабатывают.
Мы там уже в новый тред перекатились.
Я предлагаю сделать несложное выражение, суть которого в том что номер начинается с +7 или 8 после которых идет ровно 10 цифр вперемешку с скобками/минусами/пробелами в любом количестве. Это выражение успешно отсеет все плохие номера из списка что я дал.
>>504145
Мы в новом треде уже сидим
> preg_replace($regexLatinMark, $regexLatinMarkReplace,
В функции preg_replace вторым параметром идет не регулярка, а выражение для замены, которое может содержать выражения $0 ... $9
$0 вставляет найденный регуляркой фрагмент строки
$1..$9 вставляет найденное N-мы по счету круглыми скобками в регулярке
Например:
abc — заменить найденное на строку abc
a$1b$2 — заменить найденное на строку в которой вместо $1 подставляется то что захватили первые круглые скобки, а вместо $2 — что что захватили вторые
Мануал http://php.net/manual/ru/function.preg-replace.php
И еще одна ошибка,
$matchesLatin = preg_replace($regexLatinMark, '[$1]', $matchesLatin)
Третим параметром идет строка в которой делается поиск и замена. А не массив. Почитай-ка мануал.
Это копия, сохраненная 15 июля 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.