Этого треда уже нет.
Это копия, сохраненная 15 июля 2015 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
17 Кб, 400x300
42 Кб, 165x247
Клуб изучающих PHP 52 #494598 В конец треда | Веб
Неофициальный перекат, потому что давно пора.
Помогаем друг другу как можем, ждем загулявшего ОПа.

Предыдущий тред 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) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
#2 #494599
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md

------------------

Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.

Будь доброжелателен

Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»

Объясняй

Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»

Не проповедуй

Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
#2 #494599
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md

------------------

Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.

Будь доброжелателен

Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»

Объясняй

Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»

Не проповедуй

Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
#3 #494601
Хочу изучить MVC. Знаю JS и PHP. С какого фреймворка начать изучение? Что почитать? Backbone - это сложно? Начать с Zend Framework? Спасибо.
7 Кб, 913x86
#4 #494619
Какой дополнительный заголовок отвечает за такие красивые имена? А то у меня blablabla@blabla.bla
#5 #494660
Куда котики из шапки делись?
#6 #494662
>>494660
Тред не легитимный. Сидим в старом.
#7 #494706
>>494598
Игорь Борисов в треде, я спокоен.
#8 #494859
Котаны, я потерял ссылку на статью про ООП для начинающих. Можете скинуть?
24 Кб, 664x633
147 Кб, 341x500
#9 #495134
>>494619
А все, разобрался.
>>494859
А может книгу? Единственная про ООП в PHP. Но хорошая http://rutracker.org/forum/viewtopic.php?t=4212311
#10 #495277
Есть одна SQL-таблица, код внизу поста. У неё айди авто инкрементом, а вот поле "one" - в нём по сути всего три повторяющихся значения, оставшиеся - уже всякие разные и не важны. Как сделать так, чтобы автоматически заполняясь через PHP, эти значения поля 'one' вот так вот повторялись?

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'...'),
#11 #495303
Вопросы по контакту:

1. Контакт написан на бутстрап?
2. Как происходит обмен сообщениями без перезагрузки страницы, это яваскрипт или аякс?
#12 #495305
>>495303
1. Нет, бутстрап - это всего-лишь сеточка на css и красивые кнопочки, это умеет делать любая макака с опытом более недели работы, бутстрап это для начинающих
2. аякс - это Async Javascript And XML, улавливаешь?
#13 #495317
>>495303
Аякс - это технология, использующая яваскрипт (на клиенте).
#14 #495318
>>495305

> Async Javascript And XML


Это раньше, сейчас просто AJAX без расшифровки (потому что XML используется очень редко, обычно JSON).
sage #15 #495342
>>494598
Оп, тебе платять за это говно?
#16 #495372
>>494601
Бамп. Никто не умеет в Эм Ви Си?
#17 #495512
>>494598
Как кааак блять создав динамическую ссылку page=yoba записать в нее данные! fopen??
#18 #495568
Что нужно прочитать, чтобы нормально сделать функцию bind в заданиях по js?
Аноним #19 #495607
>>495277
Я нихуя не понял что ты хочешь.
#20 #495610
Перепощу свой вопрос из официального треда
>>495609
sage #21 #495644
>>494598

Официальный тред с ответами на ответы пока тут >>487138
sage #22 #495645
>>495372

Из официального

> MVC на сервере (PHP) и клиенте (JS) реализуется немного по-разному. backbone это для яваскрипта, Zend это для PHP.



> Начать советую с фреймворка попроще, вроде Yii2. После него можешь за симфони 2 браться. А Zend 1 уже довлоьно старый, сейчас Zend 2 есть, но он по популярности уступает симфони 2.

#23 #495655
>>495277
Автоинкремент опускается, потому что подставляется автоматически. В твоем случае будет
INSERT
INTO meter (one, two, three, four)
VALUES (11, '...', '...', '...')
#24 #495668
>>495645
Спасибо! А с backbone начинать не стоит? У меня просто книжка по нему есть.
Ну мне в принципе не очень важно, насколько популярно, главное чтобы работало.
#25 #496118
>>495645
Ждем Zend 3, говорят он должен юзать возможности php7 и под него оптимизирован.

Рапортирую всем нубам. Первая работа за которую получил деньги плагин на wp, вторая интеграция и немного контент-менеджмента на том же вп. Сейчас устроился на работу буду писать исключительно back end для magento и php, то есть от меня минимальное знание front-end нужно, но нужно знать линукс, установка, настройка, поднять апач и виртуалхосты на нем, ngix, git. Framework-и какие-нибудь в обязательном порядке и не знаю. Спрашивайте если чо
#26 #496298
>>494598
Как можно в netbeans включить автодополнение для стандартных функций php? Да еще что б рядом показывалось что функция принимает и возвращает с кратким ее описанием. До этого ставил из реп арча фулл-версию, все это было. Сейчас вынужденно перекатился на убунту, так там в репах седьмая версия только, решил скачать с сайта версию для пых-пых кодеров, а там вон оно что оказалось. Помогите, котаны =)
p.s. само автодополнение работает, но оно только для конструкций языка, как я понял, а вот функции показывать не хочет, даже не выделяет их никак, словно они пользовательские.
22 Кб, 592x560
#27 #496311
Анон, нужна помощь по базе данных в access, я даже не знаю куда писать еще, гуглить пробовал тоже, но я наверно мудак какой-то необучаемый и не нашел толком ничего. На этой доске или в треде есть кто-нибудь шарящий в бд ?
#28 #496313
>>496311
Ты вопрос сразу пиши, че уж.
43 Кб, 741x372
#29 #496317
>>496313
В общем, есть связь многие-ко-многим, и при её реализации в одной из таблиц, а точнее в таблице улицы, происходит дублирование данных. Нужно без всяких хитровыебанных способов сделать так, чтобы такого не было.
#30 #496337
>>496317
Обычная связь многие-ко-многим через третью таблицу, не вижу здесь никакого дублирования.
#32 #496346
>>496317

Нечитая внимательно и быстро индийское решение:

Убери из вспомогательной таблицы КодУлицыПредприятия и сделай там первичным ключом КодУлицы и КодПредприятия.
Тогда дубляжей не должно быть.

Блядский access, кто его пользует, в институтах ябут наверное?
#33 #496348
>>496342
Хуево, значит придется переделывать - в третьей таблице (связь улицы и предприятия) менять коды улиц, затем из таблицы с улицами удалять все лишнее. Надо подумать над запросом.
#34 #496352
>>496346
А Access точно поддерживает составные ключи? В универе когда-то писал на нем курсач, помню, что SQL там сильно урезанный.
#35 #496360
>>496346
Ничего не изменилось

>>496348
Мне нужно, чтобы изначально, при вводе данных все было нормально. При последующем вводе же опять придется редактировать всё, разве нет ?
#36 #496363
>>496352

Должен
#37 #496371
>>496360

>Ничего не изменилось



Ты точно сделал составной ключ? И вообще поидее ты должен сначала создать улицу а потом соединить её с предприятием.
#38 #496374
>>496371
Черт, я даже не знаю, выделил два поля, выбрал ключ.

>И вообще поидее ты должен сначала создать улицу а потом соединить её с предприятием.


А вот здесь поподробнее
#39 #496378
>>496374

Ну какбы если ты создал улицу Горького например, у неё Код = 1 например и ты опять создал улицу Горького, в итоге у тебя их 2, первая улица с Кодом = 1, вторая с Кодом = 2.

И ты должен поидее знать Код улицы прежде чем "связать" их с предприятием.
#40 #496389
>>496378
Ну это логично, только вот как это в базе данных сделать я понятия не имею.
#41 #496403
>>496317

>а точнее в таблице улицы, происходит дублирование данных


Код должен быть первичным ключом и он должен быть уникальным.
Т.е. «unique key», но в данном случае — даже «primary key», первичный ключ. Они уникальные.

Тогда в том месте, где происходило дублирование, БД выкинет ошибку, и надо будет внести исправления в код, чтобы не дублировалось и не ломалось.
#42 #496404
>>496389 >>496403
А тогда поле с названием улицы д/быть «unique key».
Если оно дублируется.
#43 #496407
>>496389

Вручную в Улицы вводи данные, Потом в Предприятия. Потом в таблицу посредник.
Я не знаю всех фич access, но может там можно как-то в более удобном виде все сделать, чтобы всякие меню выпадали и Иисус спасибо говорил

>>496403

Тут дело в том что под уникальностью подрузамевается название улицы, а это сделать гораздо труднее

>>496404

Ул. Горького
Горького
гОрького
горького1
...
и т.д.

Сомнительный вариант, его можно обойти, думаю первичного ключа здесь хватит с лихвой
#44 #496436
>>494598
?php

error_reporting(-1);

$dollars = 200; / Число долларов /
$exchangeRate = 32.24; / Курс обмена /
$roubles = 0; / А вот эту строчку надо дописать самому /

echo "$dollars долларов можно обменять на $roubles рублей";

Анон молю помоги с решением, никак не могу понять
#45 #496524
>>496298
бамп вопросу
69 Кб, 1200x1200
#46 #496581
>>496436
Долляры помножить на рейты, нет?
#47 #496605
Только начинаю учить явускрипт и Jquery, есть скрипт который увеличивает шрифт в одном из дивов по нажатию на кнопук, выглядит он так:

$(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});

Как сделать так что бы при повторном нажатии на ту же кнопку, результаты этой анимации сбросились? То есть шрифт вернулся к начальному значению, важно что бы это делалось именно этой же кнопкой.
#48 #496609
>>496605
ТогглКласс.
#49 #496685
Вот скажите мне, грамотные люди. В чем отличие Service Locator от Dependancy Injection Container?
#50 #496727
В чем суть
`echo <<<МЕТКА
Строка1<br>
Строка2<br>
Строка3<br>
МЕТКА;`
Стоит ли использовать?
#51 #496760
Оп, не могу вдуплить задачу из твоего учебника про круг, получаются большие координаты выходящие за пределы массива. Подсказку перечитывал. Подскажи что-как. http://ideone.com/94K4I1
#52 #496807
>>496760
Это как бы не официальный тред, созданный какими-то шутниками. ОП тут не сидит.
#53 #496812
>>496727
Суть в том, что <br> тут не нужен.
#54 #496818
>>496727
В перле так хуячили.
#55 #496835
>>496685

Есть урок на тему 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)

Чтобы найти координату точки на круге достаточно радиус умножить на синус/косинус угла.
44 Кб, 678x304
10 Кб, 678x304
#56 #496912
Захотелось разнообразить оп задачки и сделать ввод данных пользователем в переменную и с ней манипулировать, вроде бы получилось, но такая вот хуйня, данные выводятся сразу после загрузки скрипта, подскажи анон может как по другому сделать ?
#58 #496936
>>496923
Спасибо, работает
#59 #496940
Для ньюфага подойдет NetBeans 8.0.2?
Потихоньку учу хтмл
#60 #496954
Рожа в оп посте Борисов из специалиста?
Материал годный, интересный. Задачи норм. Но его манера речи и постоянное специальное неверное произношение английских слов - пехапе и тому подобное дико вымораживают. Хотя тут дело вкуса, может кому и норм. Но я был бы дико счастлив есил бы курсы по php и js вел чувак из курсов 3d - спокойная речь, без выкриков, коверканий и прочей хероты. Сейчас вот прямо смотрю, но сука через немогу, поскольку лучше материала пока не видел.
#61 #496965
Аноны, а есть такой же гайд по ручной установке сервера (php и mysql в том числе) для mac, или хотя бы linux? Не хочется готовый пакет качать...
#62 #497047
>>494598
А это нормально, что я все ответы гуглю и получаю на стэк оверфлоу?
42 Кб, 500x363
#63 #497093
Гайз, нужен лаконичный гайд по изучению laravel.
На английском или русском, для нубов.
#64 #497108
>>497093
У него офдоки и так заебись. Еще на ларакастс куча видео.
#65 #497124
Ребят, а в каком формате примеры кода сюда бросать? Ссылку на гитхаб?
#67 #497158
>>497108
https://laravel.ru/docs/v4/quick
Возможно. Просто так так это мой первый флеймворк, после ASP MVC, нужны разъяснения зачем мне "миграции", маршрутизации и прочее из быстрого старта?
Я накатил одноименный плагин для пхпсторма , избавлен ли я от всех эти настроек?
153 Кб, 1600x900
#68 #497200
Опчик милый молю, шекелем отблагодарю.
Устанановил NetBeans 8.0.2 и Апачи, я дальше хуй знает , что делать, по твоим гайдам хуйня для виндоуса, у меня линукс, помоги няша.
#69 #497204
>>497200
php из моей ссылки в ньюфаг-треде не забыл поставить?
Надеюсь нет.

И читай что пишет тебе апач - /var/www/html/
Закинь туда любой из своих .php файликов, и открой через браузер, 127.0.0.1/something.php
Если пхп установлен - должен прискакать интерпретатор и проинтерпретировать код. Иначе ты увидишь только свой исходник, а не результат его работы.
#70 #497210
>>497204
Error opening file '/var/run/apache2/2': Permission denied

Пиздец какой то и как теперь закинуть свою пипиху в папку с апаче?
#71 #497211
>>497210
Щито ты делаешь, блять? Где это пишется, после каких действий?

У тебя есть файл yoba.php
Ты делаешь sudo cp yoba.php /var/www/html/
И браузером открываешь 127.0.0.1/yoba.php
187 Кб, 1600x900
62 Кб, 1600x900
#72 #497218
>>497211
У меня есть файл 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


Скрин

Да я туп анон, но не бросай.
#73 #497221
>>497158
А не лучше сразу с 5 начать? Миграции, маршрутизации итп это везде есть, не эксклюзив. Тебе надо разве что с элокуентом разобраться и в целом что где у фреймфорка лежит и куда что на писать. А остальное просто.
Про плагин не знаю ничего.
#74 #497223
>>497218
годно выглядит, тоже хочу перекатиться на linux, долго осваивать, няша?
#75 #497224
>>497218
ты не тот анон, которому нужно за 2 месяца освоить Zend?
#76 #497225
>>497218
Забудь пока про нетбинс. Ты копируешь криво. cp же пишет что 2.php - no such file. Свежеоткрытый терминал по-дефолту находится в домашнем каталоге, в /home/username/, а твой 2.php лежит где-то в другом месте, хз куда ты его сохранил через нетбинс.
Либо делай по полному пути, sudo cp /home/юзернейм/хзчто/нетбинс/2.php /var/www/html/, либо попробуй скопировать через файловый менеджер. Если спросит пароль - введи тот, что вводил для судо. Если скажет permission denied - запусти файловый менеджер от рута или через sudo.
#77 #497242
Всем борщ, братья пахабиты. Вкачусь в ваш тред, может дадите мне советов мудрых.
Собстна ситуация. Кун 25 лет, до 24 лет программировал разве что только скрипты на линух да в универе бэйсик для общего развития, имею высшее техническое, но весьма далекое от компьютеров и программирования. Собственно не поздновато ли браться за веб-программирование? Думаю осилить пока html5, css, php, js и наверно mysql. Начну пожалуй с codeacademy курсов да archive-ipq-co.narod.ru . Хороший план или не очень, что говорит ваш опыт изучения данных технологий?
#78 #497248
>>497242
Никогда не поздно.
#79 #497296
>>497242
Появился первый вопрос.
http://ideone.com/9O7hYR
Почему на шестой строчке выводится просто 15, а не ожидаемо 16.
Почему 18 и 20 строки выводят 8 и 1. Как происходит счет в них?
#80 #497298
>>497296
6 - Потому что сначала используется старое значение, а потом инкрементируется, сравни с ++$a
18 - побитовое "и" гугли
20 - наверное логическое и гугли
#81 #497299
>>496954
А мне норм. Только сейчас смотрел HTML/CSS 2014. Визибилити хид-ден. А вот посетителей он слегка задирает чет. Неуважение прям. Они там бедные по 25-30 т. платят, а он их говном поливает, лал.
#82 #497302
>>497124
https://ideone.com/
Для JS http://jsfiddle.net/ http://codepen.io/pen/

>>497218
/etc/apache2/sites-available/default[.conf]
покажи
59 Кб, 642x224
#83 #497320
Вобщем пилю тут все таки бложик а-ля твиттор.

Уже совсем запутался.
Вот вывод в блоке контента где должны выводится посты в формате название поста + пост

В бд создал таблицу с четырмя столбцами соответсвенно id, title, date, content

В таблице есть значения.
На экран выводит ошибку Warning: Invalid argument supplied for foreach()
#84 #497367
>>497320
Это значит у тебя $postcontent пустой.
12 Кб, 598x96
#85 #497374
#86 #497381
>>497302
Их тут двое.

<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
#86 #497381
>>497302
Их тут двое.

<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
#87 #497382
>>497225
Я закинул в /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
#88 #497434
>>497381
В первом (default.conf) под DocumentRoot /var/www/html допиши
<Directory /var/www/user>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>

Вторая (тут третья) строчка похуй, но позже пригодится, а вот Options... возможно поможет.
#89 #497436
Что думаете по поводу вот этого?

Pivot table with dynamic columns in MySQL
#91 #497473
>>497382
Покажи ls -l /var/www/html/
sage #92 #497512
Продублирую вопрос из утопающего.
>>497509
#93 #497534
ОП, подскажи по ООП.
Есть у меня некий класс, который работает с какой-то внешней сущностью, по 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()

Криво это как то. Есть идеи?
2 Кб, 303x155
#94 #497536
>>494598
Как стилизовать
<input type="range"> ?
Я хочу убрать линию и поменять ползунок на свое изображение?
#95 #497540
>>497536
Тебе в JS тред. Но я тебе и тут подскажу - jQuery UI.
#96 #497544
У меня вопрос такой, установил себе вампсервер и настроил его, потом скачал пхпдесигнер7 ?
Я так понял вамп это локалка, а пхпдесигнер редактор для пхп?
#97 #497558
>>497536
Через 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-фреймворка, если ему нужно поправить две строчки в стилях?
И не нужно забывать, что фрейворки сделаны для удобства опытных программистов, фреймворки не избавляют от знания нативного языка, яваскрипта в данном случае.

>Но я тебе и тут подскажу


лол
#98 #497579
>>497544
Грубо говоря да.
А зачем ты скачиваешь, не понимая, что это такое?

Вампсервер, как и другие сборки - это набор программ, включающий в себя 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" ничего не могу сказать, не пользовался. Но выглядит как говно, судя по скринам.
#98 #497579
>>497544
Грубо говоря да.
А зачем ты скачиваешь, не понимая, что это такое?

Вампсервер, как и другие сборки - это набор программ, включающий в себя 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" ничего не могу сказать, не пользовался. Но выглядит как говно, судя по скринам.
#99 #497669
>>497367
так а как правильно сделать?
#100 #497682
>>497579
веселоты пояснил нубу чо по чем
#101 #497683
>>497682

>веселоты


весело ты
самофикс
#102 #497697
>>497242
Нубь выходит на связь.
В общем есть такой код по задаче на составление стихов
http://ideone.com/DSOsSZ
Почему не срабатывают операции конкатенации и в результате я получаю три раздельных строчки?
#103 #497699
>>497697
Т.е. строчки где, первая это вырандомленые слова, вторая это пробелы, а третье это одинокое "Я".
#104 #497708
>>494598
>>497443
Задача 14. В JS как то всё с типами переменных запутанно. Конкретно стал вязнуть и усложнять код в этой задаче, пришлось заглянул немного в библиотеку lodash.

https://github.com/tokotun/JS/blob/master/lesson_14.html
https://github.com/tokotun/JS/blob/master/lesson_14.js
#105 #497709
>>497699
>>497697
Потому, что echo - это не функция. Юзай print.

pt
#106 #497717
>>497709
Принт не помог, результат был тот же. Убрал вообще функцию, вроде работает, да вот только бывает отчего то пропадают слова на рандоме. С чем это может быть связано?
#107 #497718
>>497697
>>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 либо не компетентен, либо тролит.
#108 #497721
ОП, ты что забухал сука? Без тебя анархия, каждый даун (включая меня) дает советы новичкам.
#109 #497725
>>497718
>>497717
А теперь понятно почему отдельные слова пропадали, благодарю.
339 Кб, 448x482
#110 #497726
Полгода назад активно изучал пыху и все что с ней связано, после было уныние\работа и на все забил. Но вот снова приходит понимание, что нужно стать профессионалом в этой области, чтобы хорошо устроить жизнь и заниматься интересным для себя делом. В общем, сейчас быстро пробегусь по учебнику, все порешаю\почитаю(просто чтобы вовлечься и вспомнить азы), а после думаю начать изучать Ларавель по вот этим разъяснениям https://laracasts.com/series/laravel-5-fundamentals. К слову, в мвц\пыхе и сопровождении я для нуба неплохо разбирался, так что проблем не должно быть, но вот вопрос назрел:
Ларавель все называют дико прогрессивным и клевым фреймворком, почему тогда все рекомендуют начинать с зенда2(мне дико не понравился в свое время и даже не стал в него вникать) или Yii? Может я что-то упустил? А вообще, всем добра, ОПу особенно. Хорошие треды. Полезные.
#111 #497728
>>497718
Доправил вариант с функцией, действительно надо было через return делать. Добра тебе анон!
#112 #497730
Sup.
Умею немножко php, но хочется больше. Пробовал сделать что-нибудь большое, но в одиночку дюже скучно. Где найти команду, которая делает интересный сервис/игру, чтоб присоединиться и получать опыт в процессе разработки?
#113 #497731
>>497726

>Ларавель все называют дико прогрессивным и клевым


Это можно назвать синдромом восторженного неофита, что-то противоположное синдрому утенка.
#114 #497734
>>497730
Ты "простые" задания из оп-поста сделал?
#115 #497736
>>497734
Не делал. И даже если начну делать, не доделаю, если буду делать один. По этому ищу команду.
#116 #497737
>>497736
Ну хз, сходи в соц, хикканы обычно там ищут пати.
Тред знакомств правда оккупирован озабоченными уродцами, которые мечтают присунуть шлюховатой девственнице-фотомодели.
Но раз у тебя серьезное дело, то может кто и отзовется.
51 Кб, 388x400
#117 #497746
>>497731
А по сути есть что сказать? Клишированые фразочки это, конечно, здорово, но хотелось бы конкретики от тех кто разбирается во фреймворках, смехуечков я в /b почитаю.
#118 #497752
>>497746
Какой вопрос, такой и ответ, маня.
Что можно ответить на идиотский вопрос о том, какой фреймворк лучше?
Если хочешь положиться на мнение авторитета, оп рекомендует yii и симфони, к ларавелю относится скептически. >>484008
#119 #497786
>>497737

> соц


> хикканы


Проиграл.
7 Кб, 749x577
#120 #497837
Оп вот задачка из оп поста, на сайте ideone , была кнопка run вроде и выкидывало цифру, в кубике.
В Нотепадет как с этим? Если нажимать на файрфокс то просто пустая страница.
9 Кб, 777x559
#121 #497842
Алсо, вот поменял на PHP , но при Запуске он кидает меня на пустую страницу браузера.
Есть ВАМП, надо с ним как то настроить или что?
#122 #497844
>>497837
>>497842

Чтобы php скрипт работал надо локальный сервер запустить и открыть файл через адресную строку.
#123 #497849
https://github.com/Integer64/myTestSite.dev/tree/master/vecktor_OOP
Оп жду твоих замечаний и наставлений.
#124 #497852
>>497842
Вамп нужно запустить для начала. Двойной щелчок по значку на рабочем столе. В трее возле часов должен появиться зеленый значок.

Сохранять файлы нужно в корневую директорию сервера.
У тебя наверное это что-то типа 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 либо во вложенных директориях.
24 Кб, 864x645
8 Кб, 501x181
9 Кб, 884x148
#125 #497860
>>497844
Я поместил в www и через браузер со ссылкой на этот файл.
Мне выдает вот что.

А при работе через пхпдесигнер мне выдает третий пик с
<?php

error_reporting(-1);

echo "Бросаем кубик.....\n"; echo mt_rand(0, 6);
echo "выпало $random\n";

Хотя он работает на ideone.

Так же пхпдесигнер я могу там работать со всякими переменными, но с такой хуйней вроде скрипта что ли, выдает ошибки.
#126 #497861
#127 #497862
>>497860
Ошибки внимательней читай
---------> eroor_reporting
надо то error_reporting
#128 #497863
Анончики, пишу следующую вещь:

1. Кормим скрипту ссылку на какую-нибудь страницу. (назовем её сайтом 1 уровня).
2. скрипт с помощью http://simplehtmldom.sourceforge.net/manual_faq.htm обходит страницу и собирает с неё все ссылки на другие сайты (сайты 2 уровня).

3. Получаю массив ссылок на сайты.

4. Далее обхожу эти что бы собрать с них все ссылки. (на сайты 3 уровня).

Затуп собственно в чем. Если на этапе сбора ссылок(2 уровня) в мой массив попала битая ссылка, или ссылка на уже не отвечающий сервак, то скрипт выдает ошибку при обходе массива и попытке собрать контент с сайтов 2 уровня. И всё. Никакого результата я не получаю. Если на сайте вменяемое число ссылок, то вероятность того, что скрипт грохается возрастает до небес. Мне нужно что бы при обходе массива сыылок 2 уровня, при невозможности подключиться к серверу скрипт просто пропускал текущую итерацию цикла без всяких эроров и остановок и двигался дальше, как это можно реализовать удачно и просто??
Спасибо за внимание.
11 Кб, 646x184
#129 #497865
>>497862
Один хуй такую ошибку выдает
#130 #497866
>>497863
Исключения использовать?
#131 #497867
>>497860
У тебя файл называется 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.
#132 #497868
>>497865
А где у тебя переменная рандом объявляется и что либо ей присваивается?
3 Кб, 293x81
4 Кб, 380x86
#133 #497872
>>497868
C нотепадом все сработало как убрал рандом.
Вот пик.
А вот с пхп десигнером никак не разберусь.
Цифру выдает, но иероиглифы какие то вместо букв.
#134 #497873
>>497872
Кодировку в браузере поменяй
На UTF-8
#135 #497875
>>497872
Файл нужно сохранить в кодировке utf-8.
В notepad++ кодировку можно посмотреть в правом нижнем углу. Как это сделать в пхпдесигнере, спроси в гугле.
Мы тут такой хуйней не пользуемся.
>>497873
Причем тут браузер? У него документ сохранен в ansi.
#136 #497876
>>497873

Метатег нужен или Content-Type а в браузере менять неправильно.
#137 #497877
>>497875
Телепат?
На скрине вроде UTF-8 в нотепад стоит
#138 #497879
>>497875
Блять ста нефти тебе, все сохранялось в Utf8 , а надо было в анси.
Спасибо огромное чувак.
>>497873
Спасибо обоим.
#139 #497881
>>497877
Он в качестве иде использует какой-то phpdesigner, вопрос был как сменить кодировку там.
#140 #497885
http://ideone.com/40seEy
Посоны, проверьте про гамбургеры задание. И еще скажите как реализовать функцию bind. Я не втыкаю что-то.
#141 #497889
>>497872
Сделай себе добро - поставь ПохапеШторм. Качай с офсайта, юзай ключ с русракера(у меня подошел идеально). Все что нужно в нем есть, программа годная. Базарю, еще захочешь. А то паришь себе мозги в какой-то параше.
#142 #497895
>>497889
А что в нем есть? Ну-ка, перечисли.
#143 #497907
>>497895
Все. Удобный интерфейс, встроенный терминал, среда для работы с бд, рефакторинг, куча настроек для удобного кодинга, работа с контролем версий, дебагер. Короче не выя..йся. Имхо, лучшая идешка для похапе.
#144 #497915
Оп, поправил опять список студентов, можешь проверять
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 кидался в дамп, поэтому прописал его в дампе руками.
#145 #497918
>>497242
Нубь снова на связи.
Вот есть такой код для решения задачи про кредиты из трех банков.
http://ideone.com/nH1A4T
На 25 строчке я пытаюсь записать конечный результат в массив созданный ранее, перед функцией на 3 строчке, чтобы в конце вывести предположительно наиболее выгодный банк. Но по не совсем понятным мне причинам данные в массив не заносятся.
Подскажите добро аноны где я накосячил?
#146 #497924
>>497918
Форматируй код как следует, это же читать невозможно.
Например, если у тебя есть функция, то строки внутри нее нужно сносить вправо на четыре пробела. То же самое касается циклов и условных конструкций.
http://www.php-fig.org/psr/psr-2/ru/
33 Кб, 500x500
157 Кб, 1024x683
187 Кб, 853x480
321 Кб, 1024x576
#147 #497926
И снова здравствуйте. Я принес потерявшиеся картинки.
#148 #497927
>>497924
Переформатировал отступы.
/r Годные плагины на автоформат для Notepad++
#149 #497928
>>497443\t

> Теперь передаю в конструктор 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 (а для большего количества — константы).

В общем, думаю, задача решена.
#150 #497929
>>497509

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&notWithoutSalary=&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.

....
#150 #497929
>>497509

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&notWithoutSalary=&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.

....
#151 #497930
>>497509

Теперь исправим ошибки в твоем посте:

> Изложу здесь конспект


Лучше излагать своими словами, потому что фразы вроде «Это назначение определенного логического или семантического смысла участкам данных.» читаются тяжело и непонятно, понимаешь ты их или просто скопировал. Пиши лучше от себя.

> В случае с 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 используется когда данными надо обмениваться так как мы можем придумать свой формат и описать в виде схемы.
#151 #497930
>>497509

Теперь исправим ошибки в твоем посте:

> Изложу здесь конспект


Лучше излагать своими словами, потому что фразы вроде «Это назначение определенного логического или семантического смысла участкам данных.» читаются тяжело и непонятно, понимаешь ты их или просто скопировал. Пиши лучше от себя.

> В случае с 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 используется когда данными надо обмениваться так как мы можем придумать свой формат и описать в виде схемы.
https://github.com/Si0n/register3 #152 #497931
>>497661

А где актуальный 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) {
....
}

> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/lib/StudentsMapper.php#L66


> $sql = "SELECT * FROM students ORDER BY $order LIMIT $offset, 4";


Что тут делает 4? Тестировал и забыл удалить? Тут наверно должна быть передаваемая снаружи переменная.

Также, ты подставляешь прямо в запрос переменные $order и $offset. $offset можно передать через плейсхолдеры. $order так передать нельзя, потому надо сделать проверку по белому списку разрешенных значений. Иначе нельзя гарантировать что функция безопасна и что тут нет SQL инъекции.

Не вставляй переменные прямо в запрос, используй плейсхолдеры, а когда не возможно, то используй проверку по списку разрешенных значений. Нужно чтобы эта функция работала безопасно, что бы мы в нее снаружи не передавали.

Также, смотри, в этом файле есть очень длинные строки с запросами. Перенеси их чтобы они были не длиннее 80-120 символов (в редакторах можно настроить вывод линейки справа чтобы было видно в каком месте переность).

SQL запросы удобно переносить по ключевым словам:

SELECT ...
FROM ....
WHERE ...
AND ...
LIMIT ...

> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/lib/StudentsMapper.php#L50


> 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



На странице регистрации почему-то нет вкладок сверху.

«Пол» и «Место жительства» надо сделать горизонтально, посмотри как там в примере в документации сделана галочка:

Пол: (×) Мужской ( ) Женский

> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/template/edit.php#L23


> <label for="inputPassword3"


Почитай что обозначает атрибут for у тега label и исправь это.

> aria-describedby="sizing-addon1"


Что это? Зачем?

> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/template/edit.php#L56


> <input type="radio" name="sex" value="M" checked>Мужской


Надо при редактировании выделать выбранный пункт, а не всегда один и тот же

Также, я тебе советую найти время и прорешать наши HTML/CSS задачки из Оп-поста, они полезные.

Заголовки в таблице лучше наверно сделать не кнопками, а обычными ссылками, чтобы они меньше выделялись.

При повторном клике на заголовок направление сортировки должно меняться на противоположное (по возрастанию/по убыванию). Обозначать это можно стрелочкой или треугольничком.
https://github.com/Si0n/register3 #152 #497931
>>497661

А где актуальный 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) {
....
}

> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/lib/StudentsMapper.php#L66


> $sql = "SELECT * FROM students ORDER BY $order LIMIT $offset, 4";


Что тут делает 4? Тестировал и забыл удалить? Тут наверно должна быть передаваемая снаружи переменная.

Также, ты подставляешь прямо в запрос переменные $order и $offset. $offset можно передать через плейсхолдеры. $order так передать нельзя, потому надо сделать проверку по белому списку разрешенных значений. Иначе нельзя гарантировать что функция безопасна и что тут нет SQL инъекции.

Не вставляй переменные прямо в запрос, используй плейсхолдеры, а когда не возможно, то используй проверку по списку разрешенных значений. Нужно чтобы эта функция работала безопасно, что бы мы в нее снаружи не передавали.

Также, смотри, в этом файле есть очень длинные строки с запросами. Перенеси их чтобы они были не длиннее 80-120 символов (в редакторах можно настроить вывод линейки справа чтобы было видно в каком месте переность).

SQL запросы удобно переносить по ключевым словам:

SELECT ...
FROM ....
WHERE ...
AND ...
LIMIT ...

> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/lib/StudentsMapper.php#L50


> 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



На странице регистрации почему-то нет вкладок сверху.

«Пол» и «Место жительства» надо сделать горизонтально, посмотри как там в примере в документации сделана галочка:

Пол: (×) Мужской ( ) Женский

> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/template/edit.php#L23


> <label for="inputPassword3"


Почитай что обозначает атрибут for у тега label и исправь это.

> aria-describedby="sizing-addon1"


Что это? Зачем?

> https://github.com/Si0n/register3/blob/b84f79f5c3b1c6627c49752ab098d8f45d13787a/template/edit.php#L56


> <input type="radio" name="sex" value="M" checked>Мужской


Надо при редактировании выделать выбранный пункт, а не всегда один и тот же

Также, я тебе советую найти время и прорешать наши HTML/CSS задачки из Оп-поста, они полезные.

Заголовки в таблице лучше наверно сделать не кнопками, а обычными ссылками, чтобы они меньше выделялись.

При повторном клике на заголовок направление сортировки должно меняться на противоположное (по возрастанию/по убыванию). Обозначать это можно стрелочкой или треугольничком.
#153 #497934
>>497918
Переменная, объявленная внутри функции - это локальная переменная. Ты не можешь без специальных ухищрений перезаписать из функции глобальную переменную.

Попробуй Запустить такой код, увидишь что получится:
$x = 0;
function foo(){
$x = 1;
}

foo();
echo $x;

Переменная $x внутри foo не имеет никакого отношения к глобальной переменной. Чтобы ее получить доступ к глобальной переменной, можно использовать замыкания:

$x = 0;
function foo() use ($x){
$x++;
}
Вот это сработает.

Но в этой простой задаче явно можно обойтись без замыканий и прочих усложнений. Подумай как.
>>497926
Гейство какое-то.
Но это хорошо, что ты вернулся. Без тебя полный пиздец.
#154 #497936
программач, кинь в меня годным несложным мануалом по PL/SQL , у меня база в Oracle , мне нужно всего -то создать 3 таблицы и потом понемногу их заполнять. Все мануалы которые я видел черезчур перегруженные
Там вроде какой то свой язык , да?
#155 #497940
ОП, что скажешь про Ruby? Перспективная ли вещь или просто модная ерунда, про которую скоро все забудут? Алсо, слишком ли сложная?

Просто наткнулся тут на вакансию, где стажера на Ruby ищут, требований вообще практически никаких нет, говорят мол всему научат. Заинтересовало, если честно.
#156 #497945
>>497934
Не сработает, замыкания используются только в анонимных функциях.
54 Кб, 944x1024
#157 #497949
>>497940
Ага, я как-то в рубиконтору кинул резюме. Тоже писали что нужно только азы программирования знать, а дальше всему научат. На деле оказалось, что обучение платное, включает в себя кучу штрафов за невыполнение или неправильное выполнение домашних заданий, тесты каждую неделю - штраф за провал контроля и повторная неделя, которая опять оплачивается. В общем, на всю эту фигню со штрафами строго пофиг, так как был уверен, что справлюсь, но вот монет на оплату у меня не было тогда, потому дропнул их. До сих пор на мыло спамят своими рекламками и предложениями. Алсо, чем-то вся их манера общения напоминает сектантов. Я серьезно. Такие дела.
#158 #497950
>>497918
break выбрасывает только из цикла, лучше использовать return, который и выполнение функции прервет, и вернет результат.
ты можешь написать

function BankPay(){
.....
if(условие) return $paymentTotal;
}

Тогда ты получишь желаемый массив
$BankPayList[$BankName] = BankPay($BankName, .....);
#159 #497955
>>497949

Блять, хуево. Ну я наверное все же напишу им, узнаю что как. Если пургу будут гнать, то нахуй.

Вообще мельком глянул, вроде интересный язык. В первую очередь понравилась ориентированность на веб php тоже поэтому выбрал.
#160 #497958
>>497955
Конечно, попробуй. Может это у меня в городе такая контора долбанутая просто. Про сам язык я не особо в теме, у ОПа спроси.
#161 #497959
>>497934
Спасибо за совет. Решил через return.
Такое решение подойдет?
http://ideone.com/nH1A4T
#162 #497961
>>497958

А что у тебя за город, если не секрет?
462 Кб, Webm
#163 #497966
>>497961
Секрет.
#164 #497967
>>494859

В учебнике из Оп поста последняя глава про ООП.

>>495512

Не понял вопрос, что значит «записать в ссылку данные»?

>>495568

https://learn.javascript.ru/bind
https://learn.javascript.ru/objects-more

>>495668

Можешь и его изучить, но Yii2 сложнее и интереснее.

>>496298

Тут http://stackoverflow.com/a/3619540 пишут что надо создать проект и выставить ему тип «php» и другие советы есть.
#165 #497972
>>496346

> access, кто его пользует,


Те же кто и excel, то есть нормальные люди которым нужна БД без программирования.

>>496389

Тебе надо изучить базы данных, нормализацию, access, а потом браться за дело. Ну как может код улицы не соответствовать названию?

>>496605

Удалить стиль font-size. Алсо код странный, нельзя это сделать CSS анимацией?

>>496727

Это heredoc: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.heredoc
#166 #497973
>>497959
>>497950
>>497934
Задачу вроде сделал. Адекватное решение?
http://ideone.com/nH1A4T
#167 #497978
https://github.com/Integer64/myTestSite.dev/tree/master/vecktor_OOP
Оп жду твоих замечаний и наставлений.
#168 #497984
>>496940

да, хотя для 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

> Я накатил одноименный плагин для пхпсторма , избавлен ли я от всех эти настроек?


Как установка плагина избавляет от необходимости изучать фреймворк? Программирование так не работает. Чтобы программировать, надо понимать что ты делаешь, каждую строчку, не получится вместо этого установить программу или плагин.
#168 #497984
>>496940

да, хотя для 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

> Я накатил одноименный плагин для пхпсторма , избавлен ли я от всех эти настроек?


Как установка плагина избавляет от необходимости изучать фреймворк? Программирование так не работает. Чтобы программировать, надо понимать что ты делаешь, каждую строчку, не получится вместо этого установить программу или плагин.
#169 #497993
>>497200

В Линуксе все еще проще, там Апач, 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
#170 #497995
>>497223
Джве недели на освоение линукса типа Бубунты\Минт. При чем работать можно с первого дня. Оче интуитивно понятные системы + по убунте, которую выбрал я, куча документации и решений вопросов(аскубунту всякие).
#171 #497998
>>497296

преинкремент $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 и прочти что она возвращает.
#172 #498003
>>497434

Лучше не править default.conf а добавить свой конфиг username.conf в sites-available и там добавить новый вирутал хост.

Прописать его в /etc/hosts

Включить через a2ensite username

>>497436

Не знаю что это.

>>497441

> Часть I. Усовершенствования


пользовательскоГо интерфейса

> Глава 2.новые структурные теги и атрибуты



А ты знаешь HTML4? так как книга видимо расситана на тех кто знает.

Алсо не могу удержаться:

> Для начала, поскольку нам понадобится библиотека jQuery, мы загружаем ее непосредственно перед закрывающим тегом <body>


Почему перед закрывающим? Всю жизнь скрипты подключали в head.

Алсо не надо подключать jquery с сайта гугла (почему? никакого профита, риск уронить сайт возрастает, единственный кто выигрывает это гугл и NSA следящие за пользователями), лучше закачать ее к себе.
#172 #498003
>>497434

Лучше не править default.conf а добавить свой конфиг username.conf в sites-available и там добавить новый вирутал хост.

Прописать его в /etc/hosts

Включить через a2ensite username

>>497436

Не знаю что это.

>>497441

> Часть I. Усовершенствования


пользовательскоГо интерфейса

> Глава 2.новые структурные теги и атрибуты



А ты знаешь HTML4? так как книга видимо расситана на тех кто знает.

Алсо не могу удержаться:

> Для начала, поскольку нам понадобится библиотека jQuery, мы загружаем ее непосредственно перед закрывающим тегом <body>


Почему перед закрывающим? Всю жизнь скрипты подключали в head.

Алсо не надо подключать jquery с сайта гугла (почему? никакого профита, риск уронить сайт возрастает, единственный кто выигрывает это гугл и NSA следящие за пользователями), лучше закачать ее к себе.
#173 #498006
>>497931

>Я не вижу смысла преобразовывать объект в массив когда мы можем сразу использовать в шаблоне объект-студента. Давай удалим этот массив $stud. Объекты лучше.


Я согласен, что объект лучше, но если заходит незарегистрированный посетитель - <?=htmlProtect($student->getName() ?> будет выдавать ошибку в инпуте формы ввода данных. Вот для этого и создал $stud чтобы в этом случае там были не неизвестные переменные, а пустые строки.
#174 #498007
>>498003

>Почему перед закрывающим? Всю жизнь скрипты подключали в head.



Ну там типа скрипт будет выполняться когда html разметка загрузится. Хотя если юзать $(document).ready, то в принципе похуй.

>не надо подключать jquery с сайта гугла



Вообще-то профиты есть. Во-первых, очень многие подключают ее с сайта гугла, следовательно пользователю не придется ее перекачивать на каждом сайте. Во-вторых, серверов этих куча и канал у них шире и даже если jquery у пользователя не скачан, то скачается он намного быстрее с сайта гугла, чем с твоего сайта.
#175 #498009
>>497534

> Я пишу некий базовый класс, который реализует подключение и набор "корневых" методов:


> 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++ ты код не отформатируешь и ошибки он не покажет, и совета по улучшению не даст, и отладчика в нем нет. Я думаю, не надо избегать профессиональных инструментов.
#175 #498009
>>497534

> Я пишу некий базовый класс, который реализует подключение и набор "корневых" методов:


> 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++ ты код не отформатируешь и ошибки он не покажет, и совета по улучшению не даст, и отладчика в нем нет. Я думаю, не надо избегать профессиональных инструментов.
#176 #498012
>>497697

Для выбора случайного ключа (не значения) из массива ест еще функция array_rand.

>>497708

> var type = {}.toString.call(t).slice(8, -1);


Надо переписать понятнее и надежнее. Откуда берется 8? Это неочевидно. Как эта конструкция работает?

> && value % 1 === 0


что это делает?

> && value <= MAX_SAFE_INTEGER;


что это делает?

>>497718

> либо не компетентен, либо тролит.


Он прав, в том что echo это не функция, а конструкция языка. Хотя это мало поможет анону в понимании причин ошибок.
#177 #498014
Сижу над первым ОПозаданием по жсу из http://dkab.github.io/jasmine-tests/, и не понимаю одной вещи.
Как там возможно заставить генератор выдавать значение без прямого обращения .next().value?
#178 #498019
>>497721

Я простыл (все выходные проболел) и была работа еще.

> каждый даун (включая меня) дает советы новичкам.


Это скорее хорошо чем плохо.

>>497726

> почему тогда все рекомендуют начинать с зенда2(мне дико не понравился в свое время и даже не стал в него вникать) или Yii?


ZF2 и Symfony 2 это крутые фреймсорки, лучше начать с фреймворков среднего уровня, Yii2 или тот жеLavarel. Или вообще с микрофрейморков: Silex, Slim.

> Ларавель все называют дико прогрессивным и клевым фреймворком,


У меня есть серьезные подозрения что у него просто больше пиара. Ничего особенного в нем нет, просто фреймворк примерно того же уровня что и Yii2, тоже с некоторым стремлением к велосипедам и не лучшим практикам, обилие статических методов. Так что перекатывайся после него на Симфони 2.

>>497736

Если не сделал то тебе рановато может быть браться за настоящие проекты так как ты очень многого не знаешь. Если тебе не интересно делать список студентов, напиши чт тебе интересно. Хочешь пошаговую RPG запилить может быть? Конечно там бы JS пригодился но можно пока и без него.
#179 #498022
>>498019

>лучше начать с фреймворков среднего уровня, Yii2 или тот жеLavarel


Может у тебя ссылка где-нибудь есть на годный туториал для новиса по Yii2?
#180 #498023
>>497746

Он хотел сказать что те кто пишут восторженные отзывы могут не иметь особого опыта с фреймворками и потому к их мнению стоит отнестись с долей скепсиса.

Что спорить, давайте померяем.

Вакансии:

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

При том в плане пиар активности лаварель если не обгоняет Юи, то наравен с ним. То есть по моим ощущениям говорят о нем намного больше чем на нем кодят. Учитесь сравнивать объективно.
#180 #498023
>>497746

Он хотел сказать что те кто пишут восторженные отзывы могут не иметь особого опыта с фреймворками и потому к их мнению стоит отнестись с долей скепсиса.

Что спорить, давайте померяем.

Вакансии:

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

При том в плане пиар активности лаварель если не обгоняет Юи, то наравен с ним. То есть по моим ощущениям говорят о нем намного больше чем на нем кодят. Учитесь сравнивать объективно.
#181 #498024
>>498014
Помогите посоны(((
Или хотя-бы посшлите нахуйв жс-тред
#182 #498025
Вкатился
http://ideone.com/2bxDi9
Ох, как же мучительно вспоминается все. Такая регрессия оказывается, если не пользоваться знаниями.
#183 #498026
>>497752

Оп относится скептически к якобы популярности, а так не против чтобы его изучали, почему нет.

>>497837

А почему у тебя редактор код не подсвечивает и не раскрашивает? неудобно же наверно.

ЧТобы запускать скрипты надо настроить Апач, вот набор ответов на вопросы: https://gist.github.com/codedokode/10774100

Что такое командная строка: https://gist.github.com/codedokode/10539568
#184 #498030
>>497863

Через if

>>497865

Ты используешь в echo несуществующую переменную.

>>497872

Чтобы работала кодировка надо сохранять файл в utf-8 без BOM, и добавить либо метатег meta charset либо кодировку указать в заголовке Content-Type. В твоем случае лучше всего в начале написать

header("Content-Type: text/plain; charset=utf-8");

Этот заголовок HTTP (HTTP это язык на котром общаются браузер и Апач, а заголовки это такие штуки которые содержат информаию об ответе, но на экран не выводятся) говорит браузеру что скрипт выводят обычный текст, не HTML, в кодировке utf-8.
#185 #498031
>>498024
Код нужно выкладывать на jsfiddle.

Ты дал ссылку на страницу робота, он ничего не сохраняет. Если у тебя код сохранен в кукис, это не значит, что мы его сможем увидеть.
#186 #498033
>>497885

Функция 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
#186 #498033
>>497885

Функция 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
#187 #498043
>>498031
https://jsfiddle.net/m4dfoeqz/6/ ссылка на фиддл.
Просто главния проблемма там была не в том, что код не работает, а в одной конкретной вещи.
8 Кб, 507x186
51 Кб, 800x600
#188 #498045
>>498030

>Через if



ну я вот до такой конструкции дошел: пик 1.
вроде бы цикл не ломает, выглядит конечно как кусок говна с повторяющимися действиями. Сейчас буду всё это править

>>497875

>Как это сделать в пхпдесигнере, спроси в гугле.


Вот, пожалуйста: пик2, все просто там.

>Мы тут такой хуйней не пользуемся.


Я пользуюсь :(
#189 #498046
>>497940

Неплохая, но сложнее PHP и менее востребованная рынком в России. Алсо мне больше Питон нравится, там синтаксис проще и строже (и он еще менее востребован рынком).

>>498006

Для незарегистрированного посетителя можно создать пустой объект с значениями по умолчанию.

>>498007

> Ну там типа скрипт будет выполняться когда html разметка загрузится


Какая от этого выгода? Поучается какое-то время все JS кнопки не будут нажиматься?

> Хотя если юзать $(document).ready


Я негативно в общем к этому отношусь, это подавалось как способ отделить JS от HTML и сделать яваскрипт ненавязчивым, но на практике если сайт больше нескольких страниц, то это загромождает код и делает его менее понятным.

<button onclick="doSmth()" по моему намного очевиднее чем написанный где-то в другом файле код, особенно когда у тебя на сайте десятки страниц и тысячи строк кода.

> Во-первых, очень многие подключают ее с сайта гугла,


Только не все одну и ту же версию. Алсо сейчаскаждый второй сайт ставит кеширующие заголовки и кеш постоянно вытесняется.

> Во-вторых, серверов этих куча и канал у них шире


Только находиться они могут за границей и пинг будет больше (хотя тут надо мерять). Алсо jQuery обычно маленькая доля от общего веса сайта, какой смысл ее оптимизировать (тем более что не факт что это будет быстрее)? Почему ты один файл грузишь с CDN а остальные нет? Ты реально занимаешься оптимизацией или просто бездумно копируешь то что увидедл в туториале (автор которого так же бездумно что-то копирует)?

Алсо используя сторонний CDN ты увеличиваешь риск уронить сайт. Зависший CDN превратит твой сайт на полминуты в белую страницу. Не забывай также что роскомнадзор не дремлет и может в любой момент заблокировать буржуйский тлетворный контент.

> то скачается он намного быстрее с сайта гугла, чем с твоего сайта.


это зависит от пинга, не только от ширины канала. Не у всех CDN есть точки в России (у Гугла правда скорее всего есть).

Что я хочу сказать, что стоит хотя бы проверить есть ли реально выгода, потому что она не очень очевидна, а вот уменьшения надежности сайта очевидно зависит от числа исопльзуемых серверов.
#189 #498046
>>497940

Неплохая, но сложнее PHP и менее востребованная рынком в России. Алсо мне больше Питон нравится, там синтаксис проще и строже (и он еще менее востребован рынком).

>>498006

Для незарегистрированного посетителя можно создать пустой объект с значениями по умолчанию.

>>498007

> Ну там типа скрипт будет выполняться когда html разметка загрузится


Какая от этого выгода? Поучается какое-то время все JS кнопки не будут нажиматься?

> Хотя если юзать $(document).ready


Я негативно в общем к этому отношусь, это подавалось как способ отделить JS от HTML и сделать яваскрипт ненавязчивым, но на практике если сайт больше нескольких страниц, то это загромождает код и делает его менее понятным.

<button onclick="doSmth()" по моему намного очевиднее чем написанный где-то в другом файле код, особенно когда у тебя на сайте десятки страниц и тысячи строк кода.

> Во-первых, очень многие подключают ее с сайта гугла,


Только не все одну и ту же версию. Алсо сейчаскаждый второй сайт ставит кеширующие заголовки и кеш постоянно вытесняется.

> Во-вторых, серверов этих куча и канал у них шире


Только находиться они могут за границей и пинг будет больше (хотя тут надо мерять). Алсо jQuery обычно маленькая доля от общего веса сайта, какой смысл ее оптимизировать (тем более что не факт что это будет быстрее)? Почему ты один файл грузишь с CDN а остальные нет? Ты реально занимаешься оптимизацией или просто бездумно копируешь то что увидедл в туториале (автор которого так же бездумно что-то копирует)?

Алсо используя сторонний CDN ты увеличиваешь риск уронить сайт. Зависший CDN превратит твой сайт на полминуты в белую страницу. Не забывай также что роскомнадзор не дремлет и может в любой момент заблокировать буржуйский тлетворный контент.

> то скачается он намного быстрее с сайта гугла, чем с твоего сайта.


это зависит от пинга, не только от ширины канала. Не у всех CDN есть точки в России (у Гугла правда скорее всего есть).

Что я хочу сказать, что стоит хотя бы проверить есть ли реально выгода, потому что она не очень очевидна, а вот уменьшения надежности сайта очевидно зависит от числа исопльзуемых серверов.
#190 #498048
>>498046

Да я сам на своем сайте держу jquery, просто говорить, что совсем уж плюсов никаких нет - как минимум некорректно. Да и сомневаюсь, что кто-то всерьез будет замерами скорости загрузки заниматься ради нескольких килобайт.
#191 #498050
>>498045
И вообще ребят, подскажите как можно легко и элегантно решить задачу сбора со странички всех ссылок и емейлов? Я попробовал с помощью http://simplehtmldom.sourceforge.net/ и не очень взлетело, ведь она преобразует html в большущий и тяжеловесный массив, что его даже невозможно сдампить без зависания браузера. А когда на сайте 100 ссылок на другие, то там вообще сервак отваливается, когда ты пытаешься собрать html с каждого из них. Склоняюсь теперь к простому парсу регулярками, чистого html. Но я полагаю что должны быть такие задачи уже кем-то решены, и не обязательно писать свой кривой велосипед, может подскажете?
>>497863 - кун.
#192 #498052
что с капчей? Не выдерживает нашу скорость постинга?

>>498045

твой код пока очень хрупкий:

1) сетевые операции могут падать и зависать, у тебя не предусмотрено решения
2) не надо писать все простыней, надо разбирать на функции
3) для разбора ссылок не надо колхозить велосипед а надо использовать parse_url или стороннюю библиотеку
4) если ты не будешь себя хорошо вести, админ тебя забанит после N запросов. Никто не любит халявщиков которые только накручивают трафик, и не дают никакой пользы
5) слишком много скобок в одной строке

>>498043

Там не нужно использовать ES6 генераторы, там хватит обычных замыканий. Но можешь попробовать с генераторами решить конечно, правда это не во всех браузерах работать будет.

>>498048

> Да и сомневаюсь, что кто-то всерьез будет замерами скорости загрузки заниматься ради нескольких килобайт.


Тогда зачем ради этих килобайт усложнять свой сайт и выносить один из скриптов наружу? Единственный профит тут у гугла который может следить за посещениями сайтов (а по просьбе товарища майора еще и подсовывать на этот сайт нужный код).
32 Кб, 605x400
#193 #498053
ставь лойс есле тебя тожи это бесит(((((((
#194 #498054
>>498050

но зачем тебе столько емейлов?
#195 #498055
Решил начать учить язык и начал учить вот по этому сайту.
http://archive-ipq-co.narod.ru/l1/loops.html
Не могу решить там исправить задачу про кредит на айфон. Может кто-нибудь помочь?
#196 #498057
>>498054
я работаю за еду помощником в микроконторе. Я писал тут зимой свои стори, и пару месяцев назад, как на работу устроился. Собственно это мой рабочий таск над которым я уже два дня ковыряюсь.
39 Кб, 600x400
#197 #498058
Вот-с, решил задачку про гейфоны http://ideone.com/rJU3KH
На код в учебнике не смотрел вообще специально, чтобы написать с нуля самому, глянул уже после и понял, что у меня корявенько написано, конечно. В общем, зацените. Алсо, в идеоне хтмл не поддерживается потому лютая рвота вместо красивого вывода, но ежели кто в свою идешку кинет код, там все нормально будет. Рейт, в общем. Заранее спасибо.
#198 #498059
>>498055

запости ссылку на код и на каком месте застрял
#199 #498060
>>498055
Ну так ты код вбрасывай, я тебе ошибку укажу. Или ты хочешь что бы я тебе решение дал?
#200 #498061
>>498055
Так ты, наверное, задай конкретный вопрос, в чем заковыка-то, а то пространное "НИ МАГУ РИШИТЬ" ни к чему не приведет.
#201 #498062
>>498052

Ок, спасибо, попробую обойтись без ES6.
#202 #498063
Вот
https://ideone.com/OeQNx8

Не знаю как сделать так чтобы в банк только (5000 - остаток) отдать
#203 #498067
тест
#204 #498068
>>498063
Ты ведь просто скопировал код из учебника. Ппц.
>>498058
Cамопочин кода, немного ошибся.
Это яндекс-капча такая модная или абизян шатает?
50 Кб, 604x453
#205 #498070
>>498067
passed
#206 #498071
>>498068
я добавил

if ($creditBalance < 0) {
\t\t$monthlyPayment = 5000 - $creditBalance;
\t\t}

Разве это не должно было исправить задачу?
#207 #498072
>>498071

>Разве это не должно было исправить задачу?


Каким образом? У тебя уже баланс в минус ушел, а ты исправляешь ежемесячную выплату, вместо долга, да еще и непонятной формулой.
#208 #498075
>>498063

Не надо заводить баланс в минус.

Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;

Попробуй переписать код внутри цикла примерно так:

- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
#209 #498080
Помогите найти значки для сортировки столбиков в таблице ASC-DESC .
#210 #498081
>>498080
&uarr;
&darr;
#211 #498083
>>498081
спасибо
#212 #498086
#214 #498175
Аноны, выручайте. Мучаю регулярки. Пытаюсь сделать задание с телефоном без использования замены "проблемных" знаков.
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} части. Подскажите как можно было бы проверить наличие семи цифр которые могут быть перемешанны с пробелами и тире? Может даже приведите пример рабочей регулярки для решения этой задачи, но не обьясняя как она работает, чтобы я сам прочитал как она работает. А то хотя казалось бы на странице про регулярки полно примеров, да и в интернете полно материала, но они все равно ставят меня в какой то ступор.
#215 #498186
>>498071
Дело в том что твое условие срабатывает после того как гипотетический анон переплатил.

Вот моё решение для примера
http://ideone.com/uEGql9
Как видишь в цикле for, есть еще два условных цикла if.
Первый как тебя и интересует. Он работает по двум сценариям. Основному, при котором сумма долга($creditBalance) больше суммы выплаты($monthlyPayment). И альтернативному, который срабатывает при обратном условии. В нем то я выплату приравниваю оставшемуся кредиту и в последствии отнимаю эту выплату из оставшегося кредита, таким образом приравнивая его 0, без переплаты.
#216 #498189
>>498186
Я сам нуб, но думаю что ОПу и местным олдфагам тут особенно не в чем меня поправлять.
#217 #498255
Да нихуя у вас у всех не правильно. Во всехрешениях нет правильного ответа. Вот в первоначальном сценарии получается так что он на 13й месяц избавляется от долга. А у вас так у всех уже на 12й. Там в 12м получается 4 с лишним долг, но это в начале месяца. А вы из этого и вычитаете 5000. Но поидее эти 5к у него появятся только в конце месяца, когда уже эти 4к в 5 с лишним превратятся.
#218 #498269
>>498255
Ясно, исправил.
#219 #498270
>>498255
>>498269
Может мне закинуть все выполненные задания для проверки? Не хотелось бы спамить в тред, но вдруг я упускаю самый цимес в заданиях.

И можно все таки пару слов по заданию на нахождение телефона в регулярках, а то Gramar Nazi задание запросто пошло, а телефоны что то в самом начале не идут.
#221 #498272
Как настроить ебаный mod_rewrite?
Мне нужно, чтобы перебрасывало с 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} не подходит.
#222 #498292
ОП, как нормально счетчик скачиваний на файлообеннике сделать? GET запросом передавать в функцию имя файла, проверять его существование в базе и увеличивать счетчик? А как потом собственно сам файл на скачку дать? Или есть какие-то способы попроще?
#223 #498315
Оп есть значение mt_rand ( мин , макс ) ; на выходе мы получаем рандомную цифру , как это цифру привязать к переменной например $a?
#224 #498316
>>498315

$a = mt_rand(min, max), не?
#225 #498317
>>498316
А если под $a есть уже другая переменная? как ее связать с другой переменной , подзабыл.
echo $a = mt_rand ( 1 , 99 ) ;
И вот хочу, что бы вместо $a = "человек"
Так не получается , просто цифру выкидывает.
Подскажи
#226 #498318
>>498317

Что ты хочешь то не могу понять? Вывести случайное количество человек? Ну тогда используй конкатенирование с помощью точки.

$a = mt_rand (1, 99);

echo $a . 'человек';
2 Кб, 238x81
#227 #498322
>>498318

<?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 "Победа Человека";
Дальше если Человек выбросил больше, то должно же отобразиться.

А у меня просто так
2 Кб, 238x81
#227 #498322
>>498318

<?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 "Победа Человека";
Дальше если Человек выбросил больше, то должно же отобразиться.

А у меня просто так
#228 #498324
>>498322

Чет я вообще понять не могу, что за код ты написал. Ты понял, как операция присваивания работает? Ты сначала переменным $a и $b присваиваешь строки "Человек" и "Робот", а затем следом им же переприсваиваешь сгенерированные случайные числа.

Ну и условная конструкция if у тебя неправильно записана. Ты должен выяснять кто выиграл сравнивая броски человека и компьютера, а ты написал примерно следующее: "если $a меньше $b и $a больше $b, то если $a меньше $b". Сам понимаешь, что это бессмыслица полнейшая. Почитай внимательнее про то, как условные конструкции работают.
#229 #498326
>>498324
Я просто хотел, что бы робот и человек кинули по кубику и в конце отобразилось, "Выиграл Робот/Человек"
И всё.
#230 #498327
>>498326

Ну так и делай это. Задание несложное. Делаешь броски кубиков, сравниваешь их и в зависимости от результата выясняешь победителя и выводишь его.
#231 #498328
>>498327
Няша дописать сможешь?

<?php

$a = mt_rand (1, 99);
$b = mt_rand ( 1 , 99);
echo $a . 'Человек выбросил <br>';
echo $b . 'Робот выбросил';


Что бы на примере понял.
#232 #498331
Всё , сам дописал.

<?php

$a = mt_rand (1, 99);
$b = mt_rand ( 1 , 99);
echo $a . 'Человек выбросил <br>';
echo $b . 'Робот выбросил';

if ($a < $b)
{
echo "Человек побеждает";
} elseif ($b < $a)
echo "Побеждает робот";
?>

#233 #498332
>>498328
<?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 'Ничья';
}
#234 #498333
>>498328
>>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 'Ничья!';
}

Почти верно, но не совсем. Не забывай фигурные скобочки ставить. И ты не учел варианта, когда два одинаковых числа выпадут и компьютеру и человеку.
#235 #498338
>>498052

>1) сетевые операции могут падать и зависать, у тебя не предусмотрено решения


я и пришел сюда за этим, я привык писать код который не предусматривает того что функция выдаст ошибку. Я не знаю какие приемы тут используются.

>2) не надо писать все простыней, надо разбирать на функции


Сначала пишу простыню, обычно, потом заворачиваю в функцию.

>3) для разбора ссылок не надо колхозить велосипед а надо использовать parse_url или стороннюю библиотеку


Разобрать ссылки для меня не проблема, проблема собрать их со странички, вот.
#236 #498356
https://github.com/Si0n/register3
Вроде всё поправил.
_____
Как двигать кнопки или элементы в бутстрапе?
#237 #498384
День в хату!
Час назад начал учить пхп, решил задачу с кубиками http://ideone.com/vTDNGt.

Вопрос - зачем используется exit()?
#238 #498385
>>498046
а какую нормальную книгу без детской риторики по html5 посоветовал бы?
#239 #498388
>>498272
О, вот нашел набор заклинаний на этот случай.
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
#240 #498389
>>498388
А мне эта статься http://habrahabr.ru/company/sprinthost/blog/129560/ очень помогла, по сути только с помощью неё я смог нормально настроить .htaccess под свои нужды. Я сел, прочитал её от начала и до конца, и в голове всё стало яснее насчет мод рерайта. Чем она тебя не устроила?
#241 #498391
>>498292

>как потом собственно сам файл на скачку дать


Ссылку на файл сделать, очевидно же. Только если это картинка, она по ссылке будет открываться в полном размере, так что там нужно еще добавить какие-то заголовки, типа Content-Disposition: attachment
Оп мне дал ссылку на эту бестолоковую статью
http://habrahabr.ru/post/151795/
Нихера не понятно, я щетаю. Почитай, может разберешься.
#242 #498395
>>498389

>Я предполагаю, что читатель уже знаком с тем, что такое mod_rewrite, и не буду описывать его основы, которые легко найти в интернете.


Дальше не читал. Обоссал автора.
24 Кб, 604x419
#243 #498400
>>498255
Вот тебе правильное решение и не скопированное у ОПа, полностью с нуля, даже без взглядов на ОП-стайл решение. Получилось может и костыльно, но неплохо ящитаю.
ОП рейт май код плз!
#245 #498417
>>498384
exit; или exit(); прекращает работу твоего скрипта.

В твоем примере ты мог бы в принципе в конце каждого блока написать или не писать их вообще, ничего бы не изменилось.

Другое дело если у тебя большой скрипт, и ты хочешь где-нибудь в серединке посмотреть значение переменной без выполнения всего скрипта, ты можешь сделать так:

var_dump($userInfo);
exit;
#246 #498479
>>498272

Правила 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 для скачивания и путь к файлу например начинались с разных папок чтобы их легко было отличить. Или различались чем-то еще.
#246 #498479
>>498272

Правила 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 для скачивания и путь к файлу например начинались с разных папок чтобы их легко было отличить. Или различались чем-то еще.
#247 #498483
>>498479
https://github.com/Integer64/myTestSite.dev/tree/master/vecktor_OOP
Оп можно считать задачу решенной и идти дальше?
#248 #498491
>>498292

А откуда ты будешь посылать 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.

Ну твоему файлообменнику это пока не грозит, так что статья просто для ознакомления, делать ничего такого не надо.
#248 #498491
>>498292

А откуда ты будешь посылать 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.

Ну твоему файлообменнику это пока не грозит, так что статья просто для ознакомления, делать ничего такого не надо.
#249 #498497
>>498338

> я и пришел сюда за этим, я привык писать код который не предусматривает того что функция выдаст ошибку.


У тебя функции, которые скачивают файл, они в сторонней библиотеке. Надо почитать документацию, код и выяснить что они делают при ошибке и можем ли мы это контролировать. Если да то хорошо, если нет, то надо скачивать страницу самостоятельно любым другим HTTP-клиентом который позволяет контролировать ситуацию. Например Guzzle или расширением curl или как-то еще. Опять же для этого придется читать их код и документацию.
#250 #498503
>>498356

> Как двигать кнопки или элементы в бутстрапе?


В обшем случае для этого придется изучить HTML/CSS (у нас есть задания и ссылки в ОП посте). А что именно тебе надо сделать? Может есть более простое решение?

>>498388

> О, вот нашел набор заклинаний на этот случай.


Костыли

> Но я на самом деле не понял, как это работает.


Апач применяет правила пока URL не перестанет меняться. Значит ты должен сделать так, чтобы исходный и измененный URL было легко различить.

> написаны мудаками, которые не снисходят до объяснения базовых вещей.


Что именно не объяснено?

> Спецификация апача для махохистов


Я ее читал когда-то давно, когда сам разбирался.

>>498483

Конечно, ты можешь не ждать пока я проверю и идти дальше, а потом если что, вернешься. Там у тебя как я помню, почти все готово, я постараюсь сегодня глянуть.
#251 #498506
>>498270

Закинь, конечно, желательно одним постом.
#252 #498512
>>498332

Где это ты взял кубик на котором может выпасть 99? Алсо нет проверки на даблы (если у обоих даблы то ничья).
#253 #498552
>>498479
Мои претензии к учебным материалам по веб-разработке заключаются в следующем:
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?

Потом в планах перенос процесса загрузки на хрупкие плечи аякса и создание превью для изображений, что является у тебя отдельным уроком.
#253 #498552
>>498479
Мои претензии к учебным материалам по веб-разработке заключаются в следующем:
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?

Потом в планах перенос процесса загрузки на хрупкие плечи аякса и создание превью для изображений, что является у тебя отдельным уроком.
#254 #498566
>>497929
Схоронил ответ и задания на xml.
Я сейчас как раз смотрю курс специалиста.
Как закончу с файлообменником, выполню задания на xml.
28 Кб, 771x583
#255 #498572
>>498503
Я делал почти все начальные задания в html/css, просто насколько я понял мне нельзя самолично менять начинку bootstrap, а полазив по сайту http://getbootstrap.com/css/ я не нашел инфы как задавать положение div'ов методами бутстрапа.
Хочу на пикрелейтед передвинуть кнопки в центр средствами фреймворка, чтобы не вручную прописывать css свойство в html файле.
#256 #498575
>>498572
<div class="col-md-offset-2"> например, вот здесь все описано
http://getbootstrap.com/css/#grid
Не-ОП
#257 #498576
>>498572
>>498503
>>498356
Что можно ещё добавить сюда, чтобы сайт был более массивным что ли для портфолио, в будущем мб всё таки получится найти вакансию за еду
#258 #498579
>>498491

>А откуда ты будешь посылать GET запрос?



Ну так ссылка на скачивание будет выглядеть аля /download?id=12 и вести на функцию, которая в качестве параметра будет принимать id файла и увеличивать в базе счетчик на 1. Походу все же это самый реальный способ на данный момент. За ссылку на статью спасибо, как дойду до реализации счетчика обязательно ее почитаю.

Еще такой вопрос возникает, как сделать так, чтобы файл выдавался не под тем названием, под которым он лежит на диске? Временно копировать его, переименовывать копию в оригинальное имя и после завершения скрипта удалять? Или есть более элегантный вариант?
#259 #498583
>>498572

Можешь кнопки поместить в блок и добавить ему класс center-block. Или прописать offset/push как посоветовал >>498575.

Алсо, сам файл стилей бутстрапа действительно трогать не нужно, но это не значит, что нельзя создать свой файл стилей и переназначать те свойства, которые тебя не устраивают. Бутстрап конечно избавляет тебя от надобности писать кучу стилей, но это не значит, что их совсем не надо писать.
#260 #498597
Эх.
Как вызвать окно сохранения файла?
Я обязательно прочту тысячетомник по 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 'Запрашиваемый файл не найден.';
}

});

Я хочу чтобы при клике на ссылку открывалось окно сохранения, а картинка открывается в браузере.
#261 #498601
>>498576
А ты паттерн MVC не юзал что ли?
#262 #498602
>>498601
Неа
#263 #498603
>>498597
может быть нужно ещё
Content-Type: image/png
можно также через ф-ию header отправить заголовок
#264 #498604
>>498602
А почему? Он вроде как основополагающий
#265 #498613
>>498604
Ну если ты имеешь в виду разделение логики выведения, обработки и хранения то у меня вроде как это есть.
#266 #498617
>>498613
А ты про MVC читал? Если нет, почитай прикольная штука.
#267 #498622
>>498597
А, это же блядский htaccess.
Я когда слим ставил, там нужно было добавить htaccess, содержающий строку
RewriteCond %{REQUEST_FILENAME} !-f
!-f означает, что следующее в RewriteRule правило не будет работать с файлами. А мне нужно, чтобы работало.

Ну что же, не могу не похвалить себя за упердие.
#268 #498667
>>498617
А где про него почитать?
#269 #498668
>>498572

В бутстрапе есть классы для организации сетки. Сетка состоит из 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 (не хочу их рекламировать так как это коммереская компания, они пытаются что-то там продать, но курсы у них хорошие).
#270 #498669
>>498572

Место жительства и пол надо сделать не таблицей (не используй таблицы для оформления, что за дикость? для этого есть CSS. Таблицы используются только для вывода таблиц с данными).

Посмотри как в документации бустрапа сделана галочка в форме и сделай радиокнопки так же (только у них там одна галочка, а у тебя 2 идущие рядом радиокнопки).
#271 #498670
>>498576

Тебе надо начинать изучать параллельно HTML/CSS, а то без них будет очень тяжело.
#272 #498674
>>498667
Ты же умный мальчик. Давно бы в гугл вбил . Паттерн MVC. Я про него вообще в книже по андроид прочитал.
#273 #498675
>>498597

> 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 запускался только в начале скачивания, а файл отдавал сервер.
#274 #498678
>>498667

В моему уроке про список студентов описано: https://github.com/codedokode/pasta/blob/master/student-list.md#mvc

>>498674

Умный мальчик, что ты забыл в нашем треде для начинающих?

>>498597

> хотелось бы уже побыстрее закончить простое задание.


Хотелось бы чтобы ты изучил тему и знал как организовать скачивание файлов с нужным именем. Какой иначе смысл делать это задание?
#275 #498682
>>498678
Блин, пользоваться гуглом так сложно. Разве поиск информации не является частью работы программиста???
234 Кб, 1366x739
#276 #498686
>>498675

>X-SendFile


Не хочу тащить левый модуль. Я еще с мод-реврайт не разобрался.

Да, с css я обосрался, уже заметил. Так что мне нужно сформировать следующее правило для слима: любой запрос, кроме папки css, перенаправлять на index.php.
Если ты помнишь с чего вся эта петрушка началась, то мы с тобой решили, что для защиты от хакера лучше всего дописывать файлу расширение .txt
Мне нужно, чтобы realname.gif.txt отдавался по маршруту
$app->get('/download/:file', ...);
Например /download/realname.gif меняется на upload/35788_realname.gif.txt

Оно у меня уже почти работает.
Погоди, вот посмотрю курс от о'рили, и доделаю.
Бампаю ебанутыми скринами их уроков.

>>498682

>Разве поиск информации не является частью работы программиста


Программист насколько я знаю должен писать программы. Поиском информации занимается сео- и контент-манагер.
#277 #498687
>>498682

Гугл не подскажет что надо искать именно MVC для веба, так как изначально паттерн делался для GUI приложений и в вебе он используется немного по другому. Тех, кто ищет такую информацию гуглом и потом например пытается продемонстрировать знание на союеседовании, очень легко подловить, попросив например объяснить что значит стрелка от M к V (из первой статьи в результатх гугла: https://ru.wikipedia.org/wiki/Model-View-Controller )

В вебе стрелка идет от контроллера к вью.

Потому гугл не (всегда) может заменить преподавателя.

Странно что такой умный мальчик как ты этого не понимает.
#278 #498688
>>498687
Ты предлагаешь каждый раз к тебе обращаться?? Т.е. самостоятельно не надо пытаться понять как решить тот или иной вопрос???
И про MVC можно общие черты понять.
#279 #498689
>>498686

> любой запрос, кроме папки css, перенаправлять на index.php.


А картинки, robots.txt, simemap.xml, картинки, шрифты, скрипты, favicon.icon, файлы подтверждения для гугла/яндекса — это минимум того что обычно добавляется на сайты в ходе работы над ними.

> Если ты помнишь с чего вся эта петрушка началась, то мы с тобой решили, что для защиты от хакера лучше всего дописывать файлу расширение .txt


хорошая идея

> Мне нужно, чтобы realname.gif.txt отдавался по маршруту


ты можешь сначала сделать через слим, но с расчетом на то, чтобы переделать дальше нормально. Мне не нравится идея отдавать файле через PHP на файлообменнике где скачивание это основная деятльность. Тем более что у тебя аж 2 варианта на выбор, X-Sendfile или (что имхо даже луше) mod_rewrite.

Там у тебя выше были вопросы про заголовки и еще что-то, я до них тоже дойду и отвечу.
#280 #498690
>>498688

Лучше всего найти самостоятельно, обратить внимание на странную стрелку и спросить в треде.
#281 #498692
>>498688

Что я хотел сказать, что некоторые вещи легко гуглятся, а некоторые нет. И еще я хотел сказать что не надо в нашем треде самоутверждаться и отправлять в гугл, не написав ключевых слов и лично не посмотрев что по ним ищется.
#282 #498698
>>498692
Никто не пытался самоутвердится. И чем самоутверждаться ??? Что за негатив такой???
Как будто я его тупым ушлепком назвал??
#283 #498706
ОП, вот допустим я буду хранить файлы приписывая им в расширение .txt ( спасибо за идею кстати). Допустим я даже на скачку буду давать файл убирая это расширение. А что делать с превьюшками картинок/видео/аудио? Я же не смогу просто встроить картинку или видео с расширением txt. Вроде слышал, что можно принудительно заставить браузер открывать файл как какой-то определенный формат передавая заголовки, но чет пока не нагуглил никакой полезной инфы на эту тему.
#284 #498709
А в чем разница межу кавычками? "" и ''
Каптча 777
#285 #498712
>>498698

Потому что ты не пытаешься помочь. Посты тут конечно не подписаны, но выглядит что это ты написал:

> А ты паттерн MVC не юзал что ли?



Там же есть выше ссылка на гитхаб. Почему бы сначала тебе не глянуть код и не посмотреть, есть там MVC или нет?

Далее, вместо того чтобы дать хорошую сылку или хотя бы слова для поиска которые ведут к хорошей ссылке, ты начал писать не несущие ценности посты.

> Ты же умный мальчик. Давно бы в гугл вбил .



Мы все умеем пользоваться гуглом, но с ключевыми словами или готовой хорошей ссылкой это гораздо удобнее. Сначала сам проверь что ищется по этим словам, а потом советуй иначе совет «погугли» не несет никакой ценности.
#286 #498720
>>498709

Отвечает Друзь мануал: 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

Но я не уверен что тебе это потребуется. Давай пока без этого попробуем сделать.
#286 #498720
>>498709

Отвечает Друзь мануал: 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

Но я не уверен что тебе это потребуется. Давай пока без этого попробуем сделать.
#287 #498730
>>498720

Лол, я сейчас проверил, все прекрасно открывается с любым расширением. И <img> работает и <video> и судя по всему <audio> тоже. Так что проблем вроде бы с этим нет и с заголовками заморачиваться не придется. Это радует!
#288 #498733
>>498720

Ах да, тут еще такой вопрос. А если я захочу выводить EXIF и прочую инфу по некоторым файлам, то функциям похуй на расширение файла или нет?
#289 #498744
Анонасы, поясните за яваскрипт для пхп пограмиста, я вот тут учу его примерно дней 20-25, до этого активно учил ПХП месяцев 5, сейчас мои знания яваскрипт можно описать как:

-более менее знание синтаксиса
-замыкание
-некоторые особенности работы языка
-понял смысл ДОМ но пока без гугла в нём никак
-разобрался с событиями, но часто тоже надо гуглить ту или иную проблему
-Разобрал jQuery, написал на нём выпадающее меню и слайдер, более менее запомнил синтаксис этого фреймворка.

Хватит ли мне этих знаний для получения должности ПХП джуниора, по умолчанию предпологаем что мои скилы в ПХП должного уровня для этой должности.
#290 #498746
Дайте ссылку на задачки по яваскрипт от ОПа и ещё на какие-нибудь если есть.
#291 #498749
>>498744

Зависит от города конечно, но думаю хватит. Ничего плохого в том, чтобы лезть в гугл восполнить пробел в знаниях нет. Главное это принцип работы и возможности языка понимать, а остальное со временем и опытом работы придет.
#292 #498762
>>498746
от опа
>>494598
еще какие-нибудь
http://learn.javascript.ru/
#293 #498775
>>498678

>В моему уроке про список студентов описано: https://github.com/codedokode/pasta/blob/master/student-list.md#mvc


Странно, к чему он >>498601 тогда написал мне про MVC к моему https://github.com/Si0n/register3 , где у меня несоответствие с MVC?
#294 #498790
>>498733

Расширение не важно, они читают содержимое.

>>498746

задачки от ОПа в шапке треда, там же ссылка на проверялку.
#295 #498800
>>494598
как можно создать таблицы динамически? чтобы чел нажал кнопку - создалась таблица под его данные.
#296 #498821
>>498800

не нужно так делать, таблицы создают разработчики. Данные пользователей гораздо удобнее хранить в одной таблице.

Кстати, у нас в ОП посте есть неплохие задачки на SQL если ты хочешь улучшить свои знания.
#297 #498834
>>498821
смотри, я пишу простую борду с нуля, я поместил шапки тредов в ОДНУ таблицу изначально (выводятся последовательно на нулевой). Куда мне их ответы-то помещать, чтобы тоже по порядку выводились к каждому треду? единственный выход вижу - создавать к каждому новую таблицу при создании треда, новую таблицу к каждой строке-треду.
#298 #498835
>>498834

В одну таблицу. Тебе рано еще борды писать, тебе надо SQL и базы данных изучить сначала, я чувствую ты там дров наломаешь.
#299 #498836
>>498834

Почитай про внешние ключи. У поста надо указвыать к какому треду он относится.

И про нормализацию в БД. Никто не создает кучу таблиц для однотипных данных.
#300 #498842
>>498835
мне удобнее и быстрее учиться на практике вместо муторного чтения многотомной воды. ставлю задачу -> точечно решаю параллельно гугля и читая. а так каша будет в голове и все забываться.
#301 #498846
>>498842
Про практику это правильно. Надо ж только начинать с простого и постепенно переходить к сложному.
У меня например запрос на получение ленты нулевой получился в 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
#302 #498848
>>498842

Практика это хорошо, но в твоем случае надо изучать правильные подходы сначала. Например ты не должен делать связи между таблицами не почитав про внешние ключи, и ты не должен проектировать таблицы не почитав про нормализацию. Это не так и много материала.

Тебе надо почитать туториалы (например из задачек по 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, которые любой должен знать. И не многотомные книги, а всего несколько статей. Ну сам посмотри, ты даже не знаешь что посты можно в одной таблице хранить.

Я видел примеры кода которые писали нелюбители читать теорию, и я не собираюсь это поощрять.
#303 #498849
>>498846

> У меня например запрос на получение ленты нулевой получился в 30 строк с тремя объединениями.


Так надо после этого денормализацию сделать и будет норм.
#304 #498850
>>498842

Алсо если ты делаешь несколько связанных запросов (например создать тред и добавить в него пост), то придется еще прочитать про транзакции в БД.
#305 #498919
>>498497
я уже отказался от той библиотеки, так как она очень медленная о сравнению с простым чистым php. Я в итоге её возможности использовал на 10% или типа того, но получались огромные тормознутые объекты.
Беру содержимое страницы просто через file_get_contents();
Марк Садовничий #306 #498964
Привет Антоны. Ищем в команду толкового PHP программиста на удаленку (можно и в офис если захотите ДС2)

Из необходимого - уметь читать чужой говнокод и быстро его править.

Знать *nix и уметь его готовить

PHPUnit или Selenium

Postges only

Зп от 1000 USD шлите ваши гитхабы и резюме на yanchurova.ela (собака) mail.ru
#307 #498971
>>498964

Порносайты пилить это пиздос конечно. Днище полнейшее.
#308 #498972
>>498971
Почему?
#309 #498973
У меня аж шишка встает, когда вижу такие зарплаты.
#310 #498975
>>498971
Почему бы нет? Нагрузка знаешь какая бывает? по 10М хитов и твой любимый Apache с mod_php ложится моментально, а ты еще наверное любитель файлового кеширования. Проходи мимо петушок
#311 #498980
>>498972
>>498975

Да потому что в приличном обществе работы свои не покажешь. Да и вообще мне бы стремно было иметь дело со всякими левыми конторами, которые темными делишками занимаются.
#312 #498982
>>498980
Любая твоя наработка в highload может стать твоим отдельным проектом на том же гитхаб

В РФ все по белому
#313 #498984
Первое задание по JS отсюда https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Решение
http://codepen.io/anon/pen/oXGXyv
за такое сразу обоссут или потом?
#314 #498986
>>498973

1000 долларов? Решай все наши задачки из Оп поста, изучай сифмони и я думаю до такой зарплаты тебе недолго будет расти.

>>498975

Что-то я сомневаюсь что именно Апач от 10М хитов ляжет, там же основная нагрузка на php придется. Ну и для 10М хитов нужно железо нормальное и не один сервер.

А работа демотивирующая, согласен, на эти мерзкие тела весь день смотреть.
#315 #498992
>>498986
10М у нас крутится на одном серваке без проблем. Мамкин хайлоадер?

На телеса смотреть не придется
#316 #498995
>>498984

> typeof(start) == 'undefined' ? count = 0: count = start;


Это замаскированный if, раз так то надо if и использовать. Или переписать как

count = (start === undefined) ? .. : ..;

Или даже так:

var count = start || 0;

typeof не нужен для проверки на undefined, зачем?

> consoleDiv = document.getElementById('console');


Это конечно твое дело, но не проще ли открыть консоль в браузере?

А так, сама идея решения правильная.
#317 #498996
>>498992

10М простой статики и 10М годами перепиливаемой динамики разные вещи.
#318 #499017
>>498995
Про undefined взял тут http://javascript.ru/typeof спросив у гугла "javascript существование переменной"
Это

> consoleDiv = document.getElementById('console');


тоже нагуглил дабы сразу выводить в окошко результата.
#319 #499020
>>498984
ЧТо-то я не пойму, как функция запоминает, какие ей аргументы передавали в прошлый раз?
мимо не шарящий в жс
#320 #499024
>>499017

> javascript существование переменной


Верно, typeof в отличие от прямого сравнения не выдаст ошибки если переменная не существует. Но можем ли мы встретить ситуацию где переменная может не суещствовать? Разве хороший программист станет писать такой код? Конечно, нет. значит и проверять существует ли переменная, не требуется, достаточно сравнить ее с undefined.

> дабы сразу выводить в окошко результата.


Можешь выводить так, если тебе удобнее, но вообще можно открыть консоль отладчика Ctrl + SHift + J и смотреть там, не тратя время на написание кода. Там же кстати можно и кусочки кода тестировать.
#321 #499025
>>499020

Замыкание, функция в момент создания запоминает ссылки на переменные снаружи нее: https://learn.javascript.ru/closures
#322 #499061
ОП, опять вопрос по файлообменнику. В общем сделал я отдачу файла под оригинальным именем, все работает более-менее, но есть небольшая проблема. Копия файла то остается в папке и никуда не девается. Попробовал сразу после readfile() этот файл удалять, вроде бы все ок, но я не совсем понимаю, как оно все работает. Когда именно происходит удаление? Сразу же или когда пользователь файл докачает? Как вообще readfile() работает?
#323 #499068
>>498668
Спасибо, я вчера всё таки нагуглил позиционирование в бутстрапе и изучил, после этого переоформил полностью сайт студентов и теперь выглядит не так стремно как раньше.
Колизеич #324 #499081
Аносланцы, скажите за фреймворк? Лаварел или симфония2? Есть опыт быдлокодинга на пьюрпхп и микрофреймворках. Хочу че-нить такое потолще, поудобнее и чтобы потом макакой работать можно было.
#325 #499090
>>499081
и ищо, сложно сразу учиться и в фронтед писать и в бэкенд? А то вон, вконтактерские макаки умеют и в пьюрпэхэпэ и на всяких модных жс фреймворках пилить приложухи)
#326 #499099
Какой вид таблицы поддерживает внешние ключи, помимо InnoDB? На хостингере такого вида не вижу, может какие получше хосты есть, где есть такой вид таблицы и функции запретные разблокированы?
#327 #499106
Что скажите о человеке который это писал?
http://ideone.com/ntjAXj
#328 #499109
>>499061
Какая нахуй копия? Там нужно настроить при помощи модуля апача mod_rewrite, чтобы файл с сервера dirtyporn123.mp4.txt отдавался браузером как dirtyporn123.mp4

Учи mod_rewrite, крутая штука. Суть в том, что пользователь запрашивает урл, которого может быть даже не существует, например download/dirtyporn123.mp4, а сервер отдает ему урл upload/dirtyporn123.mp4.txt

Я тоже делаю файлообменник, вечером выложу можешь подсмотреть у меня.
#329 #499116
Хотя чует моя жопа, что у меня тоже довольно костыльно получилось. С кучей перенаправлений и переписываний url (с двумя на самом деле). ОП наверное забракует.

Схема такая:
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 + редирект на искомый файл это не слишком кривое решение? У меня жопыта нет, поэтому я не могу судить, насколько это рационально.
#330 #499118
>>499106
Хронический мастурбатор.
#331 #499119
>>499116
Location неправильно написал.
mydomain.com/upload/{$id}_{$name}.txt

fix
#332 #499120
>>499118
Так про любую особь мужского пола можно сказать, не?
#333 #499127
>>499116
Нет, говно какое-то получается.
Блин, как апачу подсунуть заголовок "Content-disposition", минуя php? Потому что это ебланство отдавать файлы через readfile.
Мне всего-то осталось сделать, чтобы при запросе изображения оно открывалось не в окне браузера, а сохранялось на диск.
#334 #499132
>>498675

>Я выше тебе написал что для отдачи файлов надо либо использовать трюк с переписыванием URL (заголовок Content-Disposition attachemnt этим файлам можно добавить отдельным htaccess)



А, в htaccess можно еще и заголовки засовывать. Интересно. Осталось выяснить, как это сделать.
(извиняюсь за невнимательность.)
#335 #499133
>>499120
Кто не служил дрочит, тот не мужик.

Логика сосача.
#336 #499149
Посоны, совсем недавно начал постигать явускрипт и jQuery, до этого постигал ПХП, вот пытаюсь сделать галерею, типо той что есть на странице миниатюры картинок, нажимаешь по ним и появляется на экране увеличенная картинка, причём фон что сзади затемняется. У меня получается лишь нормально для картинок одинаковых размеров, а хочется что бы было для картинок любых размеров, собственно сам код:

ХТМЛ

Миниатюры:

<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;

Я не знаю как выставить эти значения что бы они подходили автоматически для всех размеров, явно там должно быть что то не числовое. Пока единственная мысль каким-то брать атрибуты у получаемых картинок и на основе их прописывать отступы, сам ксс я не очень знаю жти стили подсмотрел
#336 #499149
Посоны, совсем недавно начал постигать явускрипт и jQuery, до этого постигал ПХП, вот пытаюсь сделать галерею, типо той что есть на странице миниатюры картинок, нажимаешь по ним и появляется на экране увеличенная картинка, причём фон что сзади затемняется. У меня получается лишь нормально для картинок одинаковых размеров, а хочется что бы было для картинок любых размеров, собственно сам код:

ХТМЛ

Миниатюры:

<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;

Я не знаю как выставить эти значения что бы они подходили автоматически для всех размеров, явно там должно быть что то не числовое. Пока единственная мысль каким-то брать атрибуты у получаемых картинок и на основе их прописывать отступы, сам ксс я не очень знаю жти стили подсмотрел
#337 #499155
>>499149
Читай как работает margin: auto.
#338 #499201
>>498964

>


>Знать nix и уметь его готовить


>


>PHPUnit или Selenium


>


>Postges only



А расшифруйте, что это?
нюфаня*
#339 #499203
>>498986
На базу там основная нагрузка придётся.
#340 #499204
>>499201
Если тебе нужно это расшифровывать - то ты очевидно им не подходишь.
#341 #499210
>>498964
Кстати вопрос.
Правда что скоро все больше будут на Пост переходить и Мускл уйдет на покой?
#342 #499227
Укажите где ошибся в задаче на расшифровку.
Вроде бы логически должно работать, но почему-то не работает.
https://ideone.com/rcLVLK
#343 #499230
>>499227
Array_flip возвращает массив, который не записывается ни в какую переменную. Или ты думаешь он меняет оригинальный массив, только потому-что ты передал его как аргумент в функцию?
#344 #499232
>>499230
Понял, починил, спасибо.
#345 #499250
Какая-то хрень с этой библиотекой getid3.
Если скачать с сайта 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
#345 #499250
Какая-то хрень с этой библиотекой getid3.
Если скачать с сайта 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
#346 #499257
На сайте getid3.org есть ссылка на гитхаб некоего JamesHeinrich.
Поставил композером другую версию 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

Ладно, я тогда пока руками прикручу эту шнягу, а там посмотрим.
#347 #499264
>>499203
Да надо уметь в индексы pgSQL
#348 #499274
Как вывести рандомый элемент из массива?
#349 #499276
>>499274
В php для этого есть встроенная функция.
Посмотреть список функций для работы с массивами можно на сайте http://php.net/manual/ru/ref.array.php
#350 #499348
Ебанутая ошибка

if($_GET['x'] != 1)
return false;

на локалке работает, на сервере всегда возвращает false

if($_GET['x'] != 1){
return false;
}

работает везде
#351 #499393
>>494598

> мы изучаем язык PHP (а также JS/CSS/HTML/SQL)


> SQL


О, мне к вам.
Есть два запроса, select1 выдаёт таблицу (id:1, 2), select2 выдаёт таблицу (id:1, 3).
Как мне в одном запросе, содержащем оба селекта реализовать следующее - надо, чтобы вывелось только то значение из первой таблицы, которое не продублировано во второй?
То есть 1 есть в обеих, значит выводится только 2.
#352 #499396
>>499090

Мне интересно, откуда все это идет, разделение на бекенд и фронтенд, разговоры про то какой сложный JS (или PHP)? Я все время вижу как аноны пытаются избежать изучения какой-нибудь нужной вещи под этим предлогом. По моему это все идет от лени и как вы наверно догадыветесь, в нашем треде такие настроения не одобряются.

Чтобы научиться верстать/править верстку не нужно прикладывать сверхусилия. Изучить HTMl/CSS можно неспешно за 3-4 недели решая наши задачки. Изучить JS/DOM/jQuery на базовом уровне можно за месяц-два, а потом уже когда-нибудь позже подтягивать до хорошего уровня.

А те, кто заводят эти разговоры, по моему просто ленятся. Они наверно думают, что достаточно прочесть несколько статей, порешать задачки пару недель и готов новый джуниор. Как бы не так! На любую другую специальность вам надо учиться либо несколько лет в техникуме, либо в университете. Почему программист должен прикладывать меньше усилий?

Конечно, ситуация такая, что на рынке труда пока спрос относительно выше чем предложение. Вдобавок не совсем дружественные нам страны переманивают самых умных, тряся мешками с деньгами. Несчастные работодатели готовы брать любого, кто способен сделать простое приложение, знаком с каким-нибудь фрйемворком и не шарахается от классов, объектов и MVC. Потому годами учиться не требуется. Но усилия приложить все же придется, чтобы выглядеть лучше других кандидатов.

Тут конечно придирчивый анон заметит, что разделение на бекендщиков и фронтендщиков/верстальщиков во многих компаниях все же есть. Но оно делается не потому, что работодатель проникся снисхождением к вашей лени. Просто обычно за верстку страниц платят меньше чем за программирование, и выгоднее эту задачу поручить отдельному верстальщику (вдобавок на рынке их проще найти). А когда мы говорим «фронтенд-специалист» мы имеем в виду не верстальщика, а человека который способен например сделать single-page приложение на каком-нибудь JS фреймворке или мобильное HTML приложение с использованием Cordova, то есть который на высоком уровне знает клиентсайдные технологии (на самом деле нет, все эти приложения тормозят, трясутся и дергаются так что я сильно сомневаюсь в способностях тех, кто их пишет).

Но все равно на мой взгляд гораздо ценнее знать и JS и PHP.
#352 #499396
>>499090

Мне интересно, откуда все это идет, разделение на бекенд и фронтенд, разговоры про то какой сложный JS (или PHP)? Я все время вижу как аноны пытаются избежать изучения какой-нибудь нужной вещи под этим предлогом. По моему это все идет от лени и как вы наверно догадыветесь, в нашем треде такие настроения не одобряются.

Чтобы научиться верстать/править верстку не нужно прикладывать сверхусилия. Изучить HTMl/CSS можно неспешно за 3-4 недели решая наши задачки. Изучить JS/DOM/jQuery на базовом уровне можно за месяц-два, а потом уже когда-нибудь позже подтягивать до хорошего уровня.

А те, кто заводят эти разговоры, по моему просто ленятся. Они наверно думают, что достаточно прочесть несколько статей, порешать задачки пару недель и готов новый джуниор. Как бы не так! На любую другую специальность вам надо учиться либо несколько лет в техникуме, либо в университете. Почему программист должен прикладывать меньше усилий?

Конечно, ситуация такая, что на рынке труда пока спрос относительно выше чем предложение. Вдобавок не совсем дружественные нам страны переманивают самых умных, тряся мешками с деньгами. Несчастные работодатели готовы брать любого, кто способен сделать простое приложение, знаком с каким-нибудь фрйемворком и не шарахается от классов, объектов и MVC. Потому годами учиться не требуется. Но усилия приложить все же придется, чтобы выглядеть лучше других кандидатов.

Тут конечно придирчивый анон заметит, что разделение на бекендщиков и фронтендщиков/верстальщиков во многих компаниях все же есть. Но оно делается не потому, что работодатель проникся снисхождением к вашей лени. Просто обычно за верстку страниц платят меньше чем за программирование, и выгоднее эту задачу поручить отдельному верстальщику (вдобавок на рынке их проще найти). А когда мы говорим «фронтенд-специалист» мы имеем в виду не верстальщика, а человека который способен например сделать single-page приложение на каком-нибудь JS фреймворке или мобильное HTML приложение с использованием Cordova, то есть который на высоком уровне знает клиентсайдные технологии (на самом деле нет, все эти приложения тормозят, трясутся и дергаются так что я сильно сомневаюсь в способностях тех, кто их пишет).

Но все равно на мой взгляд гораздо ценнее знать и JS и PHP.
#353 #499401
>>499116

Ошибки:

> ("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

Ой, что-то я на «вы» пишу. Ну да ладно, это наверно не одному анону интересно будет.
#353 #499401
>>499116

Ошибки:

> ("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

Ой, что-то я на «вы» пишу. Ну да ладно, это наверно не одному анону интересно будет.
#354 #499413
>>499149

Погугли про центрирование в 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 так как он не занимает место на экране и его удобно запускать/останавливать перед тестами.

Если кто-то захочет это изучать, я могу придумать задание.
#354 #499413
>>499149

Погугли про центрирование в 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 так как он не занимает место на экране и его удобно запускать/останавливать перед тестами.

Если кто-то захочет это изучать, я могу придумать задание.
#355 #499420
>>499210

Нет. Такое ощущение складывается только из-за большой пиар-активности фанатиков постгреса которые в каждом обсуждении не забывают его пиарить. Википедия и многие другие сайты использует 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 (по моему так проще).
#355 #499420
>>499210

Нет. Такое ощущение складывается только из-за большой пиар-активности фанатиков постгреса которые в каждом обсуждении не забывают его пиарить. Википедия и многие другие сайты использует 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 (по моему так проще).
#356 #499421
>>499257

Ну нет, анон, что такое! Не сдавайся так быстро! Я помню, кто-то ее ставил и все работало.

> 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, она бы наверно вывела подсказку по имени класса. Подумай, может стоит какую-нибудь установить?

Ну и надеюсь что из моих постов ты получил представление как можно искать причну ошибок. И понял что в программировании мелочи могут быть важными, компьютер не будет за тебя исправлять написание имени класса.
170 Кб, 1024x768
Гуманитарий #357 #499425
Cап. Решил начать учить быдлокод и фрилансить, ибо больше перспектив не вижу в своей жизни. Составил себе план:
1. Освоить html и закрепить знания, написав на нем полноценный сайт на локалке. Собсна, развлекаюсь уже второй день, пилю двачи на html, кек.
2. Освоить СounterStrike:Sourse. Понятия не имею, что это и с чем едят и за какое время можно освоить. Знаю, что эта дрянь как-то связана с таблицами и стилем.
3. После всего этого начинать осваить сам пхп и параллельно управление БД.

Но в мою голову закрался вопрос по поводу JS. Он нужен для того, чтобы сайт был динамичным или даже интерактивным? Как его вклинить в план изучения? Учить параллельно со всем или нет?
#358 #499431
>>499425

HTML надо вместе с CSS учить, т.к. они неразрывно связаны. По сути HTML говорить браузеру ЧТО показывать, а CSS-стили КАК показывать. Советую пройти курс на сайте htmlacademy.ru, там все максимально доступно и наглядно показывается. Алсо, на HTML ты полноценный сайт не сделаешь. Просто набор статических страничек, не более.

JS да, позволяет странице динамически изменяться, добавляя различные эффекты, красивости и прочее. Учить можешь прям сразу после HTML/CSS или после PHP, как это сделал я. Особой разницы нет.
#359 #499436
ОП, второй анон с файлообменником опять на связи. Скачку файла сделал без .htaccess, просто в заголовок подсовываю оригинальное имя, а потом через readfile передаю файл, который хранится под серверным именем. На локалке вроде норм работает, файлы качаются. Выглядит это примерно так:

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();

Норм вариант?
#360 #499474
>>499436
Это JS?
#361 #499475
>>499474

Эмм, нет.
#363 #499515
Нужен посан с опытом работы с API WordPress. Задача - убрать один из параметров полученных через GET из Location при постбеке. Я знаю что можно это сделать тупо джсом, но это не наш метод. Натинвая функция header тоже не вариант ибо WordPress ещё кучу всего выплёвывает до того как добирается до кода моего плагина, поэтому мы обязаны использовать хуки при помощи фильтров или экшонов, оба варианта присутствуют в кода и не имеют никакого эффекта на результат. Никакой ошибки функции wp здесь не возвращают, они вообще не очень часто любят это делать даже в случе когда база данных кидается ворнингами, подрывался на этом неск раз уже.

Вот пример кода:

[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]
650 Кб, 360x360
#364 #499521
наверное дурацкий вопрос, но помоги мне, антош!
решил заняться всей этой шляпой, какой ноут купить?
с какими характеристиками? что php, mysql, apach и иже с ними норм работали
#365 #499528
>>499436
ОП мне уже два раза писал не использовать 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
Но тоже на английском языке, и автор использует минт, так что если ты все еще на винде, это может вызвать неудобства.
#365 #499528
>>499436
ОП мне уже два раза писал не использовать 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
Но тоже на английском языке, и автор использует минт, так что если ты все еще на винде, это может вызвать неудобства.
79 Кб, 497x501
#366 #499530
>>499431
Спасибо за помощь, бро.
#367 #499538
>>499521
Для пхп, мускула и апача хватит с головой 20мб оперативки и процессора твоего телефона года так 2008, дальше думай сам, лол.
Если хочешь с ноута работать - бери легкий и с удобной клавиатурой, чтобы носить его не заебался и печатать было удобно. Ну и с нормальным разрешением экрана и диагональю 15". 13" будет маловато.
В случае работы с виртуалками - памяти желательно 8гб+.
#368 #499540
>>499521
Любой.
#369 #499555
>>499421
А, блджад, действительно имя класса в ЭТОЙ версии библиотеки называется getID3 (с маленькой буквы, а ID в верхнем).
У phansys вообще в названии какая-то хуита типа GetId3_GetId3.

>если использовать IDE, она бы наверно вывела подсказку по имени класса


Я давно поставил PhpStorm, редко к нему обращаюсь, мне и саблайма хватает пока. Ну вот пожалуй первый случай, когда ide мог бы выручить, подсветив классы.

Расскажи об использовании ide. Как использовать инструменты дебаггинга? Как пользоваться встроенным гитом? А то я как даун каждый раз пишу в терминале.
#370 #499570
>>499436

>header('Cache-Control: must-revalidate');


>header('Pragma: public');



Ты знаешь, что делают эти заголовки? И я не знаю.
Не знаю, зачем ОП дает нам эту мудацкую статью, из которой ты скопипастил буквы. http://habrahabr.ru/post/151795/

Кстати, у меня складывается впечатление, что на хабрахабре собираются какие-то ушлепки, чтобы попиздеть в комментариях.
Ну а чё, вк и одноклассники на работе заблочены злым насяльником. Чем хабр не соцсеть?
Один уебок постит бесполезную (для учащихся) статью, которую он коряво перевел с англоязычного ресурса, чтобы получить лайки, рейтинг или что у них там. А сотни бездельников в каментах начинают меряться писюнами и с чувством собственной важности обсасывать всякую хуйню, типа "что быстрее работает: print или echo". Я не шучу http://habrahabr.ru/post/22951/

Одним словом, хабр это второе после сосача место скопления долбоебов.
#371 #499577
>>499528

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 нужен маньяк-дизайнер-поклонник Раскина и Купера. Ну или может просто мое восприятие интерфейсов не совпадает с их и их пользователей восприятием.
#371 #499577
>>499528

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 нужен маньяк-дизайнер-поклонник Раскина и Купера. Ну или может просто мое восприятие интерфейсов не совпадает с их и их пользователей восприятием.
#372 #499581
>>499570

Да, в интернете (и на хабре как его части) много неграмотных людей, там вам могут на полном серьезе рассказывать про важность замены одиночных кавычек на двойные, и подобное. Но иногда можно увидеть и умную мысль, и подчерпнуть что-то новое. Я на Хабр пришел когда весь мой опыт состоял из работы с самописной CMS выполненной лучших традициях PHP4 (лапша повсюду), и именно с хабра я узнал про фреймворки (оказывается есть MVC), SVN, уязвимости, фриланс и сколько зарабатывает программист в Москве (в то время фреймворки и PEAR были редкостью и исопльзовались только крутыми опытными программистами, а большинство про них и не слышало и писало велосипеды. Это конечно вообще был кошмар какой-то, никто писать не умел). Потому Хабр принял какое-то участие в моем развитии и я к нему по прежнему тепло отношусь.

Надо просто более критически относиться к тому что написано, и если что-то кажется сомнительным, гуглить или задавать вопрос в нашем (или не нашем) треде.

И копипастиь буквы конечно не надо. Надо разбираться что делает каждая строчка в твоем коде, иначе какой ты программист? Ты мартышкой так станешь.

Статью я дал ради третьего варианта, с X-SendFile. Первый и второй там конечно ад какой-то, особенно второй который представляет собой попытку вручную написать аналог первого потому что кто-то где-то слышал что в какой-то версии 10 лет назад были какие-то проблемы с памятью.

> Чем хабр не соцсеть?


Ох лол, я когда то там сидел и писал комментарии и даже в irc канале одно время зависал.
#373 #499587
>>499570

Эти заголовки которые возможно управляют кешированием. заголовки управления кешированием делатся на 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 довольно заковыристые возможности для управления кешированием, но на практике достаточно знать пару вещей: как заставить браузер кешировать ответ и наооборот, не кешировать.

В случае скачивания файлов кеш не нужен, браузер вряд ли будет кеширвать огромный ответ, а пользователь вряд ли будет скачивать файл несколько раз.
#374 #499591
Насколько широко распространен nginx? А то я тут с ног до головы обмазываюсь htaccess, модулями апача (встроенными и внешними вроде x-sendfile), а потом приду устраиваться на работу, а там хипсторы с петушиными гребнями мне и говорят: апач для быдла, гуляй вася.
Учить nginx или как всегда оставить на потом? Ну в смысле насколько это важно в приоритете.
#375 #499603
Сколько времени для среднеанона займёт задача про файлообменник? Если мой уровегь примерно как после задачи про студентов.
Заранее благодарю.
#376 #499628
>>499603
Сам файлообменник можно написать за два дня.
Беда в том, что у тебя для этого должны быть знания. Если знаний нет, то при каждой непонятке придется постоянно отвлекаться на поиск и изучение информации. А учить придется много.

Я в процессе выполнения этого квеста столкнулся с такими большими и маленькими темами, где у меня были пробелы в знаниях:
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 месяцев в зависимости от того, какой у тебя есть опыт, сколько можешь уделять времени в сутки и скорости работы головного мозга.

Если делать еще генератор превью для хайрез-картинок, а также прикручивать плеер для аудио-видео, это уже можно рассматривать как отдельные задачи.
#376 #499628
>>499603
Сам файлообменник можно написать за два дня.
Беда в том, что у тебя для этого должны быть знания. Если знаний нет, то при каждой непонятке придется постоянно отвлекаться на поиск и изучение информации. А учить придется много.

Я в процессе выполнения этого квеста столкнулся с такими большими и маленькими темами, где у меня были пробелы в знаниях:
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 месяцев в зависимости от того, какой у тебя есть опыт, сколько можешь уделять времени в сутки и скорости работы головного мозга.

Если делать еще генератор превью для хайрез-картинок, а также прикручивать плеер для аудио-видео, это уже можно рассматривать как отдельные задачи.
#377 #499643
>>499628
Большое спасибо за подробный ответ.
Генератор превьюшек-то уже готов.
#378 #499661
>>499528

>у тебя будут проблемы с названиями кириллицей.



Может проще названия файлов на транслит переводить?

Я бы может и заморочился с изучением этого mod_rewrite, но особого смысла не вижу, т.к. и так все прекрасно работает. Мне все равно дополнительная функция нужна для обновления счетчика, так почему бы в этой же функции не выдавать файл на закачку?

Если бы была необходимость давать "типа прямые ссылки", тогда другое дело. Но этой необходимости нет.
#379 #499680
>>499661
Ну хуй знает. Просто мне кажется, что файлы должен отдавать сервер, это его прямое назначение.
Хотя ради счетчика может и стоит пойти на извращения.

И тут ОП такой врывается и поясняет нам, как собственно php работает с файловыми потоками?
Вот у меня файл весит 2 гигабайта. Php его полностью зачитает в оперативную память что ли? Или будет откусывать по кусочку и передавать апачу? А тот... хрен знает, то ли высылает юзеру так же по частям, то ли тоже складывает в какой-то буфер. Непонятно.
#380 #499685
>>499521
15 дюймов матрица и 8Гб+ оперативки, остальное на вкус и цвет. Еще из не очевидного: если ноут светится как новогодняя елка быстрее будут уставать глаза, особенно если ты не владеешь слепой печатью; Intel + Nvidia будет меньше ебли если решишь накатить Линупс, но я бы советовал накатить линупс на виртуальную машину, у ОПа есть мануал на эту тему.
#381 #499689
>>499661

Можно переводить, особенно если нужна работа под 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 поддерживают докачку файлов с середины, а твой скрипт поддерживает?
#382 #499690
>>499685

> Nvidia будет меньше ебли если решишь накатить Линупс


Тонко.
https://www.youtube.com/watch?v=iq7wYrNBi2w
#383 #499698
>>499689

Ну кароч понятно. Есть конечно способы лучше, но в данном случае обойдусь без них, т.к. сайт мой все равно максимум 50 мегабайт принимать будет и никаких нагрузок на нем не предвидится. Так что просто буду заменять кириллицу на транслит.
#384 #499703
>>499603
Походу задача про файлообменник сейчас в тренде, тоже ее решаю.
Ох и наебался же я только что с x-sendfile, но таки заработало. Вообще насколько мне кажется задача на файлообменник делается быстрее задачи на список студентов, но блин каждый маленький шажок дается с трудом, я два дня читал про этот mod_rewrite, все-равно до конца не понял некоторые моменты, думаю придет с практикой, теперь вот этот x-sendfile, а сейчас придется с превьюшками разбираться
( напоминаю ОП, посмотри моих студентов https://github.com/V3N0m21/StudentList )
#385 #499708
>>499703

Нахуй тебе превьюшки на файлообменнике? Ты собираешься галерею картинок чтоли пилить? По-моему проще просто картинку ужимать средствами CSS, чем лишний раз сервак напрягать. Превьюшки имеют смысл только тогда, когда этих самых картинок на странице много. А если она одна, то зачем?
#386 #499712
>>499708
Чтоб технологию пощупать, не?
Мы же эти задачи решаем не для того чтоб заработало, а для того чтоб получить новые знания
#387 #499715
>>499712

Что там щупать то? Если ты файлообменник уже пилишь, то для тебя ничего нового там не будет.
#388 #499716
>>499708
А как же экономия трафика пользователя?
#389 #499721
>>499708

>просто картинку ужимать средствами CSS


Очевидный быдлокод.
Во-первых лишний трафик.
А если там картинки в хайрезе, в psd формате с 10 слоями? Каждая будет весит метров по 50-100.

На странице описания файла тебе нужно вывести иконку 100х100.
Ты будешь гонять эти 50мб каждый раз при обращении к подобной странице?

А если изменится дизайн, и понадобится не 100x100, другой размер? Бегать по стилям и все исправлять? Или подключать ради этого less/sass?

>галерею картинок


Такая возможность должна быть предусмотрена.

И вообще задачи опа учат именно правильно мыслить. Нужно учиться проектировать и продумывать наперед все нюансы.
#390 #499741
ОП, ты меня почти уговорил использовать x-senfile. Единственное, что мня терзает: это же сторонний модуль. А если я захочу выложить на хостинг, как мне заставить тупую техподдержку его включить ради моего сайта?
Ну и за популярность nginx прилинкую свой вопрос. >>499591
#392 #499788
Ну посоветуйте же платный хост, где есть поддержка таблицы Innodb!!!
#393 #499793
>>499774
Ну бля!
В лицо-то сракой зачем? Да ещё сразу тремя.
#394 #499797
>>499793
еще и с кусочками какашечек хех
sage #395 #499798
Пост, чтобы скрыть мерзкие картинки.
#396 #499800
>>499797
А ты, значит, увеличил и рассматривал, проказник?
#397 #499801
>>499798
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Теперь норм.
#397 #499801
>>499798
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Теперь норм.
#398 #499805
>>499774
Опа, онанисты и сюда притащили своих ванильных блядей.
#399 #499821
>>499800
На первой коричневое пятно говна даже издалека видно лол.
#400 #499828
>>499821
Там еще и ноги грязные, фу блядь.
#401 #499846
Посоны, поясните, почему в этом примере http://plnkr.co/edit/wEdMrCVjwuBogzqPaWZy?p=preview если клинкуть по диву после нескольких секунд работы скрипта, параметр top у дива который падает будет = 0px, почему так? Потому что он читает изначально установленные данные из файла css? Как получить его текущее положение?
#402 #499847
>>499425
Та же проблема как и у тебя, я вот месяцев 5 учил ПХП, теперь взялся за явскрипт учу примерно дней 20-25 его пока, но надо сказать язык затягивает, он оказался интереснее чем ПХП, но немного сложнее, а может и много, у меня проблема начинаю немного уже забывать про ПХП, поэтому скоро опять планирую вернутся к ПХП, ещё раз всё повторить написать какой-нибудь сайт и уже идти устраиваться работать.
#403 #499876
Как в слиме временно отключить кэширование на отладке? Я заколебался нажимать ctrl + shift + r, срабатывает почему-то не с первого раза.
Как это кэширование вообще работает? Я же думал, что стоит нажать ctrl + f5 (или ctrl + shift + r на ноуте), как страница принудительно перезагрузится, запросив контент у сервера. Или слим хранит кэш прям на сервере?
оповские талмуды >>499587 как-нибудь на досуге почитаю, вместо сказки на ночь. Мне бы пока только кэш слима временно отключить.
#404 #499877
Так чо есть аналоги таблиц с внешними ключами, кроме InnoBD?
#405 #499878
>>499846
ты нахуй в пхп тред пишешь? иди в жс.
#406 #499880
>>499846
also гугли offset.
#407 #499881
>>499877
Да чем тебя InnoDB не устраивает? Для mysql самый продвинутый движок. Само собой, все хостеры его поддерживают, кроме совсем уж уебищных бесплатных помоек.
Про другие субд не в курсе.
#408 #499882
>>499847
пфф, меня наоборот от жаваскрипта блевать тянет, пхп гораздо удобнее - это одновременно шаблонизатор, который можно вставить в любой кусок хтмл кода и вывести перменную.
#409 #499884
>>499881
ПОТОМУ ЧТО У МОЕГО ХОСТА В ТБЛИЦАХ MYSQL НЕТ ТАКОГО ТИПА ТАБЛИЦ!
#410 #499888
>>499884
>>499788

Из платных есть популярный хостингер, например.
Олл инклюзив за 192 рубля в месяц. 30 дней можно потестировать бесплатно.
Характеристики сервера смотри в таблице. InnoDB поддерживают.
http://www.hostinger.ru/hosting
3 Кб, 126x140
#411 #499895
>>499888
я на хостингере и хостюсь блять.
там чо только для платных есть такой тип таблицы?
#412 #499897
>>494598
Кто на ОП-пике?
#413 #499901
#415 #499905
>>499902
Пруфы?
176 Кб, 844x656
103 Кб, 812x556
#416 #499913
Дошёл в курсах до CURL, решил попробовать авторизироваться ВКонтакте. Посмотрел как там устроено:
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);
176 Кб, 844x656
103 Кб, 812x556
#416 #499913
Дошёл в курсах до CURL, решил попробовать авторизироваться ВКонтакте. Посмотрел как там устроено:
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);
#417 #499942
>>499902
Оп этого треда Игорь Борисов? Да?
#418 #499946
>>499942

Да. Не узнал чтоле?
#419 #499948
>>499946
Пока что ОП этого треда хуй простой, без пруфов.
#420 #499951
>>499948

Он просто стесняшка.
#421 #499955
>>499951
Борисова лично видел, он точно не стесняшка.
#422 #499956
Решил разобраться с темой загрузки изображений и их последующее выведение на экран с ресайзами, есть ли где почитать об этом основы?
#423 #499958
>>499956
В жожле бы посмотрел хотя бы. В любом случае, тебе придётся использовать встроенную библиотеку GD, там есть инструментарий на все случаи жизни.
#424 #499962
>>499958
Посмотрел, кидает на phpforum с решением конкретных вопросов юзеров либо на библиотеки для работы с изображениями, мне бы что-то более объемное с аспектами.
#425 #499980
>>499956
Поскольку изображения это обычный файл, то нужно разобраться сначала, как загружаются файлы на сервер.
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
#426 #499982
>>499980
О, благодарю!
#427 #500015
Как в этой игре сделано такое реалистичное нажатие на кнопочки крестика?
http://s.pikabu.ru/external/0x00_3/index_frame.html
#428 #500020
>>500015
Клик мышкой --> смена картинки на уже с нажатой кнопкой. Наверное. Я сам зелёный.
170 Кб, 1200x900
#429 #500025
>>500020
Да вроде ты прав. Там есть вот такой файлик.
#430 #500026
>>500015
Смотрю на это и мой пукан горит - хера я когда смогу такое запилить.
#431 #500032
>>499913
Бамп.
#432 #500034
>>500015
Я вот с этого охуел. Музыка, шрифты - всё на js сделано. Ни единого ресурса в игре.
#433 #500036
>>500034
Я вот с этого охуел. Музыка, шрифты - всё на js сделано. Ни единого ресурса в игре.
http://vk.com/app4440323
#434 #500041
>>500036
Ресурсы могут передаваться аяксом (или через сокеты), поэтому если ты их не видишь по прямым ссылкам, это не значит что они "генерируются" на лету.
Вк использует либо айфреймы, либо скорее всего флеш.

Учились бы лучше, а не охуевали от говноприложений.
#435 #500043
>>500041
Ты бы чем ругать почём зря, разобрался бы лучше. Там весь код открытый и видно, что ресурсы генерируются на лету, даже музыка.

>аяксом (или через сокеты)


Лол, сам бы поучился.
#436 #500045
>>500043
Ага, даже аллах.
#437 #500046
>>500045
Аллах скомпилирован на ассемблере.
#438 #500099
Припустим, у меня есть сайт на локалхосте. Не важно, какой движок. Я хочу запустить скриптик и выкачать все страницы в другу папку. Как /помогите реализовать?
#439 #500103
>>500099
Я ничего не понял.
Локалхост - это когда сервер установлен на твоем компьютере, локально. Что ты с него выкачивать собрался? Скопируй руками.
#440 #500108
>>500103

>Я ничего не понял.


Это что-то вроде статического генератора с удобной админкой. Только что решил проблему через wget, но хочется поебаться с curl.
#441 #500109
>>500108
с помощью
#442 #500163
>>499980
Почему-то не находит картинку 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
#443 #500166
>>499913
>>499913
Бамп вопросу
#444 #500174
>>500163

> $jpeg_file = "2.jpeg";


У тебя указано только имя файла, но не указан путь к нему. Как ты считаешь, в какой папке будет искать PHP этот файл?
#445 #500181
>>500174
Мне кажется в той же папке где и сам файл с этим скриптом.
#446 #500187
>>500181

Неверно. Искаться он будет в «текущей» папке, увидеть ее можно через var_dump(getcwd())

По этой приине код который использует относительные пути, хрупкий и не надежный. Ты должен формировать полные пути к файлу.
11 Кб, 999x107
#447 #500192
>>500187
Текущая папка судя по var_dump(getcwd()) и ничего по сути не изменилось.
71 Кб, 238x327
super VIP post #448 #500405
Затишье какое, все небось отдыхают, один я тут как Путин на галерах.

ПОП, проверь файлообменник.
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 для драг-дропа, полосочка загрузки файла;
- генерировать уменьшенные копии для изображений при запросе;
- перевести шаблоны на бутстрап.
71 Кб, 238x327
super VIP post #448 #500405
Затишье какое, все небось отдыхают, один я тут как Путин на галерах.

ПОП, проверь файлообменник.
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 для драг-дропа, полосочка загрузки файла;
- генерировать уменьшенные копии для изображений при запросе;
- перевести шаблоны на бутстрап.
#450 #500487
>>500192

покажи файлы в папке. Ты 2.jpeg и 2.jpg не перепутал?

>>500421

Не-не, ты неправильное советуешь, клиентские библиотеки не надо ставить через композер (есть bower но там свои подвохи).
#451 #500491
>>500487
Ну вот, например
http://habrahabr.ru/sandbox/50913/
#452 #500500
>>500491

Это неудачный пример. Папка vendor для php-библиотек и она может быть не доступна снаружи, соответственно ставить в нее клиентские библиотеки неправильно. Как я написал выыше, есть bower для установки всяких jquery/bootstrap, но его обычно используют не отдельно, а вместе с цепочкой обработки статики на grunt/gulp (хотя я всегда предпочитал bash скрипты, они проще получаются). Но на файлообменнике все это задействовать наверно будет излишне, вот если бы у анона был большой объем js кода, клиентские шаблоны, там бы все это потребовалось.

А в этой ситуации анону проще руками скачать бутстрап. Либо через bower установить.
#453 #500505
>>500500
Мне это кажется излишней автоматизацией. Скачать две папки с js и css файлами, неужели это быстрее, чем устанавливать bower и писать к нему команды. Какое-то упрощение ради упрощения.
11 Кб, 597x152
#454 #500509
>>500487

>покажи файлы в папке. Ты 2.jpeg и 2.jpg не перепутал?

https://github.com/Integer64/myTestSite.dev/tree/master/vecktorOOP #455 #500546
>>497849
>>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. В комментариях обычно пишут неочевидные вещи, зачем написана та или иная команда, описываются подводные камни в коде. Я думаю, что ты это писал для себя, когда изучал классы, если так то ок, но в дальнейшем не пиши такого.

> https://github.com/Integer64/myTestSite.dev/blob/master/vecktor_OOP/models/AnticrisisManagement.php#L198


> private function upgrade($upgradeManagers)


тут ты тоже не должен ловить исключения. Надо просто не выбирать менеджеров 3-го ранга для повышения, а брать только 1-го и второго.

В общем, я думаю, что если убрать try/catch и исправить выбор менеджеров, код станет правильным, а ты модешь переходить к следующей задаче, по моему это задача про список абитуриентов, да? Ты уже установил веб-сервер, так что самое время перейти от неинтерактивных программ к полноценным приложениям и работе с базой (кстати задания по SQL есть в ОП посте). ну и вообще, если ты знаешь такие сложные понятия как Integer64, для тебя эта задача не представит большой сложности.
https://github.com/Integer64/myTestSite.dev/tree/master/vecktorOOP #455 #500546
>>497849
>>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. В комментариях обычно пишут неочевидные вещи, зачем написана та или иная команда, описываются подводные камни в коде. Я думаю, что ты это писал для себя, когда изучал классы, если так то ок, но в дальнейшем не пиши такого.

> https://github.com/Integer64/myTestSite.dev/blob/master/vecktor_OOP/models/AnticrisisManagement.php#L198


> private function upgrade($upgradeManagers)


тут ты тоже не должен ловить исключения. Надо просто не выбирать менеджеров 3-го ранга для повышения, а брать только 1-го и второго.

В общем, я думаю, что если убрать try/catch и исправить выбор менеджеров, код станет правильным, а ты модешь переходить к следующей задаче, по моему это задача про список абитуриентов, да? Ты уже установил веб-сервер, так что самое время перейти от неинтерактивных программ к полноценным приложениям и работе с базой (кстати задания по SQL есть в ОП посте). ну и вообще, если ты знаешь такие сложные понятия как Integer64, для тебя эта задача не представит большой сложности.
#456 #500547
>>500509

Включи отображение расширений (как, написано в интернете), у же тебя только имена выводятся. «Рисунок JPEG» это тип файла, а не расширение.

Либо в командной строке перейди в папку и сделай dir (если умеешь).

>>500505

Так я и написал что bower — это когда у нас сложный фронтенд и кроме него еще куча всего есть. Профит от bower не только в автоматизации скачивания, но и репозиторий становится меньше и сразу видно где чей код. Анону, да, проще руками скачать.
#457 #500551
>>500547

>репозиторий становится меньше


Какая разница, если всё-равно это потом выкачивать.
#458 #500557
>>500551

Хорошая традиция класть в репозиторий только свой код, а не сторонний (легче разбираться, легче обновлять), соответственно composer и bower этому способствуют.

Раньше были антипримеры — если ты возьмешь любой фрйемворк или CMS 5-летней давности, то там пользовательский код и код фреймворка идут вперемешку, и нельзя фреймворк вынеси в vendor (исключение разве что ZF, но это потому что его писали умники).
#459 #500565
>>500557
Согласен. Но, мне кажется, это применимо для больших проектов. Не стоит его пихать в каждый скрипт.
64 Кб, 952x561
#460 #500567
Библиотека getid3 возвращает массив, в котором содержатся нехорошие буквы. Пикрелейтед.
У меня так json_encode умер. Сказал false, и положил пятерку (JSON_ERROR_UTF8) в json_last_error.
Что мне ему подсунуть в $id3->encoding, чтобы заработало? Я кроме utf8 не знаю других кодировок. Вернее, как они пишутся.
Там наверное какой-нибудь ascii.
#461 #500570
>>500565

Композер применим для любых проектов, тем более что установить его надо один раз. В маленьких проектах с ним репозиторий только аккуратнее выглдит.

Насчет bower, насколько я знаю, он скачивает библиотеки куда-то отдельно и тебе понадобится как минимум скрипт для их копрования, а может еще что-то (например скрипт для склейки). Но bower хорош тем, что он умеет управлять зависимостями. То есть если библиотекам A и B нужна C, он скачает и установит ее сам, и только один раз.

Анону наверно bower не требуется.

> для больших проектов.


Я думаю, не для больших проектов, а для проектов где есть система сборки фронтенда.
#462 #500572
>>500567

Не кодируй весь массив в JSON, а возьми из него только то, что надо.

> Что мне ему подсунуть в $id3->encoding, чтобы заработало?


Там бинарные данные (фрагмент файла), а не текст в неправильной кодировке.
#463 #500573
>>500567

Алсо, можно из этого сложного массива сделать объект MediaInfo с только нужными тебе полями и методами (очевидно объект удобнее массива, его можно передать в шаблон, вызывать методы и тд). И предусмотреть у объекта методы для экспорта/импорта из JSON.

А в массиве, который возвращает gitId3, структура непонятная, любые поля могут остутствовать и работать с ним не очень-то удобно.
#464 #500577
>>500570

>В маленьких проектах с ним репозиторий только аккуратнее выглдит.


Почему? Нет git файлов в корне?
#465 #500581
>>500577

Нет сторонних библиотек, только несклоько файлов с кодом самого проекта. При чем тут git файлы? Если ты хотел намекнуть на git submodules то они не для этого, не для подключения сторонних библиотек и они не альтернатива/замена композеру.
#466 #500606
>>497885

> проверьте про гамбургеры задание.


Проверяем.

Мне не нравится, как сделан класс. Смотри, какие свойства есть у гамбургера?

— тип (маленький/большой)
— начинка (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 это язык для написания хранимых процедур, он не нужен чтобы создавать таблицы, но на сайте оракла есть мануал и по нему.
#466 #500606
>>497885

> проверьте про гамбургеры задание.


Проверяем.

Мне не нравится, как сделан класс. Смотри, какие свойства есть у гамбургера?

— тип (маленький/большой)
— начинка (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 это язык для написания хранимых процедур, он не нужен чтобы создавать таблицы, но на сайте оракла есть мануал и по нему.
#467 #500615
>>497949

Если ты платишь за обучение, то это явно не рубиконтора а попытка развести на деньги. Нормальные компании если и берутся кого-то обучать то платят стипендию (яндекс, дойче банк и другие).

>>497959
>>497973

> &&$month==1) {


Слишком сложно. Начальный платеж проще всего добавить к сумме перед циклом.

> $creditBalance=($creditBalance × $percent ) + $servicePayment


это повторяется 2 раза, избавься от повторов (если перенести начальный платеж, как раз избавишься)

> if($creditBalance>$monthlyPayment) {


> $creditBalance=($creditBalance × $percent ) + $servicePayment - $monthlyPayment;


Тут неточность. Ты должен сначала добавить процент и комиссии, а потом сравнивать, а ты сравниваешь баланс до добавления процента/комиссии.

Из-за этого ты получашеь неправильный ответ. Во втором банке должно быть около 61270.

Насчет выбора банка, хороший способ это отсортировать массив, тогда можно будет вывести лучший банк, второй и третий по цене. Твои варианты тоже годятся.
#468 #500618
>>498022

Только на документацию 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



это надо исправить, надо сначала что-то присвоить переменной, а потом ее использовать.

> На код в учебнике не смотрел вообще специально,


И правильно сделал, так как он с ошибкой.
#468 #500618
>>498022

Только на документацию 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



это надо исправить, надо сначала что-то присвоить переменной, а потом ее использовать.

> На код в учебнике не смотрел вообще специально,


И правильно сделал, так как он с ошибкой.
#469 #500625
>>498175

> [^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
#469 #500625
>>498175

> [^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
#470 #500635
>>498384

Молодец, верно.

>>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
#470 #500635
>>498384

Молодец, верно.

>>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
#471 #500639
>>498552

> Вот я захотел узнать, как подменить урл в запросе.


> Дальше-то что? Как мне здесь что-то найти?


Ты ищешь в гугле «как подменить 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
— что такое редирект
#471 #500639
>>498552

> Вот я захотел узнать, как подменить урл в запросе.


> Дальше-то что? Как мне здесь что-то найти?


Ты ищешь в гугле «как подменить 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
— что такое редирект
#472 #500648
>>500639
Вас там двое, или ты забываешь и по два раза отвечаешь на одни и те же вопросы?

>Могу посоветовать какой-нибдь учебник по сетевым технологиям для вузов.


О, давай.
Я скачал пока информатику Грошева. Еще советуют Седжвика, но не знаю насколько он продвинутый, и примеры там на c++.
#473 #500649
>>498552

> Потом в планах перенос процесса загрузки на хрупкие плечи аякса


А ты яваскрипт изучил? Если нет, то придется начать с основ. У нас кстати и задачки на него есть, много.

>>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 не видел ни в одном проекте. Так как понять используется код или нет, трудно, его никто никогда не удаляет, а только добавляет.
#473 #500649
>>498552

> Потом в планах перенос процесса загрузки на хрупкие плечи аякса


А ты яваскрипт изучил? Если нет, то придется начать с основ. У нас кстати и задачки на него есть, много.

>>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 не видел ни в одном проекте. Так как понять используется код или нет, трудно, его никто никогда не удаляет, а только добавляет.
#474 #500650
Не могу разобраться со случайным выводом элемента из массива.

Вот нашел такой пример

<?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]]
нуль и единица
#475 #500653
>>499348

Ошибка в чем-то другом.

>>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 и более.

Также, браузеры не очень качественно уменьшают картинки, а если на странице много масштабированных картинок то некоторые бразеры еще и тормозить начинают (распаковка картинок не бесплатная).

Ну и наконец сложно ли сделать превьюшки? да это несколько строчек кода и полчаса работы. Стоит ради этого ухудшать жизнб пользователям? Конечно нет.

Ну и так как вы начинающие то вам все равно надо учиться это делать.
#475 #500653
>>499348

Ошибка в чем-то другом.

>>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 и более.

Также, браузеры не очень качественно уменьшают картинки, а если на странице много масштабированных картинок то некоторые бразеры еще и тормозить начинают (распаковка картинок не бесплатная).

Ну и наконец сложно ли сделать превьюшки? да это несколько строчек кода и полчаса работы. Стоит ради этого ухудшать жизнб пользователям? Конечно нет.

Ну и так как вы начинающие то вам все равно надо учиться это делать.
#476 #500654
>>499708

То есть, я хочу сказать что сделать превьюшки (если ты знаешь как и написал или нашел библиотеку для этого) несложно. Ты же просто боишься или ленишься изучать новое и начинаешь придумывать причины почему этого можно не делать.

>>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

надо бы пролистать по диагонали.
#476 #500654
>>499708

То есть, я хочу сказать что сделать превьюшки (если ты знаешь как и написал или нашел библиотеку для этого) несложно. Ты же просто боишься или ленишься изучать новое и начинаешь придумывать причины почему этого можно не делать.

>>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

надо бы пролистать по диагонали.
#477 #500655
>>500405

> Как реализовать "вложенность" шаблонов? У меня есть несколько шаблонов для разных типов файлов.



Способ 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/
#477 #500655
>>500405

> Как реализовать "вложенность" шаблонов? У меня есть несколько шаблонов для разных типов файлов.



Способ 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/
#478 #500656
>>500648

О, еще это есть: 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 в западных вузах. То есть книга мирового уровня. Но ее лучше читать после алгоритмов, а то слишком сложно будет.
#479 #500657
>>500650

мануал читал? http://php.net/manual/ru/function.array-rand.php

2 значит выбрать 2 случайных ключа и вернуть массив с этим 2 ключами

0, 1 берут первый и второй ключи из этого массива

попробуй сделать var_dump($rand_keys); и увидишь
#480 #500658
Кого я пропустил, напомните о себе

Тебя: https://github.com/V3N0m21/StudentList я по моему уже проерял? Последний коммит 5 дней назад ведь

Тебя: https://github.com/nsdvw/file-sharing/commits/master проверю чуть позже, делай задачу дальше, а если все сделал то бери следующую
#481 #500691
>>500658
Меня => >>498356
#482 #500695
Чет эта Id3 какая-то глючная. На некоторых видосах 1000 fps показывает. Хотя в других прогах все норм выдает.
Анальный Каратель #483 #500706
учил паскаль и с++ уровня сортировки массивов и оконных сортировок массивов, код php довольно прост на первый взгляд, сколько времени потребуется изучать до первого минимального зароботка? хотябы 50$ в месяц.
и надо ли в обязательном порядке паралельно изучать бд?
#484 #500712
>>500706

Чувак, я зная только HTML и CSS на базовом уровне за две недели около 750$ заработал. Так что все в твоих руках.
#485 #500721
>>500712
пруфи или пиздабол?
#486 #500732
>>500721
>>500721
Бомбит штоле? Расслабься, норм рейт на удалёнку - 25-35 баксов на фуллтайм. Это с опытом хотя бы год. Так что 1500 в месяц - это хуйня еще.

Мимо-вордпрессомакака
#487 #500735
>>500732

>25-35


>Вордпресс


Выбери одно.
55 Кб, 622x474
#488 #500742
>>500721

Да пожалуйста. Правда тут не все видно, ну да похуй. Просто копировал сайты с помощью проги специальной и потом всякие HTML теги ненужные удалял и все следы того, что этот сайт пизженный. Работа - не бей лежачего, в день часика 3 уходило. Жаль только потом у их фирмы какая-то хуйня случилась и вся эта лафа закончилась.
#489 #500757
>>500742
А фронтенд тоже копировал?
#490 #500763
>>500757

Дык там суть то во внешнем виде и была. Прога эта качала кучу HTML страничек, которые я прогонял через несколько регулярок в NotePad++ и потом еще руками доправлял что осталось.
Анальный Каратель #491 #500765
>>500712
Тоесть помимо php надо много чего знать, благо ооп более менее понимаю.
Для норм работы надо знать HTML 5 CSS PHP MySQL, Java Script все так?
Можно какую то технологию изключить?
Что если ограничится PHP? или это никому не нужно?
HTML + PHP думаю полюбому осилю, CSS маст хев? жабу пока не хочу трогать вообще.
Посоветуйте маст хев и пару учебников
#492 #500773
>>500765

HTML + CSS вместе учатся, там особо осиливать нечего. PHP, JS и MySQL хотя бы на базовом уровне знать надо, чтобы джуном устроиться. А там уже дальше будешь плясать в ту сторону, которая тебе больше понравится. Java тебе тут по сути вообще не нужна будет, т.к. она не особо под веб заточена.
#493 #500782
Зачем мы сообщаем браузеру, в какой кодировке сохранена страница? И вообще, по какому принципу разделяются разные кодировки?
#494 #500785
>>500782
Легаси, сэээр.
Всё пишем в 1251 и в заголовок документа ставим её же.
#495 #500787
>>500785

>21/06/15 Вск 14:56:57


>1251


у-у-у
56 Кб, 500x683
#496 #500793
>>500765
Ну смотри, кажется на первый взгляд что это много-много всего, но это совсем не так.
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, писать там тонны кода нинужна в большинстве своем.

как-то сумбурно вышло, пойду поем лучше
#497 #500800
Сколько времени всреднем от ехо "хело ворд" до реальной роботы в этой сфере?
#498 #500804
>>500800
Где-то 6 месяцев, если будешь каждый день решать задачки.
#499 #500806
>>500800
две-три нидели.
через месяц будеш заробатывать 1500 долларов
#500 #500807
>>500800
Два дня и уже можешь рассчитывать на $3к
#501 #500828
>>500763
Это какие-то мошенники у тебя заказывали? Уводили акки таким образом?
#502 #500829
>>500793

>но это совсем не так.


Ой, а почему сайт на хостинге не запускается?
Ой, что значит Error 503?
Magento? Разберусь, я с подобным работал (wordpress).
Ой, как это хостинге на линуксе?
git push --force
#503 #500839
>>500829
Но ведь всё это гуглится за 30 секунд.
кроме магенты впрочем, любой вопрос по ней тоже гуглится за 30 секунд
#504 #500842
>>500807
>>500806
Я знал что здеся только успешные люди и программирование это золотая жила
Спасибо
#505 #500843
>>500839
Гуглится за 30 секунд, чтобы разобраться - 3 часа. Впрочем, попасть в контору, где ты будешь править хедеры в вордпресе это не помешает.
#506 #500855
Как правильно настроить виртуальный хост?
Например у меня не подключаются стили, если они не лежат в корне сайта.
Работает:
public_html/index.php
public_html/css/style.css
Не работает:
public_html/folder/index.php
public_html/folder/css/style.css
Выдает forbidden, стили не подключаются.
#507 #500865
>>500855
Какой у тебя сервер?
#508 #500866
>>500865
Апач на убунту.
#509 #500868
>>500866
Вручную большой гемор делать это: https://www.digitalocean.com/community/tutorials/apache-ubuntu-14-04-lts-ru

Я делаю через LAMP-stack, там есть админка, где всякие операции вроде виртуального хоста в пару кликов делаются.
#510 #500869
Кароч, codepad.org/UOaOEgAW что-то я туплю, не пойму, что здесь надо делать.
#511 #500870
>>500843
Стоп, ты сейчас серьезно?
Тебе серьезно надо 3 часа, чтобы понять что такое 503, как развернуть nginx,php, mysql и настроить порты на vps и подобное?
Я уж молчу о том, что видео гайд по гиту занимает полтора часа, где всё показывают и объясняют для совсем уж тугих ребят.

Тут на все эти задачи суммарно 3 часа не надо, сириусли.
#512 #500872
>>500868
Спасибо за ссылку конечно, но я именно по ней и настраивал хосты.
Видимо нужно прописать еще что-то дополнительное, не знаю только что и по какому слову это гуглить.
#513 #500873
>>500870
Двачую, бро, я на wp могу сайт за пять минут сделать, пока эти бараны полгода учат свой симфони, лол.
#514 #500875
>>500828

Не знаю, может быть и мошенники. Но мне как-то похуй было если честно, т.к. за такую ерундовую работу платили они очень щедро. Чувак кстати русский был, но жил в США, поэтому и платил долларами.
#515 #500876
>>500870
Кек, ты или гений, или не сталкивался с чем-то сложнее хоумпейджа.

>гайд по гиту занимает полтора часа


И потом такие пишут push --force, ведь они всё схватывают не лету.
#516 #500877
>>500875

>может быть


Кек, а ты не задумывался, кому ещё может понадобиться копия чей-то страницы?
#517 #500878
>>500873

Но ведь если WP удовлетворяет требованиям по сайту, то почему бы на нем сайт не сделать по-быстрому?
#518 #500880
>>500877

Я не знаю, что они там спиздить могли, т.к. копировал я в основном какие-то обосанные сайты времен веб 1.0.
#519 #500882
>>500878
- Интернет магазин? Наш специалист предлагает сделать его на движке Вордпресс? Слышали про такой? На нём ещё википедия работает. Будет корзина, аджакс. Как бонус - делаем админку.
#520 #500884
>>500880
Копируют дизайн, делают похожий домен, рассылают спам-письма с просьбой что-то там на сайте сделать - воруют логины, пароли, куки, аллаха.
#521 #500885
>>500882
Работал в такой конторе, менеджер продавал клиентам эту самую админку, возможность загружать не только jpg но и gif. Отлично расходились слайдеры, вип-клиентам продавал бекграунд-видео, и всё это по цене, за которую обычные макаки делают целый сайт. Менеджер от бога.
#522 #500886
>>500882

Но интернет-магазин лучше на специализированной CMS делать, например Opencart. И если клиента все устраивает и он готов за это платить, то в чем проблема?

>>500884

А, ну может быть, хз. Мб их повязали там в итоге, лол. Ну я подозревал, что там явно что-то не чисто. Но лишние вопросы не задавал.
#523 #500888
>>500873
>>500876
Ребята, вы конечно извините, но у вас РЮСКЕЙ ДУХ приключился, когда если кто-то может это сделать, то у вас ВРЁТИ, ВСЁ ВРЁТИ, ТЫ ИЛИ ГЕНИЙ ИЛИ ПИЗДИШЬ ПИДАР. Знаете, такое желание доказать что вам врёти и опустить человека с которым вы в чем-то не согласны.

Но реально, в этих задачах нет ничего сложного. Скорее всего вы просто до этого слабо с пекой были знакомы, поэтому они и показались вам сложными.
#524 #500890
>>500886

>И если клиента все устраивает и он готов за это платить, то в чем проблема?


Ни в чём, только мы же говорим про работу девелопером, а делать месяцами магазины на ВП - плохая практика.
#525 #500891
вы заебали кормить долбоеба, мне потом скроллить это говно в поисках наставлений пророка-опа
#526 #500892
>>500888

>Скорее всего вы просто до этого слабо с пекой были знакомы


У меня в офесе сидят такие стажёры, 2-3 часа ищут, как строчку в хедере престашопа поменять. Ты сейчас, получается, назвал их всех отсталыми?
#527 #500893
>>500890

Что плохого? Не все такие дохуя амбициозные и хотят быть супирпупирпогромистами, разрабатывая какие-то архисложные системы. Для некоторых это просто способ заработка и ничего более.
#528 #500896
>>500893
Ну мы как бы в pr, а не в web или biz.
#529 #500897
>>500893
Не встречал пока таких. Все знакомые погромизды хотят работать в гугл, учат всякие там node.js, angular, ruby, бутстрап в бутстрапе, хероку, бигдата, и всё это на 1-м году работы.
19 Кб, 344x250
#530 #500898
>>500897
И не могут написать FizzBuzz
#531 #500900
>>500892
Не знаком с пекой - отсталый?
Перестань бросаться в крайности как школьник. Я говорю что они слабо знакомы с пекой и гуглом в целом, может они до этого ничего кроме рутрекера и вконтача не видели в интернетах то, ну уровень знания пеки как у пользователя обычного и только недавно начали всё постигать.

Просто я сказал со своего опыта о том, что это задачи легкие и как по мне странновато что кто-то тратит на них по 3 часа. Кто-то вон и генту ставит неделю, хотя там такой хендбук, что с первого раза поставить можно без проблем.
#532 #500902
Эй, мастера вордпердесса с зп 10к$ и гугления за 10 секунд.
Мне надо определить, с какого браузера пришел юзер.
Как правильно распарсить строку, которую возвращает HTTP_USER_AGENT?

Там какое-то говно типа Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36

Как здесь понять, хром это или мозилла?
#533 #500903
#534 #500904
>>500896

Ну да в принципе, ты прав. Но темы явно родственные.

>>500897

Ну вот я не хочу работать в гугл. Вернее я себя вообще в роли рядового погромиста не вижу, но при этом хочу работать в IT сфере. В идеале конечно свой бизнес начать. Но понятное дело, что какое-то время все равно придется в офисе поработать и опыта поднабраться, а так же денежек.
#535 #500905
>>500903
Иди нахуй, даун, я оттуда и скопировал пример.
#536 #500906
>>500900

>Я говорю что они слабо знакомы с пекой и гуглом в целом


Как там в 2010? Алсо, я не часто встречаю людей, которые впитывают информацию с первого раза и безошибочно её делают, поэтому твои заявления про 30 секунд на разобраться в ошибке - прикрытое бахвальство.
#537 #500908
>>500905
Дебила кусок, там же написано, какой это браузер.
#538 #500911
>>500908
Мудак ебаный блять, как мне в коде распарсить эту строку и определить браузер?
#539 #500913
Зачем вы засрали тред своим срачем?
#541 #500916
>>500913
хуй с ним, все равно новый пилить пора
1234 Кб, 1306x1062
#542 #500921
>>500906
Я вот честно тебя спрошу - что ты пытаешься доказать? Какое хвастовство, о чем ты? На анонимной борде? Да этот тред уплывёт через несколько часов и ты никогда не узнаешь кто я и где, а я не узнаю про тебя. В этом смысла даже никакого нет, я уже не школьник на летних каникулах, а давно реализовавший себя человек, который кстати частенько в разделе помогает, а не просто троллит про раби.

И да, я ещё тот дигрод, на форчане и реддите с пруфами сидят вчерашние школьники, которые за пару лет смогли стать такими крутыми что пошли на интернатуру в гуглы, фейсбуки и уберыа потом и на работу, прошли собеседование в несколько часов по алгоритмам и другим вещам, а ты мне о сложности гита и смены строчки в хедере вордпресса.

Вот и думай теперь, на этом и закончим.
#543 #500922
>>500921
Извини, но твой поток сознания невозможно читать. Стареешь небось?
#544 #500923
Посоветуйте модный CSS-шаблонизатор, чтобы можно было как-то так писать:
.parent {
.child_1 {
...
}
.child_2 {
...
}
}
#545 #500924
#546 #500927
>>500923
SASS гугли
#547 #500928
>>500924
>>500927
SASS > моча > LESS
#548 #500929
>>500928
Спасибо
#549 #500931
>>500928

Почему?
#550 #500933
>>500923
Не спеши это использовать, даже гиганты вроде facebook и twitter обходят их стороной. Там недостатков не меньше, чем преимуществ.
17 Кб, 315x269
20 Кб, 348x236
#551 #500952
Какой ФиззБазз более лучший -- левый или правый?
#553 #500969
>>500952
В обеих ошибка. Вместо echo $i нужно echo $str.
#554 #500972
>>500952
for($i=1;$i<=100;++$i){echo (''==($x=($i%5==0?'Fizz':'').($i%3==0?'Buzz':''))?$i:$x).'<br>';}
#555 #500976
>>500969

>Вместо echo $i нужно echo $str.


Только в первом.
#556 #500979
>>500964
При твоём решении возможны ситуации, когда делимость на три проверяется дважды, а это не круто.
#557 #500980
>>500979

>а это не круто


Почему?
#558 #500983
>>500980
Не оптимально.
#559 #500985
>>500983
Зато коротко и стильно.
#560 #501093
>>500735
Сосни хуйца, девочка.
#561 #501140
Пацаны, оп не вернулся же еще? Он нигде вопросы для собеседования не оставлял? Не для Джуниора, на среднюю позицию.
#562 #501141
>>500742
Чувак скачивал сайты через программу наподобии Teleport, и потом убирал следы того что это телепорченая поебень. Для простых сайтов без бэкенда, на html+css+js, это работает отлично. Так к примеру можно выкачивать демки платных макетов(правда многие сайты знают как распозновать подобных пиратов и банят по ИП за это). Но если сайт имеет сколь либо весомый бэкенд, то в результате получается хуита.
Так что тут либо анон наибал тех горе клиентов, либо горе клиенты наебывали сами себя.
#563 #501144
>>500869
Тебе необходимо добавить сверку роста уже вызываемых одноклассников с ростом анона и сделать так чтобы код подсчитал количество одноклассников что оказались выше Анона.
Анальный Каратель #564 #501157
>>500793
Спс няша, схороню и буду по твоему алгоритму изучать, сначала надо верстку осилить, думаю там все просто. Верстка же это уже какой никакой доход?
А вот как учить? книжки справки? и что будет лучше книжка типа C++ Язык программирования или C++ за 28 дней?
Кстати Я выбрал веб потому что думаю что в C++ надо скилл немного больше, и портфолио годное что по времени долго будет, думаю вкатится в веб, а там уже может и еще че.
#565 #501168
Пилю превьюшки для файлообменника и столкнулся с такой проблемой. Прозрачность нихуя не поддерживается и вместо прозрачных пикселей чернота. ЧЗХ?
#566 #501212
>>500782

Кодировка это таблица которая говорит какой символ каким кодом обозначается. Соответственно русская буква А например в разных кодировках обозначается разными кодами. Например:

в 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.
#567 #501230
>>500855

Права на файлы поставь 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

Поддерживается, просто по умолчанию ты создаешь изображение с черным фоном и на этот черный фон накладываешь прозрачную картинку. Надо создавать изначально прозрачную картинку, плюс там есть несколько опций для управления прозрачностью при рисовании и сохранении.
#567 #501230
>>500855

Права на файлы поставь 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

Поддерживается, просто по умолчанию ты создаешь изображение с черным фоном и на этот черный фон накладываешь прозрачную картинку. Надо создавать изначально прозрачную картинку, плюс там есть несколько опций для управления прозрачностью при рисовании и сохранении.
#568 #501238
>>501230

>Поддерживается, просто по умолчанию ты создаешь изображение с черным фоном и на этот черный фон накладываешь прозрачную картинку.



А чего он не белый? Было бы логичнее. Хотя в принципе уже похуй, т.к. довольно быстро нагуглил решение и теперь все норм работает.
#569 #501244
>>501238

Потому что нули в картинке обозначают отсутсвие свечения, а память под новую картинку видимо заполняетя нулями.
#570 #501454
Чёт я охуел от вакансий на фронтэнд, вот тут пишут про 75к в месяц для обычной хтмл макаки http://brainstorage.me/jobs/30817
#571 #501464
>>501454
Нет, там ищут не обычную макаку, а

>опытного HTML верстальщика


Это значит минимум год опыта (не решения детских задачек от опа, а реальных проектов), и безошибочное быстрое исполнение.

>Оптимизировать загрузку страниц;


Ты в курсе тонкостей кэширования?

>Валидная кроссбраузерная верстка


Ты досконально знаешь особенности каждого браузера?

>Точное соответствие макетам


>Responsive-вёрстка под iOS/Android;



Нелохая вакансия, профессионалам действительно хорошо платят.
54 Кб, 1280x729
#572 #501468
привет пыхач, надеюсь, ты еще не умер! у меня проблема которую не могу решить целый день. собственно проблема в создании выпадающего списка в форме информация в которую будет поступать из базы данных. просмотрел много видеоуроков, аопросов и ответов на форумах и того подобного, но так ничего и не получилось. Сейчас в тупике потому, как не знаю как же правильно написать код, чтоб все работало. Надеюсь, здесь найдется знающий анон и поможет, возможно просто у кого-то был опыт создания вып.списков.
#573 #501470
>>501468
извиняюсь за отвратное письмо, всю ночь не спал.
#574 #501471
>>501468
смотрел как тут парни делали. Пытался сделать так же как и у них (http://www.cyberforum.ru/php-database/thread1194083.html), но нихуя не пашет в обоих вариантах
#575 #501472
>>501468

Да там ничего сложного же. Получаешь из базы массив со всеми элементами и затем его через цикл foreach выводишь.
#576 #501475
>>501472
в том то и дело, что своим опухшим уже мозгом я понимаю, что ничего сложного. получаешь значения из таблицы выводишь их через цикл, и вроде много информации и все пытаюсь сделать правильно, но ничего не выходит
#577 #501477
>>501468
может у кого- то есть опыт с выпадающими списками и вы можете пояснить мне. только не в двух словах потому, что толку не будет. Возможно, есть какой-то работающий пример, с которого я раздуплюсь?
#578 #501478
Ну скинь свой код, скажу что не так.
#579 #501480
#580 #501481
>>501478
сейчас. но боюсь, там вообще ничего нет правильного =(
#581 #501483
>>501478
https://jsfiddle.net/7272pzb0/ php закинул в html форму
#582 #501497
>>501483
Это неправильно
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. Потому что вопросы постоянно будут возникать.
В оп-посте есть ссылки на хорошие статьи для начинающих, где последовательно все излагается.
#583 #501501

> http://archive-ipq-co.narod.ru/


То ли тамошняя подача материала плохая, то ли задачи составляли по пьяни, то ли я тугодум необучаемый. Есть какая-нибудь книжка по PHP, чтобы все подробно, разжеванно и с большим количеством примеров?
#584 #501504
>>501501
Нет такой книги. Если тебе даже детский учебник из оп-поста кажется сложным, то лучше не стоит вскрывать эту тему.
Серьезно. Дальше будет в десять раз сложнее.

Ну попробуй вот это http://www.ozon.ru/context/detail/id/30957824/
Хотя тоже далеко не идеально, но лучше ничего нет.
46 Кб, 1276x955
#585 #501505
Поясните за шаблонизаторы.
Изучаю сейчас phalcon, пикрелейтед кусок шалона с использованием volt и без, в чем принципиальная разница?
#586 #501511
>>501504

>Серьезно


Наверное так и есть. Печально. Скажи хоть, как здесь http://codepad.org/DUbYE5tP надо было сделать расшифровку с помощью array_flip()?
#587 #501537
>>501511
Не понял, это вопрос? Ты же сам ответил. Да, поменять местами ключи массива со значениями при помощи 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

> то ли задачи составляли по пьяни


Не, автор этого учебника - извращенец, который любит головоломки, сидеть над задачей по несколько часов. Он думает, что это всем нравится.
Задачи там часто с подвохом, на логику, а не на знание простой теории, но зато материал объясняется как по мне вполне доходчиво.

И я подозреваю что ты пропускаешь материал. Ты точно решил задачи про генератор имен, на рост одноклассников, про айфон в кредит?
Задания нужно решать последовательно.
#587 #501537
>>501511
Не понял, это вопрос? Ты же сам ответил. Да, поменять местами ключи массива со значениями при помощи 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

> то ли задачи составляли по пьяни


Не, автор этого учебника - извращенец, который любит головоломки, сидеть над задачей по несколько часов. Он думает, что это всем нравится.
Задачи там часто с подвохом, на логику, а не на знание простой теории, но зато материал объясняется как по мне вполне доходчиво.

И я подозреваю что ты пропускаешь материал. Ты точно решил задачи про генератор имен, на рост одноклассников, про айфон в кредит?
Задания нужно решать последовательно.
#588 #501542
>>501497
правильное подключение. создавал отдельно файл , подключался с помощью test_db.php, выводил таблицы в массив, а вот как вывести в сам Select я не знаю
#589 #501550
>>501497
сталкивался с PDO и очень понравилось, смотрел manual, но там не очень все понятно, попытался использовать и были ошибки. если знаешь где можно почитать толково про PDO, то скажи, пожалуйста, мне это очень пригодиться.
#590 #501553
>>501497
но мне кровь из носу нужно сделать выпадающий список. Если знаешь как, то растолкуй. ща попробую исправить то , что ты заметил у меня.
#591 #501558
>>501550
http://phpfaq.ru/pdo
Я по этой статейке начинал знакомство с PDO.

мимо
#592 #501562
>>501501
http://www.ozon.ru/context/detail/id/24901491/
Попробуй это. Есть на рутрекере.
#593 #501563
>>501501
А ещё есть codecademy.com
#594 #501569
>>501562
Доставляют восторженные отзывы быдланчиков:

>Практически сразу идет ознакомление с phpMyAdmin, вкратце с языком SQL и PHP и сразу мастерим небольшую страничку с применением БД. "Воды" практически нет


А потом эти ебланы засирают форумы с вопросом "чо у миня не работает echo, памагите".

Хотя я и сам недалеко ушел, сказать по правде.
Хочется видеть хоть какой-то результат своих трудов, нет сил уже обмазываться теорией с хелловорлдами.
21 Кб, 400x327
#595 #501572

>От новичка к профессионалу


>384 стр.


>1198 руб.

#597 #501580
>>501569

>Доставляют восторженные отзывы быдланчиков:


>>Практически сразу идет ознакомление с phpMyAdmin, вкратце с языком SQL и PHP и сразу мастерим небольшую страничку с применением БД. "Воды" практически нет


>А потом эти ебланы засирают форумы с вопросом "чо у миня не работает echo, памагите".


>


Хоть в книге и знакомят с пхпмайадмин, таблицы там создаются вручную.
#598 #501583
>>501576
Если ты уже хорошо знаком с синтаксисом пхп, то почитай. В оп-посте ОП её советует.
#599 #501585
>>501580

Кстати, а чем плохо создание таблиц вручную?
#600 #501587
>>501576
Хорошая книга, но не для начинающих.

Нету книг для начинающих. Смиритесь с этим.
В книжках типа "PHP за неделю!" вам покажут пару фокусов, которые будете копипастить до конца своих дней, не понимая значения. К тому же большинство из них устаревшие, как ни странно даже книги 2013-2015 года используют устаревшие подходы.

Есть разрозненные статьи. Есть видеоуроки разной степени убогости.
Курс от учебного центра "специалист" еще с натяжкой можно назвать неплохим.
Ведет шустрый мужичок по имени Игорь Борисов, портрет коего красуется в шапке данного треда.
Объясняет неплохо, информация излагается последовательно.
Но примеров мало, и они не наглядные.
Длительность более 50 часов, можно умереть от скуки в процессе просмотра.
Есть на nnm.club, с рутрекера выпилили копиразды.
#601 #501590
>>501585
Ничем. Кто сказал, что это плохо?
На всякий случай: под "вручную" я подразумевал "не через графический интерфейс".
#602 #501591
>>501587

>Нету книг для начинающих. Смиритесь с этим.


А как же эта? >>501562
#603 #501596
>>501587

>шустрый мужичок по имени Игорь Борисов


Кстати, что у него с голосом, никто не знает?
#604 #501600
>>501590

Да хуй знает, где-то слышал пару раз, что мол через phpMyAdmin только нубы создают, Ъ пацаны пишут километровые запросы. Правда так и не сказали почему.
#605 #501610
>>501591
Кал собачий.
Но может для старта и сойдет. Как легкое введение в веб-разработку. Но научить такая книга ничему не может. Хотя да, написать пару простых сайтов, скопировав оттуда код, можно.

>>501600
Может потому что на рабочем сервере нет ни phpmyadmin, ни браузера, ни значка "мой компьютер"? Как же сука к себе в папку-то попасть?
#606 #501612
>>501596
Хз, курил наверно много.
#607 #501614
>>501610

>на рабочем сервере нет ни phpmyadmin



А, ну в этом случае то понятно все. Я просто думал какие-то еще причины есть помимо невозможности использования GUI.
#608 #501627
>>501614
Помимо этого есть еще такие вещи как компетентность и профессионализм.
Представь себе, что тебя будет лечить врач, который только и умеет, что измерить давление при помощи аппаратика, который надевается на руку, и прописать таблетки в случае отклонения от нормы.
Наверное, врачу тоже не нужно знать биохимический состав крови, классификацию сердечно-сосудистых заболеваний, причины образования тромбов и т.д. А нахуя, если есть вот та хуйня, которая измеряет давление?

Зачем физикам, которые работают на андронном коллайдере знать таблицу умножения, епты? В двацать первом веке живем, можно и на калькуляторе перемножить 7х8.

зачем нужна знать руский езык, я чо в школе нахуй?

Ничего не нужно знать. Ведь есть phpmyadmin.
#609 #501635
>>501627

Ты перед тем, как сортиром воспользоваться тоже его устройство изучаешь? Проблемы надо решать по мере поступления, а то велика вероятность того, что к тому времени как тебе знания понадобятся ты уже все забудешь нахуй. Хотя конечно общее представление о том, как оно все работает иметь не помешает.

Алсо, проиграл от сравнения макакокодеров с врачами и физиками. Это совсем разные уровни, аналогия неуместна.
#610 #501646
>>501635

>Ты перед тем, как сортиром воспользоваться тоже его устройство изучаешь?


Это демагогия: ты подменяешь пользователя и производителя. Для пользования сортиром не нужны знания (и сортир не нужен, потому что есть лифт и подъезд). Для проектирования санузлов и канализации знания нужны.

>сравнения макакокодеров с врачами и физиками


Да, макакокодеров сравнивать с врачами и физиками неуместно.
Профессиональных программистов - уместно.
(Программист - это тот, кто программирует. Макакокодер - кто подражает программисту, заучивая последовательность нажатий кнопок во всяких вордпрессах и пхпадминах)
#611 #501649
Начал учить Симфони по Симфонибуку.
Есть еще полезные ресурсы?
#612 #501650
>>501649
есть
#613 #501651
>>501537

> http://ideone.com/fqfogw


А ларчик просто открывался... Блин. Спасибо.

> извращенец, который любит головоломки, сидеть над задачей по несколько часов. Он думает, что это всем нравится.


Пиздец. Мне и так тяжело, тем более с моим-то характером, испсиховался и проклял все и вся, а он тут со своим головоломками.

> материал объясняется как по мне вполне доходчиво.


Местами, да, а порой тупо даётся кусок кода с никаким комментарием и предложение решить очередную задачу.

>пропускаешь материал


Рост одноклассников, да, ниасилил пропустил.

>нужно решать последовательно.



>>501563
Ну её. Моего английского хватает чтобы понять, но постоянная необходимость концентрироваться на правильности перевода, отвлекает от сути.

Ладно, попробую эту >>501504 книжку покурить, может лучше пойдёт.
#614 #501662
>>501650
Вуд ю кайндли?
#615 #501667
>>501646

Ну так я и пользуюсь пхпадмином, как обычным инструментом, типа молотка. Я конечно могу научиться как гвозди забивать с помощью камня, на случай если вдруг у меня молотка не будет, но пожалуй я не буду этого делать.

Нет, программистов любого уровня неуместно сравнивать с такими сложными профессиями как врач или физик. Как бы не выебывались некоторые кодерки, это совершенно иной уровень. Они просто нажимают кнопочки в определенной последовательности и ВСЕ. Даже мозг включать не нужно. Сравнивать это с работой какого-нибудь нейрохирурга это просто смешно.
#616 #501669
А ты сможешь пройти все 10 уровней?
https://blockly-games.appspot.com/maze?lang=ru
#617 #501672

>Они просто нажимают кнопочки в определенной последовательности и ВСЕ


Да, нужно уметь правильно нажимать кнопочки на клавиатуре, не прибегая к стороннему программному обеспечению типа графических интерфейсов.

>Даже мозг включать не нужно.


Нужно.

>Сравнивать это с работой какого-нибудь нейрохирурга это просто смешно.


Не смешно.
#618 #501684
>>501672

Но ведь если не использовать GUI, то ты превратишься в прыщавого пердолика. Как по мне, то слишком большая цена за то, чтобы называться программистом. Лучше уж буду макакой со здоровой кожей и активной сексуальной жизнью.
#619 #501695
>>501649
Ты вопрос задай корректно, тыжпрограммист.
>>501684
Я не говорил, что вообще не нужно использовать GUI (значение знаешь?). Нужно только понимать, надстройкой над чем они являются.

>если не использовать GUI, то ты превратишься в прыщавого пердолика


Не вижу связи.
И ты отчаянно толстишь, так неинтересно. Хотя спасибо, что помогаешь утопить тред. А то оп до 800 постов наверное будет ждать.
#620 #501697
>>501695
Оп не ждет конкретного колличества постов, ему просто нужно проверить все задачи и ответить на все вопросы в треде, прежде чем запилить новый. Поэтому перекат здесь это такая проблема.
#621 #501728
>>501697
Говорил, что пересоздаст после бамплимита. Картинки не окей. У меня от этой рожи сразу демотивация и анальный пожар от безысходности жизни.
#622 #501753
>>501649
А чем оф.документация плоха?
Нубы еще могут жаловаться на сложности в понимании документации, но если ты считаешь, что дорос до Симфони, то как бы уже пора остепениться.

Я нашел какой-то туториал у себя в закладках.
symfony.in.ua/symfony2-tutorial-for-beginners.html
Сейчас не могу почему-то перейти.
#623 #501849
Перекат где, бжлад. Надоело скролить вниз по три страницы на главной.
#624 #501866
>>501849
Зачем скроллить? Родина дала тебе каталог!
63 Кб, 400x300
#625 #501963
И я снова выхожу на связь так как спистя день ничерта не решил , вот код https://jsfiddle.net/Lsr8220a/ и проблема в выводе инфы из БД в выпадающий список. прошу помощи у знающего анона, да что там прошу, молю!
#626 #501965
>>501600
>>501590
>>501585
>>501580

Я знаю, что многие начинающие хотят использовать phpmyadmin потому что не хотят изучать SQL. Так не пойдет, мы тут готовим программистов, а не эникеев умеющих нажимать кнопки мышкой.

Начинающие должны создавать таблицы вручную, так как иначе они никогда не выучат SQL. Когда ты напрактикуешься, можешь пользоваться хоть пхпмайадмином, хоть чем хочешь. Я им не пользуюсь например, я вообще обнаружил что в большинстве случаев он бесполезен и нужную информацию быстрее найти написав запрос. Потому что когда у тебя в таблице миллионы записей и десятки колонок тебе эти табличка выводящая по 20 строк никак не помогает.

Форма в phpmyadmin в конечном счете создает запрос. Потому если ты не знаешь разных особенностей MySQL то ты не сможешь понять почему та или иная вещь не работает.

Наконец если в проекте используются миграции (а в любом нормальном проекте они используются, они есть и в Yii и в Symfony), то тебе надо будет писать запросы руками.

Я считаю, любой уважающий себя джуниор должен решить минимум 2 моих задачи на SQL (про лайки и про кинотеатр) иначе его незачем даже допускать к собеседованию (жаль работодатели так не всегда считают).

В общем, если ты можешь написать нужный SQL запрос бьез ошибок, можешь пользоваться хоть чем, если не можешь в твоих же интересах подучить SQL.
#627 #501968
>>501965
ОП. А ты можешь примерно хотя бы смоделировать собеседование?? Ну типо вопросов и тестового задания???
Хотябы в 3-х словах. Чтобы знать к чему готовится.
#628 #501969
>>501635

Умение создавать SQL таблицы запросом это базовое знание, без которого тебе в веб-разработке делать нечего. И я не понимаю, из-за чего так активно спорить, CREATE/ALTER изучается за 20 минут.

>>501728

Ок, в этот раз перекатимся чуть раньше чем обычно, но да, проверить задачи все равно надо.

>>501667

Перед пхпмайадмином надо выучить SQL. И разумеется надо создать руками хотя бы несколько таблиц.

>>501684

Не бойся, с таким подходом ты программистом все равно не станешь. Алсо, первый раз слышу что от программирования портится кожа, я думал она портится от плохого питания и ошибок в генах.

>>501849

Не закрывай наш тред и скроллить не придется. Я например не закрываю.
#629 #501971
>>501968

Я вряд ли угадаю что у тебя спросят. Но если у тебя 0 опыта то будут спрашивать:

— php: вопросы по особеностям языка, сравнение значений разных типов (что выведет var_dump("asad" == true); или $a = "aa"; $a++; echo $a;), вопросы по работе с массивами, строками, регулярками, может что-нибьудь заковыристое по особенностям ООП и наследования. Лучше всего перечитать мануал.

Спросят, какие фреймворки, библиотеки знаешь.

Могут дать несложную задачку типа таких: https://github.com/codedokode/pasta/blob/master/interview-tasks.md

— ООП, MVC: что это такое, инкапсуляция, наследование, полиморфизм
— базы данных: напишите запрос, расскажите про транзакции, внешние ключи, нормализацию
— JS: не знаю, спросят наверно какие библиотеки знаешь и может задачку дадут

В общем, если ты прошел все наши задания то наверно бояться особо нечего.
#630 #501975
#631 #501976
>>501971
Спс Оп.
#632 #501978
>>501971

Блять, нигде от этих дибильных задачек не спрячешься. Что они всем так нравятся, я понять не могу?
#633 #501979
>>501978

Решение задач это часть нашей культуры инженеров программного обеспечения. Мы любим задачки и головоломки.
#634 #501982
>>501979

Не понять мне вас. Я могу хоть неделю убить на решение РЕАЛЬНОЙ задачи и меня это ничуть напрягать не будет, но мне жалко даже 5 минут потратить на решение какой-то абстрактной задачки, которая все равно никогда не пригодится.
#635 #501987
>>501982

Все задачи которые тут есть, они все сделаны чтобы проверить знание какой-то вещи (а если ты не знаеь то помочь изучить). Также, задачи заставляют тебя писать код, сам понимаешь что теория без практики плохо усваивается.

Например задачи из учебника помогают запомнить использование определенных функций PHP, работу с массивами, регулярками, ООП. Задача на список студентов/файлообменник проверяет и помогает изучить умение работы с таблицами, формами.

Потому решение задач это часть обучения. Пригодится тебе не сама задача, а полученные знания. Реальные задачи решать ты будешь на работе, а пока учишься — решай учебные.

Ну и я не понимаю почему их считают «головоломками». На мой взгляд, все задачи у нас элементарные, я стараюсь их делать максимально простыми, такими что профессиональный программист их в уме за полминуты решит.
#636 #501989
>>501987

Да я вообще-то про собеседования говорил. Поначалу то понятное дело без них никак.

>Ну и я не понимаю почему их считают «головоломками».



Ага, особенно "Кошки-мышки" и рисование круга текстом ( или что-то подобное) вообще ни разу не головоломки, а стандартные задачи, которые каждый день решаются. Вот такую парашу я терпеть не могу. А против файлообменника ничего против не имею. Скоро его доделаю кстати и выложу на всеобщее обозрение. Правда я его на на Слиме делал, а на SimpleMVC, мне он гораздо больше понравился. Там из под коробки все что надо есть и практически ничего настраивать не надо.
#637 #501993
>>501989

> Ага, особенно "Кошки-мышки"


Эта задача проверяет умение раскладывать большую задачу на более маленькие и решать их (а также умение писать классы). На первый взгляд начинающему она может показаться нереально сложной. Но если приглядеться, то мы увидим что она разбивается на части:

— кошка и алгоритм ее движения
— мышка и алгоритм
— карта и алгоритмы проверяющие, свободна ли клеточка, кто кого видит
— класс игры, который создает карту и животных и ходит ими

Далее, алгоритм движения кошки или мышки может показать сложным. Но он тоже разбивается на части:

— получить список всех возможных ходов
— оценить каждый в баллах
— выбрать ход с максимальным числом баллов
— сделать этот ход

Я считаю это очень важное умение, раскладывать задачу на составляющие и делать простой и понятный код для сложных задач. На практике такое встречается часто, так как практически любой проект веб-приложения по объему в десятки и сотни раз больше. Те люди, кто не умеет раскладывать на составляющую, на работе начинают писать длинные неитаемые простыни кода, в которых часто возникают ошибки.

Если ты не работал с реальными проектами, то ты можешь этого не видеть, но я видел эти простыни кода не раз. Тем, кто их пишет, надо не программистами работать, а учиться сначала.

С чем я могу согласиться, так это с тем что к этой задаче нужны пояснения, как именно ее решать, чтобы то что я написал выше, было в учебнике.

Ну и даже на наших небольших задачах некоторые аноны умудряются скатиться к написанию простыней. Нет, этого я не одобряю.

> и рисование круга текстом ( или что-то подобное) вообще ни разу не головоломки, а стандартные задачи, которые каждый день решаются.


Ну это вообще мелочь, в цикле вывести буквы. Будем считать что эта задача проверяет твое умение реализовать данную тебе формулу в виде кода.
#637 #501993
>>501989

> Ага, особенно "Кошки-мышки"


Эта задача проверяет умение раскладывать большую задачу на более маленькие и решать их (а также умение писать классы). На первый взгляд начинающему она может показаться нереально сложной. Но если приглядеться, то мы увидим что она разбивается на части:

— кошка и алгоритм ее движения
— мышка и алгоритм
— карта и алгоритмы проверяющие, свободна ли клеточка, кто кого видит
— класс игры, который создает карту и животных и ходит ими

Далее, алгоритм движения кошки или мышки может показать сложным. Но он тоже разбивается на части:

— получить список всех возможных ходов
— оценить каждый в баллах
— выбрать ход с максимальным числом баллов
— сделать этот ход

Я считаю это очень важное умение, раскладывать задачу на составляющие и делать простой и понятный код для сложных задач. На практике такое встречается часто, так как практически любой проект веб-приложения по объему в десятки и сотни раз больше. Те люди, кто не умеет раскладывать на составляющую, на работе начинают писать длинные неитаемые простыни кода, в которых часто возникают ошибки.

Если ты не работал с реальными проектами, то ты можешь этого не видеть, но я видел эти простыни кода не раз. Тем, кто их пишет, надо не программистами работать, а учиться сначала.

С чем я могу согласиться, так это с тем что к этой задаче нужны пояснения, как именно ее решать, чтобы то что я написал выше, было в учебнике.

Ну и даже на наших небольших задачах некоторые аноны умудряются скатиться к написанию простыней. Нет, этого я не одобряю.

> и рисование круга текстом ( или что-то подобное) вообще ни разу не головоломки, а стандартные задачи, которые каждый день решаются.


Ну это вообще мелочь, в цикле вывести буквы. Будем считать что эта задача проверяет твое умение реализовать данную тебе формулу в виде кода.
#638 #501995
>>501993

Ну неужели нельзя то же самое делать с нормальными задачами, а не с этой фигней? Чтобы совмещать приятное с полезным.

Алсо, я знаю, что мне никогда не стать первоклассным программистом, т.к. у меня к этому способностей нет. Да если честно и желания тоже. Меня от одной мысли всю жизнь сидеть кодить в дрожь бросает. Конечно забавная фигня, но явно не стоит того, чтобы ей жизнь посветить. Но это один из самых лучших способов съебать из рашки на данный момент, так что придется поднапрячься.
#639 #502001
>>501995

Вообще, мне показалось что слишком близкие к реальности задачи будут скучными. Ты на работе их еще нарешаешься вдоволь.
#640 #502004
>>502001

Для меня наоборот. Я люблю работать и не люблю решать абстрактные задачки.
#641 #502005
>>502001

Ну а умение писать ООП код, оно универсальное, пишешь ты алгоритм поиска мышки или алгоритм расчета скидки.
#642 #502007
>>502004

Если у тебя есть желание, мы всегда можем изменить условие задачи под твои нужды. Например, если ты хочешь к файлообменнику какие-то фичи добавить или изучить определенную технологию. Или если ты хочешь сделать какое-то приложение, напиши и подумаем как это реализовать с использованием современных библиотек и практик программирования. Ну например если ты хочешь попасть на работу в компанию делающую интернет-магазины, может имеет смысл сделать какую-то связанную с этим задачу.
#643 #502010
>>502007

Да я сам себе задачи придумываю. Обмазал файлообменник теми фичами, которые считаю нужными и не стал делать те, которые считаю бесполезными. Например галерею делать не стал, зато запилил регу и прочие плюшки.
#644 #502013
>>502010

Я советую такие вещи обсуждать тут, так как можешь быть есть определенная библиотека или способ реализации той или иной фичи. Велосипедисты, не умеющие в гугл, никому не нужны.
#645 #502017
>>502013

Я же говорю, в SimpleMVC из под коробки почти все что нужно для небольшого сайта есть. Можешь глянуть функционал на http://simplemvcframework.com

Разве что капча убогая, пришлось гугловскую прикручивать.
#646 #502020
Котаны, проверьте плиз задачу про циклы и айфон в кредит, а то я аутист и текст задачи сначала не нашел, а теперь не могу понять, правильно ли у меня или нет.

http://ideone.com/lcM6Ne
https://github.com/Si0n/register3 #647 #502139
>>500691
>>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', а уже в шаблоне ты можешь на основании этой переменной присвоить значения трем переменным с классами.

> https://github.com/Si0n/register3/blob/master/reg.php#L41


> header( 'Refresh: 1.5; url=index.php?page=inspect' );


Что за странная конструкция? Редирект делается через заголовок Location. Если ты хотел так показать сообщение, то это плохая идея, так как пользователь мог например пойти налить себе чаю и не увидеть это сообщение. Сообщение об успешной регистрации лучше показывать после редиректа, чтобы оно никуда не исчезло. Для этого ты можешь добавить параметр в URL, например index.php?page=xxx&register=ok

> https://github.com/Si0n/register3/blob/master/reg.php#L43


> 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 (англ, но это можно найти и на русском)

Кружочки предназначены не для номеров страниц, а для надписей предыдущая/следующая, и у тебя они как-то странно смотрятся.
https://github.com/Si0n/register3 #647 #502139
>>500691
>>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', а уже в шаблоне ты можешь на основании этой переменной присвоить значения трем переменным с классами.

> https://github.com/Si0n/register3/blob/master/reg.php#L41


> header( 'Refresh: 1.5; url=index.php?page=inspect' );


Что за странная конструкция? Редирект делается через заголовок Location. Если ты хотел так показать сообщение, то это плохая идея, так как пользователь мог например пойти налить себе чаю и не увидеть это сообщение. Сообщение об успешной регистрации лучше показывать после редиректа, чтобы оно никуда не исчезло. Для этого ты можешь добавить параметр в URL, например index.php?page=xxx&register=ok

> https://github.com/Si0n/register3/blob/master/reg.php#L43


> 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 (англ, но это можно найти и на русском)

Кружочки предназначены не для номеров страниц, а для надписей предыдущая/следующая, и у тебя они как-то странно смотрятся.
#648 #502141
>>501963
Так в чем конкретно ошибка?
Кроме того, что список нужно выводить в цикле (там, где у тебя сейчас какой-то <p>Запись id=) и того что ты используешь устаревшее расширение mysql, все должно работать.
Только не в jsfiddle, который не понимает языка php, а на твоем локальном сервере.
Что у тебя установлено? Какой-нибудь денвер или wamp? (Есть подозрения, что ничего, и ты ожидал что оно заработает на jsfiddle)
Иди установи wamp, после чего скопируй файлы проекта в директорию c:\wamp\www\projectName (вместо projectName пиши название папки, в которой лежит index.php твоего проекта. Файл должен быть именно с расширением php, не html)
Запусти wamp, потом набери в адресной строке браузера localhost/projectName
Скопируй сюда ошибку, которую увидишь на экране, мы переведем.
https://github.com/nsdvw/file-sharing #649 #502176
>>500405

Настрой свой редактор на вставку 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 видеоплеер.
https://github.com/nsdvw/file-sharing #649 #502176
>>500405

Настрой свой редактор на вставку 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 видеоплеер.
#650 #502206
>>502176
Ну что ж, ценные замечания, особенно относительно структуры проекта.
Вопрос только в том, как это все реализовать. Мысль о том, что опять на неделю придется закопаться в эти бестолковые статьи и документации, делает меня грустным.

>В шаблонах необходимо избавиться от копипасты


Знал бы как, сделал бы. Должно быть, это где-то настраивается в смарти. Буду искать, что ж поделать.
Смарти выбрал, потому что базовые знания по нему уже были. Твиг придется учить с нуля, сделаю это при подготовке к последнему твоему квесту на сайт с тестами. И в симфони он используется.
По шаблонизаторам кстати чувачок выше спрашивал >>501505
, мне тоже будет интересно послушать. Нафиг они вообще нужны, если сам php поддерживает шаблонизацию?
https://github.com/V3N0m21/StudentList #651 #502208
>>499703

В таблице 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)


Непонятно зачем эта проверка, ведь поле у объекта есть всегда.
https://github.com/V3N0m21/StudentList #651 #502208
>>499703

В таблице 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)


Непонятно зачем эта проверка, ведь поле у объекта есть всегда.
#652 #502211
>>502206

> Вопрос только в том, как это все реализовать.


задавай конкретные вопрсоы, я постараюсь ответить.

>>В шаблонах необходимо избавиться от копипасты


> Знал бы как, сделал бы.


Вынеси шапку/подвал в отдельные шаблоны, и подключай через include или что там в смарти есть для этого.

> Нафиг они вообще нужны, если сам php поддерживает шаблонизацию?


Синтаксис более удобный, короткий и читабельный, в твиге есть автоескейпинг (он экранирует выводимые данные, не надо писать htmlspecialchars руками, а вот в смарти надо), есть всякие фичи вроде наследования шаблонов, макросов, и тд. если разберешься с твигом то отказываться от него не захочешь.

PHP:

<?= htmlspecialchars(trimUrl($user->getProfile()->getUrl()), ENT_QUOTES) ?>

Twig:

{{ user.getProfile().getUrl() | trimUrl }}
#653 #502216
>>500695

Не все идеально, значит. Если есть желание поковыряться в форматах файлов, можешь заняться исправлением бага.

>>500706

Месяца 2-3 может уйти. Начинать лучше с HTML/CSS/JS тогда можно браться за задачи на верстку. У нас кстати в шапке есть задачи по всем этим темам.

>>500785

Нет, все пишем в utf-8

>>500869

Заведи переменную положи в нее ноль, а когда видишь анона выше чем ты, увеличивай на единицу. Тогда в ней окажется число высоких одноклассников.

>>500872

Смотри лог ошибок сервера, что там написано.

>>500870

Все зависит от ситуации
#654 #502222
>>500952

Правый, короче

>>501468

А ты PHP хорошо знаешь? Надо сначала язык наверно изучить, а потом списки выпадающие делать.

> Сейчас в тупике потому, как не знаю как же правильно написать код, чтоб все работало.


Выбрать список в массив. Вывыести из массива циклом нужное число тегов option.

>>501471

Это старье какое-то

>>501475

Тебе лучше начать с более простых вещей. Или делать по частям, получить данные в массив, сдампить массив, проверить что все есть.

>>501550

Пиши какие именно ошибки, иначе не можем помочь

>>501553

Тебе надо с основ работы с базой данных начинать, а не списки делать пока что.

>>501501

По моему это один из простейших учебников.
#654 #502222
>>500952

Правый, короче

>>501468

А ты PHP хорошо знаешь? Надо сначала язык наверно изучить, а потом списки выпадающие делать.

> Сейчас в тупике потому, как не знаю как же правильно написать код, чтоб все работало.


Выбрать список в массив. Вывыести из массива циклом нужное число тегов option.

>>501471

Это старье какое-то

>>501475

Тебе лучше начать с более простых вещей. Или делать по частям, получить данные в массив, сдампить массив, проверить что все есть.

>>501550

Пиши какие именно ошибки, иначе не можем помочь

>>501553

Тебе надо с основ работы с базой данных начинать, а не списки делать пока что.

>>501501

По моему это один из простейших учебников.
#655 #502225
>>501505

Синтаксис лаконичнее и читабельнее наверно. Судя по всему, он twig имитирует (а тот имитрует питоновский jinja). Ну и я не знаком с шаблонизатром, может там автоескейпинг есть например? Я бы почитал документацию по нему чтобы узнать про фичи.

Алсо верстка это ад какой-то, position relative top 90px — как такое можно писать?

И вот это foreach () { то же ужасно, для шаблонов есть версия с двоеточием.

И htmlspecialchars никто не использует у них.

И слеш в конце img зачем-то поставили.

Ты явно читаешь какой-то плохой учебник, люди которые его пишут сами многого не знают.
#656 #502245
>>502216
ОП, а посоветуй что-нибудь что вообще можно почитать по правильной структуре проектов, потому что делаю задачу на файлообменник, и что-то мне как-то совсем не понятно куда и в какие папки пихать классы, модели, шаблоны, ткни пожалуйста носом если есть какая-то документация официальная по этому поводу
#657 #502249
>>501505

Алсо это плохая идея вот так разрывать классы:

from-{% if ... %}right

это подложит тебе свинью при поиске. Лучше писать имя класса всегда целиком.

>>501511

Не пропускай задачи и бейся с ними пока не решишь каждую, иначе толком ничего не усвоишь.

>>501511

array_flip меняет местами клбчи и значения в элементах массива.

>>501553

В программировании подход «кровь из носу» не работает. Это работает в других сферах, это может сработать если ты администратор, но в программировании надо знать теорию, а вариант нагуглить похожее решение и подправить скорее всего не сработает.

>>501635

Будешь ли ты макакокодером, зависит от тебя

>>501651

Если что-то непонятно, задавай вопросы в треде, желательно приложив написанный код и написав на каком месте завис.

>>501684

Вероятнее получится просто «буду макакой»

>>501995

Так если ты не богач, то тебе в любом случае всю жизнь работать придется, тем более за рубежом, где все дорогое.

А насчет первоклассности — во многих местах и второклассному будут рады.
#657 #502249
>>501505

Алсо это плохая идея вот так разрывать классы:

from-{% if ... %}right

это подложит тебе свинью при поиске. Лучше писать имя класса всегда целиком.

>>501511

Не пропускай задачи и бейся с ними пока не решишь каждую, иначе толком ничего не усвоишь.

>>501511

array_flip меняет местами клбчи и значения в элементах массива.

>>501553

В программировании подход «кровь из носу» не работает. Это работает в других сферах, это может сработать если ты администратор, но в программировании надо знать теорию, а вариант нагуглить похожее решение и подправить скорее всего не сработает.

>>501635

Будешь ли ты макакокодером, зависит от тебя

>>501651

Если что-то непонятно, задавай вопросы в треде, желательно приложив написанный код и написав на каком месте завис.

>>501684

Вероятнее получится просто «буду макакой»

>>501995

Так если ты не богач, то тебе в любом случае всю жизнь работать придется, тем более за рубежом, где все дорогое.

А насчет первоклассности — во многих местах и второклассному будут рады.
#658 #502252
>>494598
Случайно написал в старом треде. Продублирую здесь.

>ОП отвечает даже на самые нубские вопросы.


Решил задачу про палиндром.
http://ideone.com/Ac42um
Вопрос: что со мной не так? Я чувствую, что все как-то через жопу сделал.
#659 #502254
>>502020

> for ($month = 1; $credit != 0; $month++) {


Тут есть риск, если результат будет не 0, а чуть-чуть меньш нуля, то цикл никогда не остановитя. В компьютере же математика приближенная. Лучше писать $credit > 0

> ($credit >= 5000) {


> $credit = $credit - 5000;


Вынести 5000 в переменную. И в переменную вынеси число процентов. Это во-первых сделает код понятнее, во-вторых будет проще менять числа. Ну и копипасты не будет.

А так, хорошо, считает верно.
#660 #502261
>>502245

Боюсь что нет, если ты будешь изучать фреймворки то можно на их примере учиться.

В файлообменнике нужна папка с классами и кодом, например 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 выкладываешь на сервер, то через нее можно выкачать репозиторий и украст весь код твоего сайта.
#660 #502261
>>502245

Боюсь что нет, если ты будешь изучать фреймворки то можно на их примере учиться.

В файлообменнике нужна папка с классами и кодом, например 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 выкладываешь на сервер, то через нее можно выкачать репозиторий и украст весь код твоего сайта.
#661 #502267
>>502252

Имена переменных ужасные. Почитай-ка статью 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;


тебе незачем считать число правильных букв. Ты можешь при первом же несовпадении сохранять в переменную признак что произошло несовпадение и слово не палиндром, и выходить из цикла.

Так, идея правильная, но код надо привести в порядок.
#662 #502268
>>502254
Спасибо, ОП! Ты единственный, кто меня хвалит, кроме мамы.

>И в переменную вынеси число процентов


т.е. именно тройку вынести? и будет что-то типа:
$bankRate = 3;
...
$credit = round($credit + ($credit*$bankRate/100) + 1000, 2);
#663 #502271
>>502267
Спасибо большое, буду работать.
#664 #502279
>>502268

Да, можно так.
#665 #502297
>>502261

>Надежнее сделать папку с публичными файлами отдельно, а весь код вынести за ее пределы


Это для этого на хостингах есть папка public_html?
#666 #502314
>>502208
https://github.com/V3N0m21/StudentList
Поправил по твоим замечаниям
#667 #502315
поставил yii2 и сразу тупейший вопрос. вот у меня лежит проект в папке D:\OpenServer\domains\localhost

>Информация: далее в данном руководстве предполагается, что Yii установлен в директорию basic/web, которая, в свою очередь, установлена как корневой каталог в настройках Web сервера. В результате, обратившись по URL http://hostname/index.php, Вы получите доступ к приложению, расположенному в basic/web. Детальнее с процессом начальной настройки можно познакомиться в разделе Установка Yii.



так воот, как мне сделать папку web корневой папкой вебсервера?
#668 #502317
поставил yii2 и сразу появился тупейший вопрос. в мануале написано:

>Информация: далее в данном руководстве предполагается, что Yii установлен в директорию basic/web, которая, в свою очередь, установлена как корневой каталог в настройках Web сервера. В результате, обратившись по URL http://hostname/index.php, Вы получите доступ к приложению, расположенному в basic/web. Детальнее с процессом начальной настройки можно познакомиться в разделе Установка Yii.



Проект у меня находится по адресу
D:\OpenServer\OpenServer\domains\localhost\basic\web

так вот как сделать папку web корневой?
#669 #502320
>>502315
>>502317
сорян, вакаба шаталась
#670 #502321
>>502261
А где здесь должна находится папка vendor?
Оно должно быть так?

/app
/views

>/vendor


/composer.json
/public
/public/css
/public/js
/public/index.php

И еще один вопрос по неймспейсам и их взаимодействию с аутолоадером композера, нужно ли их использовать в файлобменнике, и что по ним почитать, можно на английском, и наверно даже лучше на английском
#671 #502346
>>502315
Имеется ввиду корневой каталог твоего проекта, а никак не опенсервера.
Так ты создавал сайты на своем опенсервере раньше:
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 или тем более симфони, который рассчитан на суровых профи.
#672 #502348
>>502321
Могу ошибаться но вендор же компосер генерирует вроде как. Поправьте если не прав.
#673 #502371
>>502321

Папку 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
#674 #502372
>>502348

Все верно.
#675 #502375
>>502321

В предыдущем треде обсуждали мы автозагрузку, вот посты

>>494396
>>495097
>>495101
>>495505
>>495621
>>495624

и так далее
#676 #502376
>>502315

По моему Yii можно поставить и не перенастраивая сервер, но тогда ты должен имя папки писать в URL то есть http://hostname/web/index.php
#677 #502377
>>502315

Корневой каталог это DocumentRoot. Когда ты в Апаче создаешь виртуальный хост, ты указываешь где будет его корень, в какой папке. В твоем опенсервере это вряд ли возможно, так что ставь все в localhost и подирай правильный URL.

Алсо сборки не для наичнающих. начинающим надо ставить Апач/PHP руками.
#678 #502385
>>502375
О, мои старые посты, у меня тогда люто бомбило.
А сейчас вроде раздуплился, вовсю использую композер и неймспейсы.

Иногда полезно оглядываться назад, на объем проделанной работы. Это помогает мотивироваться.
86 Кб, 807x538
#679 #502411
Здравствуйте.
Прикатился к вам из верстка треда в воркаче.
Верстку худо-бедно изучил, но во всех вакансиях нужно знание php.
Я так полагаю, для того чтобы натягивать эту самую верстку на всякие цмс без проблем. Поэтому я здесь. Буду выполнять задачки, которые на сайте если не дропну через пару дней, вероятность этого высока, но чтобы не было скучно, буду их сразу применять на практике. Для этого запилил сайтик http://rf.hol.es . Для удобства, там на каждой странице в левом верхнем углу есть ссылка на сурс каждой страницы на гитхабе.
В общем, пока сделал конвертер валют http://rf.hol.es/currency.php
Шлюха для привлечения внимания.
#680 #502417
>>502411

Симпатично выглядит (хотя я бы на гербе градиент сделал посветлее или буквы обвел светлым, а то у тебя как-то неконтрастно получилось).

> &copy


забыл точку с запятой

Алсо советую сразу отучиваться перемешивать php и html. Ты пишешь:

html
php
html
php
html

А надо писать:

php
html

То есть сначала посчитал все что надо, потом вывел, а не вперемешку. Алсо вместо <?php echo короче и удобнее писать <?=

Ну и имей в виду, учебник дает только основы. Пройдя его тебе надо будет еще осилить задачу про список студентов и файлообменник (есть в ОП посте) как минимум.
#681 #502422
>>502411

Вот тут неправильно:

> $rubHave = mt_rand(1 , 10000).' руб. '.mt_rand(1 , 99). ' коп.';


> $dollarAmount = round($rubHave / $dollarCost, 2);


Нельзя делить строку на строку (фактически можно, но PHP берет только первую цифру игнорируя копейки и это неправильно). Делить надо числа.

Чтобы сгенерировать рандомное число с копейками, сгенерируй рандомное число и подели на 100. Чтобы вывести это число в виде текста

X руб Y копеек

придется вспомнить пару формул математики, но я уверен что ты справишься, я вижу у тебя хорошо получается.
#682 #502424
Боль в комментариях от требований сосикателей к зарплате: http://m.siliconrus.com/2015/06/recruit-96/
#683 #502426
Научите пользоваться гуглом. Реально бесит, что приходится тратить уйму времени на поиск.
Вот я только что поставил себе минималистичный pdf-ридер zathura (стандартный ридер тормозит на моем нетбуке).

Вбиваю в гугл "zathura горячие клавиши".
Перехожу по первой ссылке.
http://softhelp.org.ua/?p=2869
Здесь идет перечисление просмотрщиков. А мне нужны именно горячие клавиши для конкретного ридера.
Вторая ссылка.
https://xakep.ru/2011/07/05/55792/
Название домена оправдало мои опасения: малолетние долбоебы обсуждают, что нужно установить себе на компьютер, чтобы считаться хакером, линуксоидом и вообще небыдлом. Искомых мною хоткеев нет.
Третья ссылка.
http://www.unix-lab.org/posts/top-programms/
Вот наконец я нашел то что искал.

Итого: мною потрачено лишних пять минут жизни на скроллинг гугла и посторонних статей.
Это еще ничего, при поиске материала по программированию бывает и похуже.
Что я делаю не так?
#684 #502427
>>502426
Документацию надо читать.
https://pwmt.org/projects/zathura/documentation/
Вот там на первой же строчке путь к конфигу, открыл - посмотрел.
#685 #502428
>>502426

>Что я делаю не так?



Ищешь в рунете.
#686 #502430
>>502426

Я использую SumatraPDF (на основе mupdf) и встроенный в хром просмотрщик. Насчет гугла, попробуй читать текст в сниппете, может это поможет отсеять плохие результаты.
#687 #502440
>>502427
>>502428
Ок, пожалуй так.
Делаю вывод, что причиной сложности поиска является плохое знание английского и нежелание вникать в сухую документацию.
Особенно это касается материалов по программированию.
Буду больше ориентироваться на англоязычные материалы, и читать исходную документацию.
Конечно, гораздо приятнее и удобнее было бы найти урок на русском языке по какому-нибудь фреймворку, чем читать его исходный код в api.
Но чего нет, того нет.
163 Кб, 1087x1059
#688 #502450
привет ,програмач. подсажи что не так. не хочет отправлять в бд значения. выводит только "Ошибка. вы не зарегестрированы!" битый час уже пялюсь. вроде все правильно, есть похожая форма - работает норм. посмотри своим свежым, знающим все глазом, анон.

$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 "Ошибка! Вы не зарегистрированы.";
}
163 Кб, 1087x1059
#688 #502450
привет ,програмач. подсажи что не так. не хочет отправлять в бд значения. выводит только "Ошибка. вы не зарегестрированы!" битый час уже пялюсь. вроде все правильно, есть похожая форма - работает норм. посмотри своим свежым, знающим все глазом, анон.

$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 "Ошибка! Вы не зарегистрированы.";
}
#689 #502453
>>502440

Чувак, просто смирись. Я тоже пару месяцев назад думал, что щас по-быстренькому найду годный учебник или онлайн-курс, типа htmlacademy и быстренько все выучу. Ведь PHP один из самых популярных языков программирования, наверняка к нему кучу охуенных учебных материалов написали! Однако реальность провела мне хуем по губам и отправила штурмовать гугл, вооружив вилкой. Вот и приходится по крохам собирать информацию из разных источников, пытаясь все это в какую-то общую картину в голове сформировать. Хорошо хоть ОП есть, который помогает. Без него вообще не представляю что было бы.
#690 #502457
>>502450

Эмм, а с чего ты взял, что include возвращает какие-то значения? Если ты хочешь проверить существование файла базы, то можешь использовать функцию file_exists. Ну или как вариант is_readable.
#691 #502463
>>502457

include может возвращать значение если в инклюженном файле стоит return: https://php.net/manual/ru/function.include.php
#692 #502464
>>502453
Это я уже давно понял, бро.
Суть в том, что я думаю над тем, как повысить КПД гугления.
Очень много времени тратится впустую. Ну вобью я в гугл "как сделать что-то_нэйм во фреймворк_нэйм". Мне выдает десятки статей. Читаю первую: не по теме. Читаю вторую: устаревшая. Третья непонятная.
В результате все равно приходится возвращаться к справочнику. Где ничего не объясняется, нет примеров, только краткое описание:
есть такой метод, есть такое свойство и т.д.
Приходится самостоятельно делать сотни хелловорлдов, чтобы разобраться. С одной стороны это хорошо, потому что на всю жизнь потом запомнишь решение. Но трата времени чудовищная.

>>502450

> if ($result == 'TRUE')


Я не в курсе тонких нюансов расширения mysql, которое устарело уже лет десять как.
Но оно точно возвращает строку 'TRUE', а не булев тип true?
#693 #502469
>>502457
include подключает файл php где я подключаюсь к бд
#694 #502471
>>502463
>>502469

Так а что в том файле возвращается то?

>>502464

С опытом приходит. Автоматически начинаешь понимать, по какой ссылке есть ответ на вопрос, а по какой хуита.
#695 #502472
>>502471
<?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
#696 #502478
>>502472

У тебя этот файл ничего не возвращает. Следовательно и в переменную $result ничего не пишется.
#697 #502480
>>502464

В статьях ты ищешь варианты решения. затем открываешь документацию фреймворка (исходный код в тяжелых случаях) и изчаешь что делает та или иная функция которая упомянута в решении, чтобы понять как оно работает.

Поначалу сложно, но со временем это становится проще. Ну и опять же, одно дело если ты начинаешь изучать фреймворк и другое дело если у тебя полгода работы с ним.
#698 #502492
>>502450
Проставь в коде 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.

Кстати, это не ты выше спрашивал про выпадающий список? Уровень знаний того анона приблизительно такой же.
#699 #502539
>>502422
>>502417

>Нельзя делить строку на строку


Точно, вот ведь я дебил. И даже не понял вообще никакого подвоха.
В общем, я там переделал, но в итоговой величине так и не получилось отделить центы от целых долларов.

>перемешивать php и html.


Запилил отдельный файл и теперь оттуда все тащу.

><?php echo короче и удобнее писать <?=


>пропустил ;


>картинка


Это тоже все поправил.
#700 #502580
Вот решил задачу про Льва Толстого.
http://archive-ipq-co.narod.ru/l1/strings.html

Вроде ответ правильный и даже понимаю алгоритм действий, но может где перемудрил? В общем оцените.
https://ideone.com/MlKeOx
#701 #502586
>>502580
Чтобы сократить код, можно пробелы и переносы строк присоединить к текущей строке, например
echo $word1[mt_rand(0, count($word1) - 1)] . ' ';

count($word1) повторяется в коде более одного раза, можно было бы вынести в переменную.
В данном случае это неважно, всего два повтора, но не вздумай писать функцию в условии цикла, вроде
for($i = 0; $i < count($array); $i++)

А так все правильно. Подожди опа, может он найдет еще к чему придраться.
#702 #502589
>>502586
Понял, спасибо. Сейчас переделаю покороче.
#703 #502595
>>502580
Укороченная версия.
https://ideone.com/AOv0JL
#704 #502597
>>502595
Разницу между двойными и одинарными кавычками знаешь?
#705 #502598
>>502597
Уже и подзабыл. В каких-то кавычках больше возможностей вроде. А в чем дело?
#706 #502603
>>502598
Ни в чем, просто это нужно знать.

Скопируй на идеоне код
$x = 10;
echo '$x шлюх.\n';
echo "$x шлюх.";
и посмотри, что получилось.
#707 #502606
>>502603
Освежил память, спасибо.
Вот я тут твой код немного для наглядности еще переделал.
https://ideone.com/YqIVpj
#708 #502649
>>502492
да. это был я. конечно мои знания слабоваты, но через пару месяцев я все подтяну. спасибо, я попробую поменять все, то ты сказал.
#709 #502650
>>502492
да. это был я. конечно мои знания слабоваты, но через пару месяцев я все подтяну. спасибо, я попробую поменять все, то ты сказал.
#710 #502668
Оцените решение задачи про палиндром http://archive-ipq-co.narod.ru/l1/strings.html
https://ideone.com/j2YstD
#711 #502742
Оп, чому ты мне про это раньше не сказал?
https://www.youtube.com/watch?v=ryd449IOUeM
#712 #502760
Вопрос по симфони2, как мне в контролере проверить определённую ссылку на доступность?
#713 #502762
>>502668

>А роза уgала на лапу Азора


>палиндром



У тебя там опечатка, g в слове упала. Это уже никак не может быть палиндромом.
#714 #502765
>>502668
И у тебя там стоит break еще для первой итерации. По сути он проверяет только первую и последнею букву после чего завершает цикл.
#715 #502813
>>502139
Используя паттерн из http://habrahabr.ru/post/55820/,/ получаю вот это Warning: preg_match(): Unknown modifier '_' in
#716 #502834
Анон, помоги нубу со стишками
http://ideone.com/YBI8ph
Оно работает, но я чувствую, что сделал хуйню и можно было гораздо проще. Подскажи, что можно поправить?
#717 #502865
>>502760

Что ты имеешь в виду под словом «проверить»? На каком сайте, твоем или не твоем? И если не на твоем, то по моему тут симфони не при чем.
#718 #502944
>>502865
У меня есть две версии сайта, мобильная (м.сайт.ру) и обычная (сайт.ру), мне нужно сделалть редирект, но каких то страниц в мобильной версии может не быть, мне нужно проверить их наличие
#719 #502959
>>502139
«Место жительства:» и «Пол:» у тебя оформлены по-другому, не как остальные поля. Тебе стоит начать изучать HTML/CSS, они не такие и сложные, но зато ты не будешь испытывать проблем с оформлением страницы.
Так, а что не так с текущим оформлением радиокнопок? Я не совсем понимаю как же они должны выглядеть если текущий вид почему-то не приемлем.
#720 #502982
>>502944

Лучше (и дешевле) сделать адаптивную верстку. А проверить можно попробовать через роутер.
#721 #502986
https://ideone.com/Qj8IVu
В чем ошибка? Должно ведь работать по логике.
#722 #502988
>>502959

Я имею в виду, у других полей подпись находится над полем ввода, а тут слева и они выбиваются из общего вида. Лучше бы сделать аналогично, подпись сверху, а снизу 2 варианта.

Про HTML/CSS это общий совет.
#723 #502989
>>502986
Сам разобрался. Равно одинарные поставил.
#724 #502991
>>502988
ОП, а почему ты агришься на таблицы в верстке?
Кроме педантичного аргумента "таблицы только для таблиц", есть основания их не применять?
Зачем лепить кучу плавающих дивов с относительным позиционированием, если можно сделать обычной таблицей?
Ладно, когда саму сетку сайта (хедер, футер и т.д.) делали таблицей. Выглядело странно, плюс были аргументы типа того что пока таблица полностью не построится в памяти, она не отрендерится.
Но сейчас с трафиком вроде все хорошо, грузится быстро.
Почему не использовать таблицы для оформления мелких объектов типа форм?
#725 #503013
>>502834
Отдохнул и разобрался как сделать красивее, помощь больше не требуется.
#726 #503023
>>502991

> а почему ты агришься на таблицы в верстке?


Потому что у них нет ни одного преимущества перед нормальной CSS версткой. Кто их использует? Только тот кто учился 10 лет назад по устаревшим учебникам и принипиально не хочет переучиваться. такие люди у меня симпатии не вызывают, пусть они остаются в своем прошлом.

Если ты не старикан с закисшими мозгами, то у тебя вообще нет ни одной причины использовать технологии 2000 года.

Формы верстаются несложно, делаем строчку формы с клеаром, в ней 2 дива, один зафлоачен влево, другой с margin left, отвечающий за правую часть.

Также, в CSS есть display: table для тех кому проще мыслить таблицами, но его стоит изучить на предмет подводных камней.

> Зачем лепить кучу плавающих дивов с относительным позиционированием,


Что плохого в флоатах?

> плюс были аргументы типа того что пока таблица полностью не построится в памяти, она не отрендерится.


скорость загрузки тут не при чем. Аргументы против таблиц другие:

— это плохой код, который неприятно читать и править, уродливая разметка, это несемантично, так как теги должны обозначать то что в них написано, если написано table то это настоящая таблица. Зачем путать людей и программы чтения с экрана?
— таблицы не адаптивны
— таблицы труднее и неудобнее верстать через CSS, меньше возможностей для оформления, есть ограничения, например нельзя делать абс. поз-е относительно ячейки таблицы, нельзя сделать закругление/тень, нельзя поместить ячейку поверх другой ячейки. То есть к такой верстке приделать что-то требует лишних усилий.

Но главный вопрос, если есть CSS и стандартный способ верстки, зачем надо вместо прямого пути искать обходные и запутанные? Кому-то лень потратить несколько дней на изучение позиционирования, а другим потом в их быдлокоде надо ковыряться? Нет, не надо так делать.

Алсо на htmlacademy есть курсы посвященные позиционированию, они доступны бесплатно. Алсо на softwaremaniacs хороший хоть и старый учебник по теме.
#727 #503025
>>502982
Нужно именно это

$this->get('router')->match();

Что то такое?
#728 #503030
>>503025

Думаю, да. Ты можешь посмотреть api docs по классу Router чтобы узнать что именно надо передавать.
#729 #503037
>>503023

>Если ты не старикан с закисшими мозгами


Я наоборот только учусь.
Просто если в форме поля идут колонками, как в таблице, первая мысль приходит делать ее таблицей.

> Зачем лепить кучу плавающих дивов с относительным позиционированием,


>Что плохого в флоатах?


Ничего, только это кажется более запутанным и неочевидным решением.

>программы чтения с экрана


Все о них говорят, но никто в глаза не видел. Они правда существуют?
Это вообще что, для слепых? Или для хипсторов, которые везде демонстративно ходят в наушниках, мол презираю вас всех?

> таблицы труднее и неудобнее верстать через CSS, меньше возможностей для оформления, есть ограничения


Ну вот это пожалуй разумно, принимаю.

>если есть стандартный способ верстки


Ссылку на стандарт, плиз.
Не, ну серьезно, вдруг в верстке тоже есть что-то типа паттернов, которых нужно придерживаться.

Лично мне по-барабану, какой способ выбрать. Ты вроде удебил пользоваться дивами, у них больше возможностей, ок.

Кстати, насколько часто php-программисту придется заниматься версткой? Знать html и css безусловно нужно. Но верстать я надеюсь не придется? У меня нет дизайнерского вкуса. Когда есть готовый макет, я с горем пополам могу его реализовать. Но если нужно продумать дизайн, получается что-то убогое, даже бутстрап с его заебавшим ариалом и огромными кнопками выглядит не так плохо.
#730 #503060
Очень симпатичный мануал по регулярным выражениям. Вкину, может кому пригодится. http://phpclub.ru/detail/article/regexp_1
Автор правда склонен к графоманству и блоггерству, но зато пишет доступно, с объяснениями и пошагово, не посылает на гугл как мудаки с хабра.
#731 #503061
Укажите на ошибку, пожалуйста. https://ideone.com/1l4Uln
Решаю задачу про Айпад в кредит http://archive-ipq-co.narod.ru/l1/functions.html
#732 #503063
>>503061
Ты самостоятельно проверил хотя бы один раз, прежде чем писать сюда?
Мы подскажем, если серьезный вопрос, но исправлять за тебя опечатки...
#733 #503069
>>503061

> $creditsum - 39999;

#734 #503073
>>503037

>>программы чтения с экрана


Для слепых.

> Просто если в форме поля идут колонками, как в таблице, первая мысль приходит делать ее таблицей.


Значит ты плохо усвоил разницу между 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 знать надо, уметь сжимать картинки надо, а уметь рисовать красивые страницы в фотошопе не надо.
#734 #503073
>>503037

>>программы чтения с экрана


Для слепых.

> Просто если в форме поля идут колонками, как в таблице, первая мысль приходит делать ее таблицей.


Значит ты плохо усвоил разницу между 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 знать надо, уметь сжимать картинки надо, а уметь рисовать красивые страницы в фотошопе не надо.
#735 #503078
>>503061

Там внизу написано где ошибка:

> 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 который при выводе выводится как пустая строка, в итоге твоя программа ничего не печатает)

В общем, исправь, чтобы программа выводила что-нибудь, и тогда проверим.
#736 #503089
Переделал. Как сделать так чтобы показывалось сколько заплатил не в функции а в echo "Банк: функция"?
https://ideone.com/ii5Uir
Извиняйте за глупость, новичок совсем.
#737 #503091
>>503089
Дело не в глупости, а в несамостоятельности.

И тебе гуру выше подсказал уже, нужно чтобы функция что-то возвращала. Читай про конструкцию return
http://www.php.su/learnphp/cs/?rc

Эта функция ничего не возвращает:
function foo()
{
x = 2 + 2;
}
Она тупо что-то считает и умирает, результат ее работы улетает в пустоту.

Нужно так:
function foo()
{
x = 2 + 2;
return x;
}
Тогда ты сможешь получить из нее значение $result = foo();
#738 #503152
>>503091
Все понял. Починил. Спасибо.
https://ideone.com/ii5Uir
#739 #503170
Почему у веб-организаций (w3.org, например) такие убогие сайты (с точки зрения дизайна и юзабилити)?
Это риторический вопрос.

Вопрос, который меня сейчас действительно волнует (аж будоражит, фигурально выражаясь), это что обозначает \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.
Когда я буду опытным кодером, я буду держать все это в голове. Но пока я слегка охуеваю от всей этой неразберихи.
#739 #503170
Почему у веб-организаций (w3.org, например) такие убогие сайты (с точки зрения дизайна и юзабилити)?
Это риторический вопрос.

Вопрос, который меня сейчас действительно волнует (аж будоражит, фигурально выражаясь), это что обозначает \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.
Когда я буду опытным кодером, я буду держать все это в голове. Но пока я слегка охуеваю от всей этой неразберихи.
#740 #503172
>>503152
break не нужен, return прерывает саму функцию, естественно цикл тоже будет прерван

код, который идет после return, никогда не исполнится.
#742 #503241
>>503170

> Что значит 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)
#743 #503242
>>503170

> Хотя у него урок для начинающих, и он не вдается в подробности, как узнать эту самую "локаль" на конкретной машине?


Локаль определяется из переменных окружения LANG, LC_ALL и других: https://help.ubuntu.com/community/Locale

Локаль задает язык выводимых сообщений, настройки форматирования чисел и дат, кодировку.

Локаль обозначается названием, и эти названия не кроссплатформенны, на линуксе одни, на windows другие. Также локаль должна быть установлена в системе чтобы она работала.

Как видишь локаль весьма хрупкая и неудоюная вещь.

если ты используешь флаг u то используется utf-8 и локаль игнорируется. Используй этот флаг всегда.
#744 #503250
А вот то что на этом сайте размещено, если все пройти, то примерно какой уровень уже? И за какой срок нормальный человек должен это все изучать (в часах)?
http://archive-ipq-co.narod.ru/
#745 #503251
>>503242
Меня интересуют в частности употребление регулярных выражений в mod_rewrite.

Куда мне здесь флажки засовывать? Русские буквы он поймет в урле?
RewriteRule ^download/(\w+)/(\w+)$ /upload/$1_$2.txt
Это выражение кстати почему-то не работает. Выдает 404.

Работает так:
RewriteRule ^download/(.+)/(.+)$ /upload/$1_$2.txt
Но ты мне сказал поправить, чтобы не проходили слеши. Сделал пока так, вроде работает:
RewriteRule ^download/([^/]+)/([^/]+)$ /upload/$1_$2.txt
#746 #503260
>>503250
Стажер/джуниор.

Нормальный человек - за пять лет в университете.

А так полгода-год, если будешь заниматься по 6-12 часов в день.

1-2 месяца, если есть опыт программирования на других языках.
#747 #503262
>>503170

Вообще, искать информацию надо в 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

> Но пока я слегка охуеваю от всей этой неразберихи.


Хороший шанс получше узнать особенности юникода.
#747 #503262
>>503170

Вообще, искать информацию надо в 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

> Но пока я слегка охуеваю от всей этой неразберихи.


Хороший шанс получше узнать особенности юникода.
#748 #503272
>>503251

Здесь стоит открыть мануал Апача.

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


Так и надо было
#749 #503273
>>503250

Этого мало, надо еще HTML/CSS, основы JS, задание на список студентов и файлообменник.
31 Кб, 165x247
#750 #503283
Перекат сам себя не запилит.
#751 #503285
>>503283

Завтра, я спать хочу.
#752 #503309
Есть ли уроки по превью фото? Столкнулся с проблемой - не могу сделать превью через imagejpg, так как не могу изнутри шаблона отправить хедер, если выношу хедер и скрипт вывода картинки наружу, чтобы догрузить шаблон в конце - отображается только картинка без шаблона.
#753 #503312
>>503309
В шаблоне делаешь ссылку на скрипт-генератор:
<img href="preview.php?img=name">

В скрипте preview.php спокойно генерируешь нужное изображение и отдаешь вместе с нужным заголовком.
Смотри пример1, где показана генерация ватермарки.
http://www.php.su/functions/?cat=image
#754 #503328
>>503312
Спасибо, то что нужно
#755 #503405
Подскажите как правильно записать несколько условий в if здесь. Потому что если оставить одно условие, то все работает.
https://ideone.com/ylcIXh
#756 #503408
>>503405
Понял свою глупость. Я не "или" а "и" написал.
#757 #503409
>>503405
Естественно оно не будет работать. Как одна и та же строка может одновременно соответствовать трем разным шаблонам?
Ты не путаешь && и || ?
>>503408
И там не должно быть трех регулярок. Суть регулярных выражений в том, чтобы одним шаблоном описать все возможные варианты.
Напиши одно регулярное выражение, под которое попадут все три варианта написания номера телефона.
#758 #503411
>>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
#759 #503412
>>503409
https://ideone.com/RFAjf7
теперь все верно?
#760 #503416
>>503412
А если у тебя будет десять разных форматов номера телефона, ты под каждый будешь писать регулярное выражение?
Нужно написать одно регулярное выражение, под которое подпадут все варианты написания номера телефона.
#761 #503421
>>503412
Сделай лучше это задание, с большим списком телефонов
http://arhivach.org/thread/88638/#489368
#762 #503428
>>503416
Я всю голову сломал пока делал и так и не сделал. Намного же легче было в моем варианте, чем в том что сейчас делаю. Или я вообще не то делаю?
https://ideone.com/3tsFFm
#763 #503433
>>503428
https://ideone.com/EE3pn4

Или может как-то так нужно? Я не понимаю, голова раскалывается уже.
У кого-нибудь же должно быть правильное решение, можно посмотреть? Я бы хоть врубился как нужно делать.
#764 #503446
Привет компьютерщикам. Начал выполнять задание по html/css. Сделал, первое, кто-то может дать конструктивную критику по коду?
HTML - http://pastebin.com/wfVKXGv1
CSS - http://pastebin.com/Qb7Tmhsm
#765 #503491
>>503428
Может, сначала нужно выучить синтаксис регулярных выражений, а потом ломать голову?
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
#766 #503495
>>503446
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- для совместимости.
#767 #503498
ОП, я сделал совсем черновой вариант файлообменника, можешь посмотреть правильно ли я сделал структуру проекта, правильно ли использую неймспейсы, и что нужно кардинально изменить в этом всем на данном этапе?
https://github.com/V3N0m21/Uppu2
https://github.com/V3N0m21/StudentList #768 #503543
>>502314

Баг: в поле «оценка за ЕГЭ» можно ввести строку вроде 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
https://github.com/V3N0m21/StudentList #768 #503543
>>502314

Баг: в поле «оценка за ЕГЭ» можно ввести строку вроде 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
#769 #503551
>>502346

Все нормально, 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 => 'января'.

В остальном все верно.
#769 #503551
>>502346

Все нормально, 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 => 'января'.

В остальном все верно.
#770 #503555
>>502539

> но в итоговой величине так и не получилось отделить центы от целых долларов.


Для разделения чисел по разрядам есть такие способы:

// получить последние 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
#770 #503555
>>502539

> но в итоговой величине так и не получилось отделить центы от целых долларов.


Для разделения чисел по разрядам есть такие способы:

// получить последние 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
#771 #503556
>>502139
Вот, починил почти всё кроме регулярки на почту, так как с ней вылетает ошибка >>502813 пробовал экранировать нижнее подчеркивание - толку не дало.

https://github.com/Si0n/register3
Добавил загрузку фото к профилю, просмотр своего профиля с уменьшенной копией фото, просмотры чужих профилей (хочу узнать можно ли как нибудь сделать, чтобы вся строка таблицы была ссылкой, а не только первая ячейка как у меня?) Не все фото отображаются (тестил на jpg. jpeg и png, все загружались, но не все прорисовывались через imagejpg. И ещё хотел узнать как можно поставить проверку, чтобы если картинка не прорисовалась - не отображало пустой квадратик.
#772 #503559
>>502742

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

Поменьше критики, он же новичок, мы ему объясним и он не будет делать такие ошибки.
#772 #503559
>>502742

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

Поменьше критики, он же новичок, мы ему объясним и он не будет делать такие ошибки.
#773 #503562
>>503152

Имена переменных лучше писать по ангийски, исплоьзуй янедкс словари или гугл транслейт.

> $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' // нет +
);
#773 #503562
>>503152

Имена переменных лучше писать по ангийски, исплоьзуй янедкс словари или гугл транслейт.

> $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' // нет +
);
#774 #503566
>>503412

Нет, надо одно выражение которое проверяет любые номера.

>>503428
>>503433

ВЫражение там не сложное, оно выглядит так:

в начале строки (+7 или 8), за ними 10 раз повторяется (пробелы, дефисы, скобки и одна цифра), за ними конец строки

Тренироваться можно на сайте regex101, только там надо бекслеш писать один раз.

Мы пишем \\s
Они пишут \s

(потому что мы вставляем выражение в строку в кавычках, а у них оно напрямую передается движку регулярок и экранировать бекслеш не требуется)
#775 #503575
>>503495

> сли ты хочешь, чтобы контейнер был 300 px, а вложенные в него дивы занимали 66%, то можно использовать свойство box-sizing: padding-box


Не-не, это тут не сработает, так как паддинг тут у родителя а не у цветных детей-дивов. Тут надо просто писать width: 66% либо margin 34%.

Padding у него поставлен правильно, тут как раз требуется задать внутренние поля у родителя. Другой вопрос что в задаче не очень ясно от чего брать «66%», от ширины родителя без или вместе с паддингом. Надо, конечно, 66% от внутренней ширины без учета паддинга.

>>503446

код лучше выкладывать на jsfiddle, codepen.io, jsbin или аналогчиный сайт.

Сделано верно.

>>503491

Тут другой принцип. Не надо писать где может быть какая скобка. лучше сделать так:

10 раз повторяется (любое число скобок минусов пробелов и 1 цифра)
#776 #503590
>>503498

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 наверно стоит вынести наружу из публичной папки.
#776 #503590
>>503498

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 наверно стоит вынести наружу из публичной папки.
#777 #503591
>>503556

> И ещё хотел узнать как можно поставить проверку, чтобы если картинка не прорисовалась - не отображало пустой квадратик.


Пустой квадратик значит что по ссылке либо нет картинки либо битые данные. Ты не должен с ним бороться, а должен не ставить ссылки на несуществующие картинки. В твоем случае, ты должен для каждого студента хранить информацию, есть ли у него картинка или нет и если нет то не пытаться ее вывести.

Это хорошо, что ты решил усложнить задачу, я проверою обязательно.

К регулярке ты забыл добавить разделители.
#778 #503598
>>503566

>мы вставляем выражение в строку в кавычках, а у них оно напрямую передается движку регулярок и экранировать бекслеш не требуется



Что? Всю жизнь писал \ один слеш, и все работало.
Я что-то пропустил? Зачем два раза экранировать?
330 Кб, 1263x1255
#779 #503600
Антуаны, что скажете про курсы пикрелейтед? Стоит ли покупать?
#780 #503603
>>503598

Если ты хочешь найти бекслеш регуляркой ты должен написать

\\

но если ты напиешшь это в строке то PHP заменит 2 бекслеша на 1 и движок регулярок увидит

\

Потому ты должен написать

\\\\

\\s и \s дают одно и то же, движок регулярок получит \s так как во втором случае нет такой escape последовательности и PHP передаст символы как есть.

Но это создает путаницу, что в некоторых слуаях мы удваиваем бекслеш, в некоторых нет. Чтобы ее не было, я решил всегда его удваивать.

Сейчася вижу что в других туториалах и коде его не удваивают и подумыаю поменять на такой вариант.

Мануал про escape последовательности: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double

Например \$ PHP заменит на $ и чтобы передать эту конструкцию в регулярку, придется писать \\$

Как видишь, все не так просто. Другие языки обычно для регулярок используют тип строк, которые передает все символы дословно, не заменяя их.
#780 #503603
>>503598

Если ты хочешь найти бекслеш регуляркой ты должен написать

\\

но если ты напиешшь это в строке то PHP заменит 2 бекслеша на 1 и движок регулярок увидит

\

Потому ты должен написать

\\\\

\\s и \s дают одно и то же, движок регулярок получит \s так как во втором случае нет такой escape последовательности и PHP передаст символы как есть.

Но это создает путаницу, что в некоторых слуаях мы удваиваем бекслеш, в некоторых нет. Чтобы ее не было, я решил всегда его удваивать.

Сейчася вижу что в других туториалах и коде его не удваивают и подумыаю поменять на такой вариант.

Мануал про escape последовательности: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double

Например \$ PHP заменит на $ и чтобы передать эту конструкцию в регулярку, придется писать \\$

Как видишь, все не так просто. Другие языки обычно для регулярок используют тип строк, которые передает все символы дословно, не заменяя их.
#781 #503604
>>503591
Ну она даже когда есть, не всегда создается через imagejpg
#782 #503605
>>503600

Мне кажется платить имеет смысл за время преподавателя и консультации, а за видеозапись или учебник не стоит так как аналогичную информацию можно найти в других местах.

Сам я про эти приложеняи слышу в первый раз. там есть какой-нибудь интерактив, проверка решений или это просто книга?

Дизайн на картинке мне кажется немного перегруженным.
#783 #503606
>>503604

Надо изучить почему. Может в имени файла русские буквы или пробелы есть? Ты их корректно обрабатываешь на сервере и корректно экранируешь?

Начни с того что посмотри какая ссылка стоит в src у картинок и попробуй открыть ее отдельно.
8 Кб, 235x191
#784 #503608
>>503600
Стоит, стоит!! У меня брат накупил всяких курсов на 30 тысяч рублей а теперь он заробатывает 3000$ в месяц!

>>503605
может у тебя просто нет 899 руб, ахахах)))

Кстати, никому не нужен складной режиссерский стул?
Складной компактный режиссерский стул
из цельной древесины бука украсит любой
интерьер. Оптимально подходит для дома,
дачи и отдыха на природе.
Перейди по ссылке domen3lvl.trojan.net и получи скидку 800% НА ВСЕ!!!
#785 #503613
Аноны, переходите в новый тред: >>503607

>>503608

Ох, тут нельзя однозначно сказать стоит курс своих денег, если не знать что в нем. Надо посмотреть, какие есть альтернативы, например может есть где-то бесплатный учебник или курсы. Если альтернатив нет то может и стоит.
#786 #503617
Аноны, перекат, который вы так хотели: >>503607

>>503556

И еще кое-что. Ты вписал код загрузки картинки прямо в reg.php, но лучше бы вынести его в функции или методы. Очевидно что надо миниумм 2 функции:

— проверка правильности загруженной картинки и выдача сообщений об ошибке
— сохранение картинки

Логично сделать класс ЗагрузчикКартинок с 2 такими методами.
#787 #503619
>>503605
Да, есть интерактив. Я бы и не покупал, просто уезжаю на два месяца, а взять с собой могу только ipad.
#788 #503624
>>503619

Тогда интерактивный учебник конечно луше его отсутствия.
#789 #503627
>>503619

Обрати внимание, тут http://softwarerecs.stackexchange.com/questions/66/ipad-app-for-offline-html-css-javascript-testing советуют 2 приложения, одно бесплатное, где можно просто протестировать написанный HTML/JS код в браузере, оффлайн.
#790 #503631
>>503627
Спасибо, добра тебе
#791 #503654
>>503575
>>503495
Спасибо, аноны.
#792 #503676
переходите в новый тред: >>503607
#793 #503692
>>503631
>>503654
В чем смысл благодарности? Объясните битарду.
Никогда не испытывал этого чувства (а может и испытывал, но стыжусь сентиментальности), и ничего не ощущаю, когда меня благодарят.
Иногда помогаю, когда могу. Но делаю это не для того, чтобы передо мной ползали и целовали ноги (Лавров.джипег), а скорее из расчета. Ты мне, я тебе, divide et impera.

Я считаю, что это рудиментарное стадное чувство. Людям хочется находить подобных себе, объединяться против тех, кого они боятся и ненавидят. Эти враги объявляются злыми, плохими людьми. Себя непросвещенный человек по-дефолту считает хорошим. Отсюда истоки моралфажества. Слабый омежка считает злым быдлана, который его обругал по пьяни. Быдланы считают мерзавцами и подлецами омежек, которые не уступают место шлюхам и старухам в транспорте.
Вся философия бобра и козла строится на глупости, страхе и понятиях о норме данной особи. Следовательно, не существует злых и добрых, хороших и плохих, нормальных и ненормальных людей. Это значение устанавливается текущей локалью и переменными среды.

Подамся в буддизм, наверное. Я как тупая пизда слышал, что это модно и молодежно, и там проповедуется нейтральное отношение к жизни.

---------------------------------------------------------------

Ладно, вы тут скучные, питухи))
Возвращаюсь к увлекательному чтению документации slim.
#794 #503761
>>503692

Ты ничего не ощущаешь, а другим приятно благодаритть и когда их благдарят. Алсо есть еще нормы вежливости.
#795 #503962
>>503566

>ВЫражение там не сложное, оно выглядит так:


>в начале строки (+7 или 8), за ними 10 раз повторяется (пробелы, дефисы, скобки и одна цифра), за ними конец строки



Ну и что? Я смогу написать тогда 8--0123---) и засчитает.
Бред какой-то.
Кто-то ведь решил уже эту задачу. Покажите пожалуйста.
#796 #503982
>>503962

> Я смогу написать тогда 8--0123---) и засчитает.


Там обязательно должно 10 цифр так что не можешь. смотри внимательно:

> 10 раз повторяется (пробелы, дефисы, скобки и одна цифра)

#797 #503987
>>503982
Понятно. Спасибо. Пошел заниматься другими делами.
10 раз повторяются пробелы, дефисы, скобки и одна цифра, ну что за малафья. Вчера еще голова взорвалась от километровой строчки кода, так еще и сейчас ничего не понял.
#798 #503992
>>503987

10 раз повторяется комбинация из идущих последовательно любого числа пробелов, скобок, дефисов и одной цифры
#799 #503999
>>503992

>комбинация из идущих последовательно любого числа пробелов, скобок, дефисов и одной цифры



)))(()()() () () ( ) ( ) ( ) ( ) () _ ) _ ( _( _ ( )_ (2

Я, видимо, слишком туп чтобы так на словах это понять. Только просмотр решения поможет.
#800 #504145
Задача про Опечаточников.
http://ideone.com/aAjp1g
Антоны подскажите отчего не работает код.
Почему на 19 и 20 строчке замена работает не коректно? Почему она заменяет массив строкой?
Как правильно написать условие "Если $массив пустой, то прервать цикл". А то на 25 и 33 строках условия не срабатывают.
#801 #504165
>>503999

Мы там уже в новый тред перекатились.

Я предлагаю сделать несложное выражение, суть которого в том что номер начинается с +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
#802 #504199
>>504145

И еще одна ошибка,

$matchesLatin = preg_replace($regexLatinMark, '[$1]', $matchesLatin)

Третим параметром идет строка в которой делается поиск и замена. А не массив. Почитай-ка мануал.
Тред утонул или удален.
Это копия, сохраненная 15 июля 2015 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски