А вот и мы. В этом ИТТ треде мы изучаем PHP (и некоторые другие языки для веба вроде JS), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то хочет изучить этот язык, кто-то хочет просто размять мозги и заняться чем-то полезным.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Есть задачки по основам JS и DOM, хорошие, многие их с ходу решить не могут, попроси, дадим ссылку. Есть задачка на MySQL.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее. ОП обычно занят, но где-то раз в сутки в треде появляется.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 2 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.
В общем, давайте начинать уже!
Клуб изучающих PHP!ОП15/10/14 Срд 13:17:40#2№395792
Вообще, наш тред называется «Клуб изучающих PHP», и он рассчитан на тех, кто изучает этот язык. А название в ОП-посте не очень отражает его суть.
Ну да ладно, я тут подумал, давайте в этот раз не будем создавать отдельный тред, а посидим пока в этом, если что перекатимся. Но вообще, торопиться не надо, от того что тред повисит немного на второй странице, ничего страшного не произойдет, а местные любители теории категорий смогут пару дней пожить спокойно.
Расскажу заодно про то, как надо оформлять код.
Код надо писать не как попало, а аккуратно и красиво. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, _ не используется, используется camelCase, пример: $x, $numberOfPeople, printResults() - Название функции начинается с глагола, в стиле «сделайЧтоТо» - не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там - в именах классов используется CamelCase, первая буква большая, «_» может использоваться - мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо - мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела) - скобки в for и if/else ставятся так:
[code] if (...) { // ... } else { // ... }
for (...) { // ..... } [/code]
- у определений функций и классов так:
[code] function makeMeFeelGood(...) { // ... } [/code]
В общем, пиши как на картинке, и проблем не будет.
Можно ли начать учить php c фреймворка? Сколько нужно потратить времени, чтобы выучить api wordpress, и отлично натягивать шаблоны любой сложности и писать модули? Заранее спасибо за ответы.
> Можно ли начать учить php c фреймворка? надо знать сам PHP и ООП, так как фреймворки вовсю его используют. Иначе ничего не понятно будет.
> Сколько нужно потратить времени, чтобы выучить api wordpress, и отлично натягивать шаблоны любой сложности и писать модули? Время зависит от тебя, если ты хорошо знаешь PHP то шаблоны натягивать за несколько дней научишься, модули писать — чуть подольше, так как надо разобраться с устройством вордпресс. Мануалов в сети предостаточно, вот например официальный:
>>395743 >Но ты бы потратил эти часы не зря, а разбираясь с тем, как правильно создавать классы, свойства, методы в них, как организовать их взаимодействие. нет, я бы потратил это время на то как обрабатывать пользовательский ввод, как вообще расположить в пространстве мышь и кошку.
первое что приходит в голову - двухмерный массив где 1 - мышь, 2 - кошка.
> первое что приходит в голову - двухмерный массив где 1 - мышь, 2 - кошка Это не ООП-подход и работать с таким массивом будет очень неудобно, когда ты будешь писать например алгоритм выбора хода. Эта задача кстати хорошо показывает преимущества ООП. Если не веришь мне, можешь попробовать написать кусочек и увидишь.
> я бы потратил это время на то как обрабатывать пользовательский ввод, как вообще расположить в пространстве мышь и кошку. Тут нет пользовательского ввода. Можно в 2 переменные поместить число кошек/мышек и в начале программы генерировать их случайно.
>>395803 Не знаю стоит ли оно того, но мне очень помогла начать эта книжка http://www.ecb.ac.in/admin/uploads/c720fc21400f01e53cce016085882a0f.pdf(Jump Start php) Но она корявая очень. Много ошибок в коде, из за которых, правда, пришлось этот код разбирать и понимать. И до конца я тот блог так и не сделал. Но понял как использовать ООП и вообще организовывать проэкт, как использовать базы данных, куки, сессии. Хотя я это читал в основном не из книжки, книжка как-бы говорила мне, что мне надо читать. Основной плюс я конечно получил это понимание ООП. Хотя он там тоже кривой немного, лол.
Посоветуйте простую CMS или blogging paltform типа Wordpress для изучения исходников. Wordpress мягко говоря великоват для изучения, мб есть что попроще?
Прочитал вчера пост этого господина: >>394200 Поставил себе эту хуйню, весь вечер пердолился с выделением 80 порта для этого вашего апача. Вообще не ебу, что это. Освободил порт, запустил, зашел на 127.0.0.1, и что дальше? Вижу пикрилейтед. Пробовал скопировать свой код с ideone, записать в php-файл, и вбросить в папку projects. Какая-то параша, ничего не открывается, только второй пикрилейтед. Это было задание на массивы, про составление стихов. Попробовал даже написать обычный Hello, world!, но, когда открыл его, увидел просто исходный код. Как совладать со всем этим говном? Помню, когда-то пытался учить питон, но у меня тоже нихуя не вышло, из-за этого пердолинга с программками. С РНР, вроде, всё было просто, зашел на ideone, написал код, запустил с одной кнопки, увидел результат. А тут ПЕРДОЛЬКА ПЕРДОЛЬКА ВЕБ СЕРВЕРА АПАЧ АПАЧ КОДИРОВКА. Что за хуйня, почему нельзя сделать всё нормально, по-людски?
Опе, я сделал прото-тестовый парсер. Че-как зацени https://github.com/Electric-Lizard/Some_Parser/blob/master/test.php Зацени сам подход, реализацию и как построено дерево. И как лучше будет делать парсинг? Сразу проходится по всему или сначала пройтись по всему тексту на, например, теги, затем на смайлы, затем на урл и т.д?
>>395828 Зашел в папку EasyPhp, нашел там папку projects, скинул туда свой рнр-файл. Потом зашел на 127.0.0.1, увидел то, что на первом пике в том посте, зашел там в папку projects, и запустил оттуда свой файл.
>>395819 >А тут ПЕРДОЛЬКА ПЕРДОЛЬКА ВЕБ СЕРВЕРА АПАЧ АПАЧ КОДИРОВКА. Что за хуйня, почему нельзя сделать всё нормально, по-людски? Очевидно что-то не прописал в апаче или в пхп.ини. Я пхп целый день ставил вообще. Он не хотел работать, я решил поставить сборку, чтоб посмотреть что у меня не так. Что-то там менял-переменял - заработало, пытался откатывать, оно все равно работало. Я нихера не понял и решил интереса ради все нахуй удалить и снова поставить. В этот раз все заработало. Так и не понял в чем проблема была. Или понял и забыл. "По-людски" можешь сборку поставить, но это, типо, не тру.
>>395833 Поставь другую значит. Которую ставил я работала сразу, ссылку на неё нашел через оффициальный сайт. Но я её сразу снёс чтобы ровным пацаном быть.
сука тупари, поставьте openServer и не ебите мозг. я на нем ша тему вордпресс делаю по своей верстке. не могу задать стили у ссылок в хедере, бля пиздос
Вопрос по javascript. Можно ли как-нибудь из b вызвать методы класса A? Допустим, А это класс интерфейса игры, а В - внутреннее представление(объект B находится в A). В В мы мы делаем проверку на проигрыш, и вызываем метод из А(popup например с надписью). Или проверку на проигрыш лучше делать в А, анализируя информацию из В?
> Или проверку на проигрыш лучше делать в А, анализируя информацию из В? Можно сделать, только b содержит ссылку на a, вызывает a, а также подписывается на события через него.
Можно сделать чтобы a и b содержали ссылки друг на друга.
Можно сделать чтобы a содержал ссылку на b, вызвал его, и как-то у него получал информацию об изменениях (например подпиской на события изменения состояния клеток), это наверно будет самый сложный, хотя и самый близкий к MVC вариант.
Нужно чтобы проверялось условие: если в массиве есть хотя бы один из этих ключей и нет никаких других, то... Как это написать? Какие функции использовать?
>>395842 http://jsbin.com/rarunesitunu/1/edit. Еще немного пошаманил, но ни черта все равно не работает. Когда будешь оценивать - скажи по какому из кодов смотрел. Они практически одинаковые, один из посмотри.
Вопрос по wordpress Вот есть на странице текст <p>lorem ipsum</p> Как узнать какой тег добавить и куда, чтоб этот текст можно было редактировать из админки? И как такое реализовать, появится ли он в админке после добавления тега? С тайтлом и дескрипшином все получилось, а вот с текстом хуй знает что делать. В документации об этом ни слова, и вопрос такой не гуглится, выдает хуйню по визуальным редакторам.
Нет, не появится. Текст из шаблона автоматически в админке не появится. С чего бы? Текст хранится в базе данных.
Ты можешь только создать статическую страницу с текстом, назначить ей шаблон (или использовать шаблон страницы поста) и в нем пометить место где будет выведен текст через the_content() если я ничего не путаю:
Возможно, можно еще как-то использовать закрепленный пост.
Хочу предупредить на тот случай, если ты не хочешь читать про устройство вордпресса и изучать разработку тем, а хочешь делать все методом тыка. Имей в виду, так ты далеко не уйдешь и ничему не научишься. Не понимая, как работает вордпресс внутри (хотя бы на уровне который описан в документации), ты не сможешь понять как реализовать ту или иную фичу.
Ну и такие вещи как статические страницы или закрепленный пост ты должен вообще знать назубок. Все, что делается через нажатие кнопок в админке, а не написание кода, надо знать идеально.
Твоя проблема в том, что ты не прочел мануал/урок по тому как работает Апач, как он взаимодействует с браузером и с php. Оттого ничего и непонятно. Не знаю, правда, есть ли где-то хороший урок на эту тему.
> почему нельзя сделать всё нормально, по-людски? Это и есть нормально. Ты просто видимо не знаком с линуксом, командной строкой и консольными программами, оттого и непонимание. Я бы советовал изучать эту тему, так как это тебе может пригодиться. Многие утилиты (в том числе использующиеся в PHP фреймворках) сделаны как программы для командной строки.
Апачу, PHP и подобным программам не нужен графический интерфейс с кнопочками, он излишен. Они запускаются из командной строки, их настройки задаются через текстовые файлы. Это дает гораздо больше возможностей и гибкости чем программы с окошечками и кнопками. Потому что с окошечками может взаимодействовать только живой человек, а через командную строку можно вызвать программы из скриптов. Например, это позволяет серверу ideone передать твою программу php на выполнение и вывести результат.
Он не имеет прямого отношения к Апачу, но поможет тебе лучше понять концепцию. Привыкай, если ты хочешь быть программистом то должен рано или поздно научиться.
И еще. Сборки вроде easyPHP рассчитаны на опытных программистов, которым лень тратить время на установку. Но начинающим рекомендуется установить и настроить Апач/PHP/MySQL самостоятельно. Я бы советовал удалить сборку и установить все самому. Вот инструкции (немного устаревшие но who cares):
Ты зря отказываешься от ООП и пишешь все на функциях. Логичнее было бы сделать класс Tokenizer и класс Parser и методы в них. Ну и для дерева сделать набор классов, 1 тег = 1 класс. Это позволит легко добавлять новые теги.
Ну да ладно, можно пока и так писать.
В регулярке для разбора у тебя ошибки:
> =[\'"]?[^\'"\]\ Если в теге 2 аттрибута без кавычек, он съест их оба: a=1 b=2. Если в аттрибуте есть кавычка, он запнется: title="hello' world"
Надо написать 3 отдельных выражения, для аттрибута без кавычек, с одниарными и с двойными кавычками.
Логично сделать такие токены (но тут есть подвох, о нем ниже):
[hello — начало тега [/hello — начало закрывающего тега ] — конец тега attr=val — атрибут без кавычек attr='val' — атрибут с кавычками attr="val" — атрибут с двойными кавычками (пробелы) (любой другой символ) — обычный текст
Но тут есть подвох. Смотри, допустим у нас есть текст:
Но наш парсер ошибется. Какие тут есть варианты решения?
1) разбить сначала сложной (сложной так как ] внутри кавычек не должна закрывать тег) регуляркой текст на теги/обычный текст а уже теги парсить отдельно. Мне не очень нравится, так как при усложнении синтаксиса регулярка станет еще сложнее.
2) хранить в токенайзере состояние «мы внутри тега» и «мы в обычном тексте», в зависимости от которого используются разные регулярки. И использовать preg_match с параметром offset чтобы идти по тексту слева направо. А набор токенов взять тот, который написан выше, просто сделать часть токенов доступными только когда мы внутри тега.
3) сделать токены более мелкими:
[ (начало тега или просто скобка) ] (конец тега или скобка) " ' / = идентификатор из латинских букв и цифр например hello (любые другие символы в любом количестве)
Тогда текст attr="val[yes title="no"]..." будет разбит на токены:
attr = " val [ yes (пробел) title = " no " ] ... "
Тогда, правда, сам парсер станет чуть сложнее, и работать будет медленее так как токенов будет гораздо больше. Но зато тут мы сможем отличить кавычку в тексте от кавычки, открывающей атрибут.
Мне кажется, проще будет сделать вариант 3, а вариант 2 сложнее но даст чуть более высокую скорость разбора так как в нем токены более крупные и их меньше.
> И как лучше будет делать парсинг? Лучше всего и парсинг, и разбиение на токены делается в один проход. Если ты начинаешь скакать вперед-назад, то это обычно значит что ты все усложнаяешь.
Имена переменных я бы поменял. Почему массив называется total? Логично назвать его girls или places или numbers.
$i я бы переименовал в $current (текущий элемент)
> sort($array); Зачем сортировка? Разве у тебя числа не по возрастанию расположены?
> if ($total[$i] == $lastElement) { Можно проще, сравнить $i и count($total). Но я не понимаю, почему отдельный блок кода для последнего элемента? Он что, особенный какой-то? Я думаю, можно этот код смело убирать.
> foreach ($total as $value) { Можно через echo implode вывести без цикла.
Задача про Маяковского
> $max = mb_strlen(max($splittedText));//Чому это не работает? Потому что max(массив строк) вернет наибольшую строку из массива. Но что такое «наибольшая строка»? Как сравниваются строки?
Ответ надо искать в мануале. Но я его не нашел, потому скажу своими словами. Строки сравниваются по кодам первого символа, у которой код больше — та и больше. Если первые символы одинаковые, то по второму, и так далее. Коды можно увидеть тут: http://unicode-table.com/ru/#cyrillic
Как видишь, частично они идут по алфавиту, при этом маленькие буквы имеют больший код чем большие, а буква ё стоит отдельно. Таким образом, для Php слова сравниваются так:
Ананасы, имеет смысл дрочить нативный пхп, если с laravel обучение идет неплохо? (с рельсобекграундом дается проще чем чистый пхп) Не будет ли это проблемой, при поиске работы и прочей хуйни?
Не, код слишком запутанный, давай переделывай. Я хочу тебе подкинуть идею: у тебя номинал купюр и количество лежит в массиве. А что мы можем использовать для обхода массива? Конечно, цикл.
Почему бы не сделать цикл от самых крупных купюр к самым мелким? На каждом шаге мы берем максимально возможное число купюр и считаем сколько еще остается выдать.
Ну и die() надо убрать из функции. зачем нам такая функция которая может завершить всю программу?
> this.cells[pos1][pos2][Field.MINE] Вот это называется «лезть внутрь» другого объекта (и что за странная идея, хранить имя поля в константе? константы так не используют). Не надо так, надо так:
> contentCell = td.appendChild(span), А зачем сохранять результат в отдельную переменную? У тебя же есть span. Функция appendChild его и вернет.
Не работает код потому, что ты не смотришь в консоль, а там ошибка:
> "TypeError: this.cells[pos1][pos2] is undefined (line 120)"
Также, есть возможность отлаживать код. Открой страницу просмотра ( http://jsbin.com/koxudosupigu/1 ) и на ней нажми Ctrl Shift + I. Откроется инспектор, в нем перейди на вкладку Script. Там ты можешь ставить точки останова, выполнять код пошагово и смотреть содержимое переменных. Если ты не умеешь, то советую научиться, пригодится еще не раз. Вот статьи:
Оп, начал потиху писать кошек мышек, я у тебя еще в прошлом трэде совета спрашивал. Вот что накидал - http://ideone.com/Z2MvWx Тут прочел что использовать двумерный массив плохая идея, а что вместо него тогда? Взял идею с двумерным массивом для хранения поля из задачки про рисование окружности. Ну и еще 1 - http://ideone.com/a08KuY В б пару дней назад проскочил пост от чувака который жаловался на то что 2/3 приходящих на собеседование php макак не в состоянии решить задачу - развернуть строку задом наперед используя рекурсию. Ну я вот попробовал, раньше с рекурсией дела не имел. Правда не могу понять почему внутрь этой функции дебаггер пхп шторма войти не может, просто проскакивает ее и выдает результат.
> while (true) { Не делай бесконечные циклы, делай цикл вроде for с 5-10 попытками. А то у тебя если мышку загнать в угол, программа зависнет.
> public $x; Давай в этой программе откажемся от public свойств и используем только private/protected. Инкапсуляцию используем, в общем.
Инкапсуляция это когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.
Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.
> public function move(Map $map) Это неправильно, передавать карту в функцию move.
Тут явно есть связь животное -> карта (и обратная связь, карта знает кто на ней находится). Значит, у животного должна быть ссылка на карту, которая проставляется при добавлении на карту и очищается при удалении с нее. Для надежности можно при добавлении проверять что ссылка пуста — это позволит защититься от ошибки когда животное добавляют сразу на несколько карт (ты скажешь, но у нас одна карта? да, но ничто не запрещает сделать несколько и связать их телепортаторами например).
> if (($y >= 0) && ($y <= $map->height - 1)) { Лучше сделать у карты метод isInMap($x, $y). Это задача карты, определять доступна клеточка или нет.
> if ($cell instanceof Mouse) { > echo 'M'; Лучше сделать $cell->getMapLetter(); Если ты видишь switch/instanceof — это скорее всего неправильно и значит что его надо заменить на метод.
> if (!($this->field[$y][$x] instanceof Animal)) { Тут тоже лучше без instancceof обойтись.
> $this->field[$animal->y][$animal->x] = 0; Тут хорошо бы для надежности добавить проверку что там дейстивтельно это животное - это поможет защититься от ошибок (в твоем варианте ошибка останется незамеченной).
> public function makeMove() Вот этого тут не должно быть. Карта не управляет животными. Это должно быть в каком-нибудь классе Game. Туда же можно и поместить тот код который у тебя находится в конце программы.
Насчет хранения животных на карте, при твоем способе появляются сложности: надо перед ходом очистить клеточку, а после хода сохранить объект в новую. Это конечно решаемо (если животное содержит ссылку на карту то может вызвать нужные методы), и такой подход часто используют в играх, но не проще ли хранить плоский одномерный массив с животными, а двухмерный массив с клеточками вообще выкинуть?
А так, пока неплохо, ты движешься в верном направлении.
>>396019 > Ты зря отказываешься от ООП и пишешь все на функциях. Логичнее было бы сделать класс Tokenizer и класс Parser и методы в них. Ясное дело полноценный парсер, я напишу с ООП, тут я просто пытался понять как его вообще реализовать, примерно. Теперь перейду на классы. > И надо понимать, что узлы образуют дерево и могут быть вложены друг в друга. Не вижу, где у тебя это? У тебя нет дерева. Ты о том что я не проверял содержимое тега на другие теги? Это у меня совсем из головы вылетело, да. Или там сама структура в массиве не правильная? Сейчас ты предлогаешь мне сделать парсер без аттрибутов но с проверкой содержимого тегов на другие теги?
У тебя не предусмотрена возможность что теги могут быть вложены друг в друга. А это должно поддерживаться.
> Или там сама структура в массиве не правильная? В этом плане она непраивльная, что не поддерживает вложенность.
> Сейчас ты предлогаешь мне сделать парсер без аттрибутов но с проверкой содержимого тегов на другие теги? Да. Для начала можно сделать только один вид тега, но со вложенностью.
Только начал учить пхп, дошел до задачки с айфоном в кредит. Вроде бы сделал, но что-то подсказывает что неправильно. Добрый анон, рассуди. http://ideone.com/ZZe6vz
Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 49139, а около 61270.
Также, если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.
Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга - если остаток маленький, выплачиваем сколько осталось и уходим - иначе платим 5000
Мне нужно убрать из массива значения, ключи которых меньше $someInt, при этом сохранить ключи. А функция array_slice() требует флаг true для этого. Но тогда надо заполнить третий аргумент, а это длина обрезки, мне нужно чтобы чтобы длина была максимальной.
Котаны привет, спрашивал в вебаче но там проигнорили. Тупой вопрос: на странице есть такая тема допустим if(isset($_POST['1'])) { $a = 1; } if(isset($_POST['2'])) { $b = $a + 1; } короче во втором ифе не получаем первую переменную потому что скоупы, есть вариант разрулить это без сессии?
Если ты пришел из других языков (Си например), то их правила в PHP не работают.
Но ты прав в том, что неправильно создавать переменную внутри одного блока, а обращаться к ней в другом. Надо просто вынести ее выше, из if наружу.
Алсо код, у тебя наркоманский: если if выполнится, переменная будет создана, если нет то не будет. Это ошибка, такого быть не должно. Создай переменную перед этими if.
>>395787 ОП, снова по поводу тестхаба. >Резлультат теста: результаты сдачи всех тестов хранятся в БД, включая время ответа на каждый вопрос и выбранный ответ. То есть это будет выглядеть как-то так?
RESULTS question_id INT внешний ключ к вопросу, который содержит внешний ключ к тесту student_id INT внешний ключ к студенту answer_id INT answer_number DECIMAL answer_text VARCHAR exec_time INT result INT
И если тестируемый решил ответить строкой на вопрос, где нужно указать цифру, мне ему запрещать это делать?
Алсо, то что я буду хранить целые числа в DECIMAL это нормально? И посмотри пожалуйста алгоритм сравнения чисел http://ideone.com/6b2xkp.
Делаю задание на макет, а какие размеры выставлять не знаю. Ставлю наугад где в пикселях, где в процентах. Иногда на глаз меряю, иногда ставлю столько пикселей сколько было нарисовано на картинке. Вот мне интересно как верстальщики определяют какие размеры ставить, так что б правильно?
Сколько времени ушло бы у опытного человека сделать такой макет? Я догадываюсь что как минимум раз в 10 бы быстрее чем у меня, но всё же.
>Ставлю наугад где в пикселях, где в процентах. Все значения должны быть одного вида, либо пиксели, либо проценты, либо емы, либо ремы. Размеры должны быть точные, если в макете 12 пикселей от и до, значит и при вёрстке должно быть 12 пикселей. Проценты никто уже не использует (почти, но если ты их используешь, то должен знать, зачем), либо пиксели, либо емы, но с емами ебля, поэтому придумали ремы — та же хуйня, только считается не от родительского элемента, а от корневого. Если будешь использовать ремы, смотри поддержку браузеров, это относительно новая вещь. Если боишься брать емы, потому что ебля, и не можешь при этом использовать ремы, то используй пиксели. Как-то так.
> решил ответить строкой на вопрос, где нужно указать цифру, мне ему запрещать это делать? Да, выводить сообщение об ошибке и не принимать ответ пока не исправит.
Насчет ключей: мне кажется, связь должна быть такая:
Студент (1) - (N) РезультатыТеста (1) - (N) Ответ Тест (1) - (N) РезультатыТеста
То есть нужна сущность «результаты теста» которая соответствует одной попытке прохождения теста. Например, список «результатов теста» может просмотреть преподаватель.
Обычно токенайзер не отдает токены, а хранит в себе их список и номер текущего токена. А парсер только вызвает методы вроде получитьСледующий(ожидаемый тип), определитьТипТекущегоТокена(), являетсяЛиСледующий(такоим-то типом) и так далее.
Соответственно тебе не нужен будет foreach и не придется использовать костыль в виде передачи position туда-сюда.
> "data" => $this->parse($tagContent, true)); Вот это очень неэффективно, преобразуем токены назад в текст, а текст снова парсим. Так делать не надо.
Также, объект токенайзера обычно передается в парсер в качестве исходных данных.
Для каждого тега позже стоит завести свой класс (а в парсере — соответствие имя тега -> имя класса). Тогда можно будет легко добавлять новые.
Ты используешь preg_match для определения типа токена. Позже можно будет убрать preg_split и двигаться по строке с помощью параметра offset у preg_match.
Проверку существует ли такой тег наверно лучше перенести в парсер, токеназйеру незачем знать какие теги существуют.
Ну и пока твой парсер не соответствует алгоритму recursive descent так как в этом алгоритме мы имеем набор функций, каждая из которых умеет парсить какую-то часть синтаксиса целиком и возвращает узел дерева как результат. Ну то есть у нас могут быть методы типа:
parsePlainText() // парсит кусок текста без тегов и возвращает текстовый узел parsePairTag() // парсит код от открывающего до закрывающего тега и возвращает узел-тег parseSingleTag()
и не должно быть методов типа searchEndTag()
Возвращаясь к примеру с парсером математических выражений, каждая функция умеет парсить свой тип выражения (суммы, произведения, отдельные числа), при этом она вызывает другие функции чтобы например распознать произведение внутри суммы. Также и у тебя, parsePairTag() может вызывать parsePlainText() чтобы распарсить текст внутри тега и может вызывать себя рекурсивно чтобы распарсить вложенный тег.
Насчет проверки ответа: мне кажется, надо проверять что ответ пользователя лежит между (answer - precision) ... (answer + precision) или abs(answer - userAnswer) <= precision.
epsilon тут как я понимаю, не нужен, если precision != 0
Эта формула будет работать за исключением случая когда precision = 0 (то есть ответ должен точно совпадать). Дробные числа нельзя проверять на равенство с помощью == и надо вводить epsilon.
Фиксированный epsilon имеет тот недостаток, что если правильный ответ = 0.000000001 то он огромный в сравнении с ответом. Я видел такой алгоритм сравнения дробных чисел на равенство:
Статьи на английском, но код в первой статье, думаю, понятен.
Потому если ты хочешь добиться максимального качества, то при precision = 0 надо использовать хитрый алгоритм с епсилоном, при отличии погрешности от нуля эпсилон не нужен. Если не хочешь реализовывать хитрый алгоритм, можно просто запретить указывать нулевую погрешность.
В любом случае, не забудь вынести алгоритм сравнения в отдельную функцию с понятным названием.
Насчет строк, там тоже надо допускать вольность — в регистре букв и в пробелах. Может быть еще стоит игнорировать все, кроме букв и цифр, чтобы знаки препинания не влияли, но тут я не уверен.
> а какие размеры выставлять не знаю. По логике. Если размер зависит от ширины родителя — проценты, если не зависит — пиксели. em/en используются когда нужна привязка к тексту, например «блок, по ширине примерно равный 10 буквам».
Старайся как можно меньше ставить размеры и как можно больше использовать width/height auto; — когда ты захочешь изменить ширину блока, менять придется гораздо меньше кода. Все, что может определяться автоматически, должно определяться автоматически.
> Сколько времени ушло бы у опытного человека сделать такой макет? Часа 3-4 если делать старательно, я думаю. Если кое как то меньше. Хотя у меня всегда верстка получалась медленно, так как я старался все перепроверить и все сделать тщательно.
По картинкам: что-то картинки много весят. Ты разбираешься в форматах картинок для web (JPEG, GIF, PNG8, PNG24, SVG), знаешь их особенности? Если нет, надо изучить и поколдовать в фотошопе или другой программе с выбором подходящего формата и уровня сжатия. Ну и мыла смотри чтобы не было.
Иконки соцсетей внизу (которые рядом) стоит объединить в одну картинку с использованием css спрайтов: http://learn.javascript.ru/css-sprite (только без фанатизма)
Пункты меню, кнопки должны реагировать на наведение мыши.
Картинки, которые являются частью оформления сайта, надо вставлять не через img а через background-image. Тег img предназаначен только для иллюстраций, фотографий, рисунков, которые являются частью содержимого страницы а не частью дизайна.
Стиль text-align: center на body странный. Ты хочешь сказать, на всех страницах по умолчанию весь текст дложен быть выровнен по центру? В body задаются именно стили по умолчанию.
Когда задаешь шрифт, в конце списка всегда надо ставить один из стандартных шрифтов (serif, sans-serif, monospace и подобные).
В именах классов и id обычно используется минус, а не подчеркивание. Но это я просто информирую, это не ошибка.
> <p class="portfolio_title"> Это называется h2
Для контактной информации по идее есть тег address, может он тут пригодится?
Значки телефона и метки перед адресом удобнее всего сделать через background-image или псевдоэлементом и не засорять HTML.
>>396329 А, я разобрался, ну, короче, интерфейс и абстрактный класс похожи, просто я не мог понять почему, блять, там идет наследование опять, как и у интерфейса.
Вот у меня обращение личное к начальнику тредов о РНР. Что, блять, тебе трудно тред создавать самому? Ты же его мониторишь постоянно, совсем распиздяй?
Когда экранирую ввод данных в базу через execute(), то он ставит бекслеш перед каждой кавычкой. Судя по тому что этот бекслеш оказывается в базе данных, он ставит два бекслеша. Какого хера? Почему? Как убрать? гугл говорит про magic_quotes, я проверил phpinfo(), они отключены.
Если ты не очень разобрался, то лучше спроси, если непонятно, или книгу Зандстры перечитай.
абстрактный метод — это метод, у которого нет тела и который ты должен реализовать в потомке. Это похоже на интерфейсы, но это совсем другая вещь так как абстрактный класс — это класс (не до конца дописанный), а интерфейс — это набор требований к классу.
> почему, блять, там идет наследование опять Не понял вопроса, но абстрактный класс как раз для того и пишется, чтобы от него наследоваться. Если ты решал нашу задачу про Вектор или кошек-мышек то там это используется.
> огда экранирую ввод данных в базу через execute(), то он ставит бекслеш перед каждой кавычкой. Покажи простой пример кода. Интуиция подсказывает что все же какие-то magic quotes виноваты, там 2 или 3 таких опции.
>>396035 >Вот это называется «лезть внутрь» другого объекта Так, т.е в теле метода нужно использовать его This, либо его arguments? Все остальное нельзя трогать?
Есть какой-то объект. Есть 2 способа работать с ним:
1) напрямую читать и изменять его свойства 2) вызывать его методы
Способ 1 приводит к тому, что код изменяющий свойства размазан по всему проекту, в в способе 2 он содержится только в одном классе и очевидно код получается лучше, а классы изолированы друг от друга. Это называется инкапсуляция, и это один из принципов ООП (другие 2: полиморфизм и наследование). В нормальных языках есть слова private/protected чтобы закрыть доступ к свойствам извне, в JS нет, но можно на словах договориться так не делать.
Важность инкапсуляции становится особенно заметна, когда классов много: без нее получается не код, а спутанная лапша.
Соответственно, такого правила
> т.е в теле метода нужно использовать его This, либо его arguments? Все остальное нельзя трогать?
нету. Есть просто пожелание придерживаться принципов ООП (инкапсуляции) и использовать по возможности вызов методов вместо того, чтобы обращаться к свойствам другого объекта напрямую.
Я не очень понял вопрос, но может быть генерировать длинный сложный код, класть его в куку и в строку БД, а при попытке редактирования сравнить? Ты понимаешь, как куки работают и что это такое?
Код стал проще, но его по-прежнему много. Давай упрощать еще.
Вместо твоих сложных способов получить номинал очередной купюры лучше отсортировать массив купюр по убыванию (одной из функций http://php.net/manual/ru/array.sorting.php ) а потом перебирать купюры обычным foreach.
> if ($needed <= $bills[$bill]) { Вместо if тут можно использовать min/max
Наконец, у тебя echo стоит внутри цикла. Почему? Ты обираешься вывести надпись об ошибке и продолжать выполнять цикл? Это смотрится странно. В цикл помещают то, что выполняется несколько раз.
> foreach ($billsWeHave as $key => &$value) { Неопнятно зачем & перед value. И вообще непонятно, зачем нам нужна giveMeSmallerBill если есть цикл.
> function out($array) лучше переименовать $screen => $array, $array2 => $line, во-вторых, тут можно минимум один цикл заменить на implode.
> convert($value) Есть deg2rad и rad2deg — можно выпилить твою функцию вообще.
Насчет углов, если ничего не менять, то там по умолчанию 0° — это точка снизу и углы отсчитываются против часовой стрелки. Чтобы сделать по часовой, надо поменять знак перед cos или sin или уменьшать угол вместо увеличения.
И вместо 200° можно было сделать начальный угол (200 - 360) = -160°, а конечный 530 - 360 = 170°. Тригонометрию вроде бы изучают в школе, так что ты наверно это и сам знаешь.
Так, нормально, все остальное верно (я думаю, достаточно convert удалить и переименовать переменные и все будет готово).
>>396454 >Тригонометрию вроде бы изучают в школе, так что ты наверно это и сам знаешь. >tfw когда ты уже не школьник. >и уже не студент даже
>>396450 >echo стоит внутри цикла. Почему? Ты обираешься вывести надпись об ошибке и продолжать выполнять цикл? Брейк забыл. Это всмысле? Или вообще убрать?
>>396035 >и что за странная идея, хранить имя поля в константе? константы так не используют А как? Я же в прошлых задачах как раз для имен полей их и использовал.
Смотри, вот здесь я получается залезаю в чужой объект?: Field.prototype.getCellAt = function(x, y) { return this.cells[x][y][Field.MINE]; };
>>395787 Скажем есть у меня функция принимающая по ссылке, массивы arg1, arg2, arg3. При этом, мне нужно чтобы можно было вызвать эту функцию, с arg2 = 0. Это возможно без обьявления какой то $zero = 0 ?
> Я же в прошлых задачах как раз для имен полей их и использовал. Надеюсь что нет. Какой смысл заводить константу когда можно просто сдеоать cell.hasMine = true ?
> вот здесь я получается залезаю в чужой объект?: да
Ты неправильно спроектировал свою функцию. Во-первых, лучше не использовать & а возвращать результат через return. Во-вторых, если у тебя есть аргумент то в нем всегда должны передаваться данные одного типа, иначе это становится не код, а быдлокод.
Потому тебе надо переделать свою функцию, а не искать способы передать ноль по ссылке (это невозможно).
>>396480 >Ты неправильно спроектировал свою функцию. Во-первых, лучше не использовать & а возвращать результат через return. Во-вторых, если у тебя есть аргумент то в нем всегда должны передаваться данные одного типа, иначе это становится не код, а быдлокод. Мне нужно, чтобы когда я вызывал эти функции никаких ненужных копий не создавалось. Я не изменяю ничего в этих обьектах, я просто читаю их.
>>396484 >покпокпок преждевременная оптимизация Предлагаешь создавать копии кучи файлов при каждом вызове? Скрипт работает за 5 секунд с референсами, и час без них.
Ты знаешь что такое copy-on-write? В PHP и так если ты ничего не изменяешь то копий не создается. ты бы, голова дубовая, померял сначала профайлером где у тебя тормозит, а потом в оптимизацию лез.
>А нельзя ли просто в куках сохранять значения e-mail и по нему уж Тогда любой мамкин хакер впишет себе в куки чужой емайл. Надо генерировать код, не менее 32-х символов из набора не менее чем буквы (большие и маленькие) + цифры (это даст нам 62 ^ 32 = достаточно много комбинаций).
Это и есть уязвимость. e-mail — не секретная информация, не говоря уже о том что их можно перебирать. Делай нормально. А насчет кода — если плохо смотрится то исправляй пока не станет хорошо смотреться.
При сохранении данных в первый раз генерируешь код и сохраняешь его в таблицу и в куки. при попытке обновить данные в базе проверяешь у пользователя наличие кода.
По идее фреймворк состоит из отдельных компонент, и весь фреймворк тянуть необязательно, достаточно Zend_Db, но тогда надо знать, от чего зависит Zend_Db_select и соответственно не забыть его зависимости. Но скачать отдельно Zend_Db не уверен что возможно.
Я сейчас глянул, для ZF1 можно скачать Minimal Version (10 Мб) — но там не только Zend_Db а еще дофига всего.
Если ты не боишься перейти на ZF2 то там можно установить только нужный компонент: http://framework.zend.com/downloads/composer — composer сам подтянет нужные зависимости. В принципе, можешь использовать этот вариант — он и новее, и в случае использования композера вообще руками ничего качать не придется.
Композер также сгенерирует код для автозагрузки файлов фреймворка. Тебе останется написать один раз require_onece в своем коде и все.
Алсо, zend db 2 доступен на packagist: https://packagist.org/packages/zendframework/zend-db — это значит, что никакие репозитории прописывть в composer.json достаточно лиim прописать одну строчку (она есть на странице packagist).
>>395787 оп, я полный 0, хочу изучить php, у меня мак, скачал sublime text 3, открыл, вбил туда первую задачку, и в мою пустую голову поступил вопрос, что собственно делать дальше? как проверить правильно ли? а то там голый недокод и больше ничего, как запустить хз(
>>396480 >>396035 >if (this.getCellAt(x, y).hasMine())... Я сделал так, но чтобы не лезть внутрь объекта в getCellAt у меня не получается. Это же метод для того, чтобы получить ячейку? Кроме как написать return this.cells[x][y]; ничего в голову не приходит. И еще, нельзя чтобы метод и имя поля совпадали? А то у меня ошибка - уже и в файербаге все облазил, не смог разобраться. http://jsbin.com/lexuradadu/edit
PHP-лорды, такой вопрос: Всю жизнь работал с ебанутой связкой Зенда 1 и Смарти. Причем из Зенда юзался только класс работы с БД, а Смарти для шаблонов. Я вот не задумывался, передавал в шаблон смарти переменные из пхп и выходил такой код: [CODE] <h1>{$article.title}</h1> [/CODE]
Но вдруг у меня встал вопрос: а как в чистом PHP сделать шаблон? Не писать же ужас типа такого: [CODE] <?php $article = array('title' => 'Hi there!'); ?> <h1><?=$article['title']?></h1> [/CODE]
>>395442 > опечатки >Он у тебя ищет не опечатки, а любые английские буквы: http://ideone.com/CteSUA Просидел весь следующий же день над этим твоим замечанием, и не смог грамотно составить регулярку под все возможные случаи смеси русских и латинских символов в 1 слове. В общем где не просто 1 буква среди русских затесалась, а омск вроде +----+, ---+-++---, +++---+++, ---+-+-++ +--++--++++, где плюсы это латиница, а минусы кирилица. Хотя идея как сделать вроде бы была, и всего через одно "или" в регулярке, но всегда были ошибки в итоге. В итоге я задолбался и запил с горя дропнул аж на два дня вообще всё. Обязательно вернусь к этому замечанию позже.
>>395460 >(любое число пробелов)(знак препинания)(любое число проеблов) -> заменяем на (ничего)(знак препинания)(один пробел) Но как заменяющей функции передать какой там стоял знак припинания? Поэтому у меня и 4 принципиально схожих строки в коде с этим. Под каждый из вариантов.
>Код делающий первую букву заглавной, стоит наверно вынести в отдельную функцию. Зачем все одной портянкой писать.
Сделал в общем косметику и вынес в отдельную функцию код по увеличению первой буквы.
Тебе надо либо запускать в онлайн редакторе ideone либо установить PHP. На Маке, внезапно, в системе уже есть PHP (спасибо Джобсу) так что открой консоль (Terminal App, ищи в поиске) и набери что-то вроде
Чтобы не печатать каждый раз команду, ты можешь настроить в Sublime Build System для PHP, чтобы при вызове команды build запускался скрипт, но как это сделать? надо погуглить.
Но PHP который тебе установил Джобс, довольно старый. Там вполне может быть 5.3 а ведь уже 5.6 вышел. Чтобы поставить новый PHP придется покрасноглазить с консолью.
Поставить новый PHP (и другие консольные программы) можно либо через MacPorts либо через HomeBrew. У HomeBrew довольно модный сайт, думаю, разберешься: http://brew.sh/index_ru.html
Учти что HomeBrew ставит PHP в отдельную папку, а не заменяет системный. Это значит, что чтобы его вызвать, надо будет писать не php, а полный путь вроде /usr/local/bin/php или ~/homebrew/bin/php
Неверно. Сборки рассчитаны на опытных программистов, которые все умеют ставить и которым лень с этим возиться. Новичок должен поставить себе Апач + PHP сам.
> Я сделал так, но чтобы не лезть внутрь объекта в getCellAt у меня не получается Не понял
> Это же метод для того, чтобы получить ячейку? Кроме как написать return this.cells[x][y]; ничего в голову не приходит Ну и нормально. Ты же обращаешься к свойствам своего объекта, а не чужого.
> И еще, нельзя чтобы метод и имя поля совпадали? В JS метод это и есть поле, в которое записана функция. Там нет разделения на поля и методы на уровне языка.
> this.cells[x][y].hasMine = false; Это можно (нужно) перенести в конструктор класса Cell. Пусть он сам выставляет свои свойства.
Ошибка (видна в консоли jsbin): "TypeError: this.getCellAt(...).hasMine is not a function (line 117)"
У тебя hasMine не является функцией. Тебе надо переименовать свойство hasMine например в _hasMine
Пойдет, но зачем такие низкие цели ставить? За 3 года PHP можно выучить очень хорошо, и успеть джуниором поработать и гораздо большего добиться. При желании не выходя из дома.
Вопрос не по теме, но как вы начали зарабатывать на фрилансе? Даже на самые простые задания штук 30 волонтёров, причем некоторые с портфолио. Еще не понимаю за каким хуем грошовая работа по 10рублей требует бизнес-аккаунта?
Апплайся на все, что можешь сделать, пиши в личку если заказчик не против, будь убедителен. Но вообще, фриланс не для всех подходит. Если ты можешь сделать что-то полезное и тиражировать для многих заказчиков (то есть много времени на каждого не тратить) — хорошо, а если ты каждый раз все делаешь с нуля, то много ты не заработаешь и большую часть времени будешь тратить на поиски и общение с заказчиками разной степени адекватности. В таком случае лучше постоянную работу искать.
> Могу ли я в качестве аргумента передать методу openCell() - field1? Это не очень логично, почему ты поле на котором находится клетка передаешь в функцию ее открытия? Логичнее передать в конструктор при создании либо перенести метод openCell в Field. А в Cell передавать только цифру.
Какие есть годные, и для каких размеров проектов? Чем один лучше другого? Желательно вид со стороны менеджера, типа: "вот заебошили проект на 1к часов на Yii, заебались с Active Record"; "Laravel это не просто тренд, мы на нем проекты по 600 часов уже второй год пилим и все здоровы, зависимость есть"; "Делаю визитки на Zend, подходит идеально, потому что ..."
> что если я беру случайное число, шифрую его, и записываю в куки, сверяя при редактировании. Шифрование с одним общим паролем вообще опасно тем, что при утечке одного пароля, который хранится в коде, злоумышленник получает доступ ко всем пользователям.
Насчет кода — это общепринятый подход, например при восстановлении пароля на почту: генерируется код, сохраняется в базу и высылается на почту в виде ссылки.
>>396386 > Покажи простой пример кода. Интуиция подсказывает что все же какие-то magic quotes виноваты, там 2 или 3 таких опции. Еще раз посмотрел пхпинфо, теперь одна опция включена. Отключил в .htaccess - помогло. Первый раз как я смотрел, непонятно.
>>396266 > Соответственно тебе не нужен будет foreach и не придется использовать костыль в виде передачи position туда-сюда. Пожалуй так разумней. Хотя позицию надо будет где-то сохранять все равно, но без циклов зато. > Вот это очень неэффективно, преобразуем токены назад в текст, а текст снова парсим. Так делать не надо. 2-й флаг определяет токенизирован он или нет. Он не превращает обратно в чистый текст, а наоборот освобождает от токенизации, потому-что уже разбит на токены. > Также, объект токенайзера обычно передается в парсер в качестве исходных данных.
> Для каждого тега позже стоит завести свой класс (а в парсере — соответствие имя тега -> имя класса). Тогда можно будет легко добавлять новые. Непонял. Как выглядить должно? Как взаимодействовать? >>396267
> Ну и пока твой парсер не соответствует алгоритму recursive descent так как в этом алгоритме мы имеем набор функций, каждая из которых умеет парсить какую-то часть синтаксиса целиком и возвращает узел дерева как результат. Ну то есть у нас могут быть методы типа:
> parsePlainText() // парсит кусок текста без тегов и возвращает текстовый узел > parsePairTag() // парсит код от открывающего до закрывающего тега и возвращает узел-тег > parseSingleTag() Так ты же сказал наоборот все за один проход надо проверять. А как это тогда сделать? Каждый токен пропускать через все парсеры, а в парсерах делать фильтр на соответствие токена? Это уже отдельный класс, только с фильтрацией на всех парсерах. Не разумней ли тогда её сделать один раз в начале и вызывать только нужный парсер? Или ты что-то другое имел ввиду? Что?
Я полный ньюфаг в php, некогда читать мануалы, надо прямо сейчас написать кое-что заказчику (к проекту нужна простая веб-морда). Есть у меня один php-файл, который выводится на сайте вместо html (http://www.php.su/php/intro/?2 пользовался этим). Там есть поле для ввода и кнопка. Как сделать так, чтобы пользователь ввел что-то, нажал на кнопку, и этот текст отобразился ниже? Везде вижу мануалы с штуками типа <form action="action.php" method="post">, но мне не нужен никакой action.php, мне нужно реализовать в рамках одного index.php. Как это сделать?
>>396905 <form action="" method="post"> Хотя советуют делать: <form action="<?php echo $SERVER['PHP_SELF']; ?>" method="post"> В файле та часть которая выполняется при post запросе можно сделать просто в виде if (SERVER["REQUEST_METHOD"] == "POST") processQuery();
>>396910 Вот так вот что ли? [CODE] echo '<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">' echo '<input type="text" name="text">' echo '<input type="submit">' echo '</form>' [/CODE] или одинарные кавычки тут нельзя?
>>396926 Еще и <?php внутри <?php. <?php - это откуда начинается php код, очевидно открытие когда он уже открыт - ошибка. То что ты написал надо выводить так: <html> <head> </head> <body> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method='post'> <input type='text' name='text'> <input type='submit'> </form> ?> </body> </html>
Плохо что ты берешься за заказы не выучив язык. Ничего хорошего из этого не выйдет. В итоге на поиск решения и исправление ошибок времени уйдет больше чем ушло бы на изучение.
Не очень понял задачу, но если надо что-то показывать по нажатию кнопки то проще всего сделать это на яваскрипте.
>>396936 А это должен быть файл index.html или index.php? >>396938 Да этого и не было в рамках заказа, просто теперь заказчик захотел прикрутить простенькую веб-морду за доп. плату, ну а я подумал, что наверно разберусь быстро. Ладно, я тогда лучше изложу работу полностью. Пользователь хочет, чтобы он мог через сайт исправлять содержимое одного txt файла (к нему потом обращается моя программа, но это не суть) на сервере. Файл имеет такой вид: переменная1 = строка1 переменная2 = строка2 ... Нужно, чтобы пользователь зашёл на сайт и видел перед собой таблицу, где каждая строка отвечает за соответствующую переменную. Т.е. в первой строке таблицы в первой колонке будет написано "переменная1", во втором столбце текстовое поле, в третьем кнопка "изменить значение". Как сделать массив из строк файла и разбивать эти строки на "переменная1" и "строка1" я уже понял, осталось сделать эти формочки. Извините, что такой даун и не изучаю язык сначала, но вот так вот приходится, времени в обрез.
>>396961 Хотя бы вот с этим: у меня в цикле создаются кнопки; как сделать так, чтобы value у i-той кнопки было равно i? примерно так for ($i = 0; $i < 104; $i++) { <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"> <input type="submit" name="okbutton" value=$i> </form> }
<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { echo $_POST['okbutton']; } ?>
>>396944 B зачем формы? $txtContent = file_get_content('txt.txt'); $rows = explode($txtContent, "\n"); foreach ($rows as $row) { $varArray = explode($row, " = "); $variables[$varArray[0]] = $varArray[1]; } Будет у тебя $variables в которой ключи будут переменными а значения стобственно их значениями. Может и еще проще надо, я тоже нуб.
>>396984 Это работает не так. Сначала ты находишь время на базовый синтаксис. Ну час хотябы. Ну полчаса хотябы. Потом пишешь код. Я слежу за тобой, ничтожество.
>>396988 Простейший, набросанный краешком залупы, быдлокодерский вариант чтения. Добавить обработку кнопки и сохранение, а не только чтение. Подпилить теги ????? Заказ готов.
>>395787 Sup, /pr/. Есть одна задача и тупой анон. Задача состоит в целом: рассчитать календарь на текущий месяц через getdate. В гугл идти не хочу, но может кто-нибудь мне помочь, с чего начать?
>>397089 Это как, ну вот захотел я решить твою задачу, а условие то не ясно, алсо если много ранить этот код http://ideone.com/YjXxQl то становится похоже что там минимум два сервера
Я не менеджер так что с этой точки зрения не скажу, но советую смотреть на известность и коммьюнити — так как это значит что легче найти разработчиков и больше готовых плагинов и решений.
> Хотя позицию надо будет где-то сохранять все равно Внутри объекта Tokenizer поле сделай
>> Для каждого тега позже стоит завести свой класс (а в парсере — соответствие имя тега -> имя класса). > Тогда можно будет легко добавлять новые. Непонял. Как выглядить должно? Как взаимодействовать?
> Так ты же сказал наоборот все за один проход надо проверять. А как это тогда сделать? Так и будет. Смотри, у тебя сейчас код такой:
foreach ($tokens as $token) { // пишем весь код внутри цикла и придумываем хитрые костыли вроде пропуска части токенов }
А будет объект Tokenizer который хранит внутри позицию в списке токенов и у которого есть методы вроде «получитьТекущийТокен», «являетсяЛиТокеномТипа» и тд. И код будет выглядеть так:
.... while (!$this->tokenizer->isNextToken(T_END_TAG)) { $content[] = $this->tokenizer->getNextToken(T_TEXT); } ....
Сам посмотри, это дает гораздо больше свободы. И массив токенов остается внутри объекта Tokenizer тем самым реализуя инкапсуляцию.
Не надо смешивать PHP/html в одном файле, не надо читать файл через fgets когда есть file() и parse_ini_file(). Не надо наызвать переменные var или array. Ты наверно по устаревшему учебнику учился.
Ну и этот код будет глючить от наличия = внутри значения, а от двойной кавычки он вообще сломается. Ошибка на ощибке.
> Почему mt_rand(001, 999) генерирует иногда число не из 3х цифр, а меньше? Потому что 001 и 1 это одно и то же. Число — это количество чего-то и 001 баран это то же самое что и 1 баран.
Чтобы нули не терялись, надо использовать строки для хранения номеров. Строка хранится как набор символов и "001" и "1" это разные строки. Но естественно, передать строку в mt_rand нельзя и нельзя делать со строками математические операции (точнее можно но PHP преобразует строки в числа в этом случае).
Попробуй понять разницу между числами и строками. Это разные типы данных.
такая проблемка, использую пхпсторм, значит, пришел на работу(первый рабочий день на этой работе), стянул их сайт, у меня не отображаются комментарии на русском, ну и вообще русский шрифт, гуглил, мудрил, положил хуй. в итоге нужно было отредактировать файл со всеми функциями сайта. ну я там поправил, сохранил. и!!! сбилась кодировка на сайте, такой ад, я чуть в штаны не наложил. Пришлось бекап делать. Как быть? на сайте кодировка WINDOWS-1251, насколько я понимаю. Как сделать её читабельной в пхпсторм? и чтобы таких историй больше не было? буду благодарен за совет
Спасибо вам, аноны, я более-менее разобрался, покурил много мануалов. Сдал код заказчику, всё работает. Быдлокод пока, но потом буду изучать PHP поглубже. >>396905-кун
>>397217 Кстати, если у меня на сайте есть этот скрипт, который меняет содержимое какого-то важного файла, и находится он в site.ru/scripts/script.php, при этом директория site.ru/scripts недоступна для чтения для невладельца, то есть риск того, что какие-нибудь спам-боты таки найдут мой script.php и нафигачат туда всякой левоты, испортив файл (бекапы делаю, но всё же)?
Ты же вроде писал что ООП знаешь? Класс Node_Tag_B очевидно унаследован от Node_Tag (абстрактный класс, представляет собой любой тег), а тот унаследован от Node (абстрактный класс, представляет собой узел дерева).
У узлов главное свойство — это дети и родитель. За счет этих свойств узлы связываются в дерево. Мы вроде говорили, что в итоге лучше сделать дерево на ООП, а не на страшных вложенных массивах.
> как к ним обращаться? В ходе парсинга ты их будешь только создавать через new ну и может будешь им детей добавлять.
Или ты про другие классы спрашивал? Уточни вопрос если что-то непонятно.
>>397192 Спасибо, не хотелось конечно пользоваться подсказками, в итоге вот что родил спустя два дня ебли. Он всё еще чем-то недоволен, но я уже не знаю что ему не нравится в 45-й строке. http://ideone.com/YjXxQl
так как я рад что справился, то победные 4 картинки
господа, влетаю в тред с тупым вопросом. начинаю знакомиться с пхп на codecademy делаю простейшие задания на циклы почему он ругается на хуйню на пикче? говорит, нет скобок, но они же есть!
>>397316 Кстати, задание какое-то не логичное, написано the loop ran even though loop condition is false, хотя loop condition как раз таки true, если не поменять значение переменной, или я чего-то недопонимаю?
>>397333 Слева в задании написано лишь добавить скобки и точку с запятой где нужно и цикл пройдет лишь одну итерацию, но это не так судя по коду. Либо >>397316 поменял значение переменной, прежде чем заскринить, либо там ошибка.
>>397341 Не заставляй меня регистрироваться на этой параше и выяснять что к чему. Просто поставь в условии while ($loopCond == true) и скажи, что получилось.
Короче, ты немного наебал нас, вот так изначально выглядел код (то бишь ты все таки изменил условие поставив == false) и вот каким он должен быть. Наконец-то я могу пойти спать.
>>397351 блиаааааать! чувак, ты меня спас. теперь сам не могу понять, какого хуя я туда наебенил фолс. спасибо. извините за такую хуйню, я не специально
И да, твой код тоже правильный, просто условие задачи не подразумевало ставить == true ($loopCond) это тоже самое, что ($loopCond== true), просто скрипт проверяющий ответы на сайте такой ответ не принимает.
Опчик, если ты еще жив, сто лет те не писал, но раньше ты мне очень помог выучить язык. Хочу узнать у тебя или другого анона такую вещь: как отдавать файлы на скачивание?
Есть файл, нпр картинка .jpg, нужно на странице инициировать обычный диалог для скачивания браузером. Никак не могу нагуглить как это сделать.
Никогда не вставляй переменные в запрос напрямую. Используй плейсхолдеры. PDO например их поддерживает.
>Вообще это нормально, что я ищу решения гуглом, Нормально, но потом покажи код, так как в гугле много плохого и неправильного кода.
> С пагинацией так и вышло, кстати. Это ты не знал, потому что ты не изучил возможности MySQL. На будущее, вот тут есть список вещей которые надо потом изучить: https://gist.github.com/codedokode/10539213 если хочешь нормально разбираться в базах данных. Если ты совсем ничего по ним не знаешь (а так скорее всего и есть) то прочти хотя бы
Согласен, задание запутывает. Я сам не понял, что именно там надо сделать — но мне кажется, надо добиться чтобы код в цикле выполнился ровно один раз. Например поставить false вместо условия в скобках или заменить == на !=
Также, там где-то есть ссылка на форум, наверняка другие уж заметили что с заданием что-то не так, может там написано что делать.
Он не говорит, что нет. Он говорит «может ты их забыл?». Это скорее всего стандартная фраза, вбитая туда на неправильный ответ, а суть задания как я понял только в расстановке скобок. Ты наверно код переделал а не надо было переделывать, надо было только скобки и точку с запятой расставить.
Потому видимо надо оставить в скобках неграмотный код с = вместо ==. Но только не вздумай такой код писать в реальных проектах.
для новичков в Линуксе: команда rm -rf / пытается удалить все файлы на всех дисках, а sudo добавляется чтобы команда выполнялась от администратора (от пользователя систему снести не получится, только свои файлы и настройки, и все остается работать).
Дебиан предпочитает не самый новый софт, а надежный и протестированный годами. Обычно обновление ничего не ломает, если ты сидишь на стабильной версии. В debian 7 stable сейчас версия 5.4: https://packages.debian.org/ru/wheezy/php5
(если у тебя squeeze то надо сначала обновиться до wheezy очевидно).
Но PHP вышел уже 5.5 и 5.6. Как получить их? есть варианты.
— Можно обновиться на более новую и менее проверенную версию (jessie = testing или sid = unstable если не страшно).
Программирую на плюсах, но тут решил к пхп присмотреться, а конкретно к замечательным урокам. Задачка про айфон в кредит полностью фимозная. Зачем давать изначально неверный вариант задачи (я не имею ввиду, что надо новичкам дописывать и доделывать, а сам метод выбран абсолютно глупый)? Подсказка к ней тоже идиотская - зачем проверять счетчик с 5000 тысяч, если школьник выплачивает после этого эти же деньги и у него остается долг? (считал на бумаге специально). Мне пришлось полностью переделывать под нормальный алгоритм. Тут меня закидают говном, но я видимо настолько тупой, что даже не мог доделать дурацкую программу. Поэтому прошу Богов пыха кинуть мне рабочий вариант программы - именно как надо было "исправить и переделать".
$message = " <html> <head> <title>Исправлена ошибка на сайте</title> </head> <body> <b><p> Уважаемый <? echo $user_name; ?> , Спасибо за Ваше замечание относительно работы сайта и т.д
</p></b> </body> </html>";
mail($user_mail, $subject, $message, $headers); // тут отправляется но почему-то я не могу вставить в хтмл разметку письма переменную, хотя делаю всё как обычно. Тут нужно как-то её особо экранировать, потому что она как бы пхп в хтмл,а в этом хтмл пхп?
Котаны, пишу стековый калькулятор, для познания ООП. Вот описал первый класс, который отвечает как бы за тело стека, всё норм. Как дальше подойти и что делать не знаю. Пусть будет второй класс отвечающий уже за операции и всё такое, но как их подружить и сделать взаимодействовать я пока не понимаю.
У тебя довольно так и бессмысленный код. Методы разбросаны наугад без всякой логики. В чем например смыл этого метода: createStack() если он никак не взаимодействует с классом Calc?
В pop() логичнее выбрасывать исключение при пустом стеке.
Ты изобретаешь велоипед. И если ты хочешь освоить ООП, ты выбрал не лучший пример, так как стековый калькулятор проще сделать в виде одного класса СтековыйКалькулятор (с методами положитьНаСтекЧисло(), выполнитьОперацию(), и тд). В акчестве стека можно использовать массив или SplStack.
Если ты хочешь хороший пример, то лучше написать полноценный парсер математических выражений вида
2 + 4 sin(1.3)
в дерево (AST) и его вычисление затем. Тут тебе понадобится больше классов: Токенайзер, Парсер, классы для узлов дерева (Число, Сумма, Синус и тд).
>>397566 >У тебя довольно так и бессмысленный код. Методы разбросаны наугад без всякой логики. В чем например смыл этого метода: createStack() если он никак не взаимодействует с классом Calc? Это я "эксперементирую", что бы понять как это сделать правильно. >В pop() логичнее выбрасывать исключение при пустом стеке. Я не понял твое высказывание, разжуй пожалуйста. > Ты изобретаешь велоипед. И если ты хочешь освоить ООП, ты выбрал не лучший пример, так как стековый калькулятор проще сделать в виде одного класса СтековыйКалькулятор (с методами положитьНаСтекЧисло(), выполнитьОперацию(), и тд). В акчестве стека можно использовать массив или SplStack. Я и делал сначала всё это дело 1 классом, но потом опытный товарищь сказал что тут должно быть их много. И в классе отвечающем за тело только поп, пуш и проверка. >Если ты хочешь хороший пример, то лучше написать полноценный парсер математических выражений вида
>2 + 4 sin(1.3)
>в дерево (AST) и его вычисление затем. Тут тебе понадобится больше классов: Токенайзер, Парсер, классы для узлов дерева (Число, Сумма, Синус и тд). Обязательно займусь, но сначала хочется решить задачу попроще. Бросать то что я делаю и делать другое? Спасибо за ответ.
Прошу помочь с проблемами новичка. Я ебусь с ними уже 2е сутки, и ничего не могу понять. Сначала установил мускуль, как написано в документации. Вроде бы все работает, localhost:3333 отвечает(задал в инстолере), но при попытке запустить mysql.exe вылетает "can't connect to server". На оф. сайте написано, что проблема в том, что не запущен сервер. Вообще охуеть. Это еще хуй с ним, мне необходимо настроить работу с пхп. Попробовал mysqli и pdo, но и то, и другое выдавало fatal error. Почти все туториалы начинаются со слов "предполагая, что вы все установили и все работает, ...", гугл вообще какую-то хуиту выдает, в стэковерфлоу написан миллион вариантов, но ни один не работает. В оф.документации сказано только как работать в интерактивном режиме, но он и не запускается даже. Прошу кого-нибудь растолковать все по пунктам, что куда нужно писать и тыкать, чтобы уже можно было начать работу с мускулем.
Заметь, что файл my.ini используется и клиентом и сервером, и разделен на секции. Часть настроек соответственно будет прочитана только клиентом, а часть только сервером.
> Попробовал mysqli и pdo, но и то, и другое выдавало fatal error. А текст ошибки? Тот же? Так при соединеии ты тоже должен указать номер порта. Как он его угадает, ты думашь PHP твои мысли умеет читать?
Надо в DSN (что такое DSN? это строка с адресом к которому должен подсоединиться PDO) дописать порт и там для этого есть опция:
>>397626 Благодарю, если запускать через --port=3333, то интерактивный режим запускается. Но у меня нет файла my.ini, там только my-default.ini, и раздела [client] там нет, только [mysqld]. Там тоже можно прописать port=3333, но это не работает.
>>397632 >Если бы ты изучал сетевые технологии и сокеты, тебе бы было это все очевидно Изучал и знаю, даже сделал чатик на сокетах на питоне.
>текст ошибки Было просто "fatal error in D:\...\...php on line 9" но потом я что-то интуитивно потыкал, теперь фатал еррор исчез. Пока попробую еще погуглить немного, за помощь спасибо. И да, порт я прописывал.
Еще, если можно, подскажите, как запускать мускуль-сервер. Он уже установлен, но когда тыкаешь в notifier тыкаешь start, выскакивает "The service mysql was not found in windows services". Гугел опять нихуя не находит.
>>397664 У меня последнее предложение специально было написано, чтобы гугл не предлагали. Но уже похуй. В общем, я все переустановил все по новой со стандартными данными, теперь все отлично работает.
Какие параметры можно указать, написано по ссылке выше.
А теперь сделай var_dump("mysql:host=$host") в своем коде и посмотри что выведет. Он не соответствует требуемому формату.
Кстати, имя базы данных надо указывать тоже в DSN.
И кстати, try/catch писать не надо. Это какой-то неграмотный код. Исключение и так по умолчанию завершает программу и выводится на экран, если у тебя не отключено отображание ошбок (отключено? Включи display_errors = On в php.ini).
> Он уже установлен, но когда тыкаешь в notifier тыкаешь start, выскакивает "The service mysql was not found in windows services" Ты неправильно что-то установил, например выбрал опцию «установить только для меня» и из-за этого установщик не создал службу mysql (службы в windows — это программы, которые выполняются в фоновом режиме и могут автоматически запускаться после загрузки. Увидеть их список можно, сделав Пуск -> Выполнить -> services.msc ).
> розовым подсвечивает Намекает что код сомнительный и лучше бы это место переписать.
Второй код, который компактнее, хороший, только внутри строки все же наверно не стоит такие сложные конструкции городить, а стоило сделать через переменные:
Проще наверно переменные вставлять в строку, хотя конечно сложные выражения может и через printf проще писать. Но мне он не нравится тем ,что с utf-8 не работает (выравнивание например так как он считает байты, а не символы).
ананасы, прошу помощи. Подскажите рабочий код. Суть в том, что есть поле в БД типа count, каждый месяц это поле должно умножаться на 0,1 автоматически.
>>397771 немного подробностей на хостинге крутится сайтик, движок wordpress, плагин buddypress. Создал кастомное поле в этом плагине, теперь это кастомное поле должно расти раз в месяц на 10%, т.е. 0,1. Это поле выводится в "Личном кабинете", хотелось бы там и организовать пересчет.
>>397805 Всё в порядке. Я тоже сказочный слоупок, в начале лета начал учить пых, сейчас дошел до регулярных выражений, осваиваю, вот. Учу потом и кровью, страдаю, превозмогаю.
>>397818 >>397805 Это хуйня. Пхп еще нормальный язык. Я вот, сейчас, параллельно по ЖС почитываю - вот это днище. Пригорает постоянно. Вчера, вот, вычитал, что свойство length - это не то, что ты думаешь для массива, а ключ последнего элемента - 1. Ну что это за пиздец? Я не дохуя кодер, но у меня этот ваш жабаскрипт уже вызывает тысячи ненависти. У меня уже такое устойчивое ощущение создалось, что везде, в каждой функции, можно обосраться и отстрелить себе пол-туловища. "Там используй, а там не используй". Охуеть. Чтобы сделать то, что в пыхе требует всего лишь стандартной функции, тут требует построение уродливого велосипеда из говна и палок. Извращения, блядь какие-то. Ебанул delete - остались запятые. Какого хуя? Запятые - это что, элемент объекта, блядь? Да-да, я знаю, что нужно использовать другую функцию... Для йоба-гуру джаваскрипта мой пост, может, и выглядит бугуртом неосилятора, но у меня такое ощущение, что js какой-то... недоделанный что-ли. ОП, насколько я прав и что не так?
>>397828 >Для йоба-гуру джаваскрипта мой пост, может, и выглядит бугуртом неосилятора Да, так и есть, ты школьник который начитался в интернете всякого шлака, нихуя не понял, а теперь бугуртишь. И да, у меня бугурт от таких даунов.
Но все знают, что ты просто зелёный и очень толстый
>>397828 1) Любой код проверяй в jslint. 2) Почитай javascript the good parts, там автор объясняет, что жс был сделан в спешке и поэтому там дохуя ошибок дизайна. Книга посвящена частям жс, которые можно использовать, не опасаясь выстрелить себе в ногу. 3) javascript design patterns тоже вроде норм. 4) Чистый жс мало кто использует, обычно используют jquery, а в ней очень много удобств. 5) Можно использовать языки, которые транслируются в жс. Например, кофескрипт имеет синтаксис в стиле руби. Для всех популярных языков такое есть, даже для хаскеля есть purescript или че-то типа того.
>>397818 Нахуй вы хуйней занимаетесь, пиздуйте сразу клепать сайтики, то что вы делаете не поможет вам в работе, лучше потратить время на изучение какого нибудь фреймворка, будет больше пользы.
>>397189 Нихрена не понял опять. Вот я сделал методы getNextToken($expectedType), getCurrentTokenType(), еще сделаю, если надо что будет. Начинаю делать парсер. Пишу: $parsedText = []; while ($token = getNextToken(array(TOKEN_WHITESPACE, TOKEN_CLOSE_TAG, TOKEN_CLOSE_BRACKET, TOKEN_STRING))) consumePlainText($parsedText, $token); А дальше снова надо проверять, если сингл таг, то парсировать сингл, если парный - парный и т.п. Теже if или switch, или это норм? А зачем для каждого тега свой класс я хоть убей не могу понять, что них прописывать, какие свойства, какие методы, если от них нужно только название для валидации. Типо парные теги: "1, 2, 3", сингл теги: "6, 5, 4". ЧТО МНЕ С ЭТИМИ КЛАССАМИ ДЕЛАТЬ?
>А дальше снова надо проверять, если сингл таг, то парсировать сингл, если парный - парный и т.п. Теже if или switch, или это норм? Я не очень понял, но мне кажется нет. То есть там будет где-то if или switch но не надо все помещать в одну огромную функцию.
> А зачем для каждого тега свой класс я хоть убей не могу понять У тегов разные свойства, разный набор аттрибутов, они генерируют разный HTML-код. Логично по моему сделать для них разные классы по этой причине. Также потом могут добавиться условия типа тег A можно размещать только внутри тега B. как ты это будешь делать без классов? Лапшой из кучи ифов?
На сколько? Померяй для начала. А потом подумай, сколько времени теряет человек из-за более трудночитаемого кода из точек и кавычек. И сколько времени на исправление случайно забытой точки или кавычки.
Потому таких микрооптимизаторов надо гнать из профессии.
> что свойство length - это не то, что ты думаешь для массива Потому, что массивы бывают разные. Если ты изучал PHP то там массивом называют упорядоченный ассоциативный массив, то есть массив в котором могут быть любые ключи и элеменыт могут идти в любом порядке. Но бывают в других языках и «настоящие» массивы или «векторы».
Это числовые массивы, где ключом может быть только число от 0 до N, пропускать ключи нельзя и они всегда идут по порядку (например, 0, 1, 2, 3, 4 ... N).
В JS как раз 2 вида массивов — это ассоциативный массив (или словарь), который создается через {} и вектор, который создается через []. В отличие от PHP, он неупорядочен то есть порядок элементов при переборе в нем случаен и не определен.
Если ты добавляешь в настоящий вектор элемент с ключом 1000, то создаются и элементы 0 ... 999. Потому length равно 1001. В JS тут чуть хитрее: length увеличивается, но элементы не создаются автоматически. Такие массивы с отстустсвющими элеиментами — источник проблем и ошибок, потому делать их не стоит.
Так как в векторе по задумке ключи идут строго по возрастанию, то свойство length работает корректно.
Заметь, что в яваскриптовый вектор можно добавлять в том числе текстовые ключи. Это потому что он основан на словаре. Но такие ключи не меняют свойство length.
В общем, надо знать как устроены эти структуры и проблем не будет.
> В отличие от PHP, он неупорядочен то есть порядок элементов при переборе в нем случаен и не определен.
Это в словаре. В массиве-векторе как раз все упорядочено.
> Ебанул delete - остались запятые. Какого хуя? Запятые - это что, элемент объекта, блядь? Это ошибки в твоем коде какие-то.
> ОП, насколько я прав и что не так? В JS есть конечно и недостатки, но все то, что ты перечислил это лишь твое незнание. Читай статьи, учебники и исправляйся.
Я бы советовал jshint, он поновее и у него всяких опций больше.
> Чистый жс мало кто использует, обычно используют jquery, а в ней очень много удобств. jQuery — DOM библиотека и используется лишь для взаимодейcтвия с этим DOM, а не для всего подряд.
> Например, кофескрипт имеет синтаксис в стиле руби. Ничего кроме отступов и доветочий (+ синтаксис для классов) он не приносит. По моему, это плохая вещь, так как реальная причина — желание чтобы код выглядел как Руби. А это напоминает нездоровый фанатизм.
Мне например он не нравится и кажется плохо читаемым, особенно плохо смотрится стрелочка -> которая обозначает сразу несколько вещей.
Ворвусь с задачкой по SQL про лайки. Таблицы две: users (поля id и name) и likes (поля like1 для того, кто лайкнул, и like 2 для того, кого лайкнули). Запрос: SELECT DISTINCT users.id as cur_id, users.name, (SELECT COUNT() FROM likes WHERE like1=cur_id) AS "Поставил лайков: ", (SELECT COUNT() FROM likes WHERE like2=cur_id) AS "Получил лайков: ", (SELECT COUNT() FROM likes WHERE (like1=cur_id) AND (like2 IN (SELECT like1 FROM likes WHERE like2=cur_id))) AS "Взаимных лайков: " FROM users, likes ORDER BY cur_id
>>397828 Меня тоже жабаскрипт раздражает, знаю его совсем чуть-чуть, начинал учить, но бросил нахуй. Сейчас для задания понадобился ангуляр - создалось впечатление, что годен только для отдельных задач, которые красочно показаны в их примерах. Попытался ебануть регу к рест сервису - охуел с того, какой велосипед делается, и какие скудные у ангуляра доки.
>>397942 не увидел вопроса, просто дам добрый совет. Заведи себе отдельную табличку likeSosike с полями id, "лайков поставил", "лайков получил", "взаимных лайков". Заполни и потом пусть она периодически пополняется новыми пользователями и для старых обновляется количество (раз в пять минут, например, можешь чаще, можешь реже). Соответственно и получай нужные данные оттуда, а не подсчитывая все лайки каждый раз, как пользователь захочет статистику получить. Да, пользователи не смогут моментально вздрочнуть на новые лайки, но и сервер тебе запросами к таблице лайков не положат.
>>397907 А, ты предлагаешь вместо дерева в виде массива которое я сделал в первый раз, сделать дерево в виде классов? И чтобы все узлы были отдельными объектами абстрактных классов своего типа?
>>397905 > Нам надо сделать на каждую конструкцию выше свою функцию для разбора. Ну т.е. все равно нужнен общий метод, который будет определять какой токен. Только ты предлагаешь даже не просто определять какой токен (и, например, если это открывающий тег, запустить функцию парсинга тега, которая будет искать закрывающий, и если найдет, поглотит, если нет, примет токен за текст и запустит поглощение токена как текст), А определять целые конструкции. С методами getNextToken(), getTokenType() и т.п. не представляю как это адекватно сделать. Надо будет читать следующие токены, а предыдущие оставлять в какой-то кэш, и если найду закрывающий запускать парсер тегов, если нет поглотить токены из кэша как текст. Это уже совсем на костыли похоже. Понятно, что ты не это имел ввиду. Что-то у меня с думалкой беда совсем.
>>397966 >Да, пользователи не смогут моментально вздрочнуть на новые лайки, но и сервер тебе запросами к таблице лайков не положат. Так то оно так, но задача же была составить запрос и вывести. Учебная же задача, а не практическая.
>>397986 не увидел, что задача учебная. И условия задачи тоже не видел, тред не читал. Даже в таком случае, во FROM users, likes - likes лишнее, сооответственно и DISTINCT можно убрать.
Подумал я тут давеча, лох что ли, пользоваться всякими готовенькими MAMP. Настоящие кодеры ставят все руками. В итоге после целого дня консольной ебли понял, что я ебаное дно. Поставил MAMP обратно.
>>398005 >В итоге после целого дня консольной ебли понял, что я ебаное дно. Я просто поставил на второй комп убунту, прописал три команды и все работает. Но зачем - не понял. Юзаю xampp.
>>398000 В общем, смотри, как это примерно происходит 1. происходит cross join таблиц users и likes - при этом, поскольку нет никаких where, у тебя будет просто дохуиллион абсолютно бессмысленных строк, где id из users будут соответствовать id1 и id2 из likes, не имеющие к нему никакого отношения. 2. Для каждой строки из п.1 будет выполнено по три запроса к таблице likes (твои подзапросы), причём для каждой строки с одинаковым users.id эти значения будут одинаковыми (не важно какие там id1 и id2 в этом наборе). 3. DISTINCT приведёт всё это безобразие к нормальному виду, выкинет лишние строки.
т.е. есть у тебя таблицы users (id | name): 1 | u1 2 | u2 3 | u3
likes (id1|id2): 1 | 2 1 | 2 2 | 1
в п.1 сервер собирает следующий набор: users.id| users.name| likes.id1| likes.id2
и потом distinct убирает дубли (id1 и id2 я сюда добавлял для наглядности, на самом деле их нет и distinct будет ужимать вот такое: 1|u1|2|1|1 1|u1|2|1|1 1|u1|2|1|1 2|u2|1|2|1 2|u2|1|2|1 2|u2|1|2|1 3|u3|NULL|NULL|NULL 3|u3|NULL|NULL|NULL 3|u3|NULL|NULL|NULL ), в итоге получишь:
1|u1|2|1|1 2|u2|1|2|1 3|u3|NULL|NULL|NULL
Тоже самое гораздо лучше будет получить, просто из таблицы users и подзапросов.
>>397639 >> if (x === 0 || x === (this.width + 1) || y === 0 || y == (this.height + 1)) {
>Не понимаю, зачем так сложно делать? Зачем лишние ячейки? Костыли какие-то? Тогда лучше сделать правильно.
Потому что я не знаю как мне по-другому сделать. Мне надо проверять соседние клетки на наличие мин, если клетка с краю, то мне выдает ошибка. И меня в школке так недавно учили. Пробовал гуглить, но даже не знаю как это обозвать. Скажи как, у меня вообще вариантов нету.
А открытие соседних клеточек, если они пустые делать через рекурсию?
>>398015 >В итоге после целого дня консольной ебли понял, что я ебаное дно. Да. Есть функция открытия клетки, если в открытой клетке нет бомб и число бомб рядом = 0, то вызываешь эту же функцию для всех клеток вокруг текущей.
>>398013 Короче я все сделал верно, только вот тот самый кросс джойн оказался ни к селу, ни к городу. Я подозревал что-то такое, когда дописывал distinct.
Поцоны, очень нужна ваша помощь. Дайте книжку по последнему php чтобы покороче была и не шопопало. Литературы куча по PHP, но анон, наверняка, знает какая лучшая. По работе нужно, поэтому времени вникать много нету. Знаю python немного.
Код лучше всего постить на sqlfiddle: слева пишешь CREATE TABLE/INSERT, справа SELECT и видишь результат табличкой.
А то так я не видя sql-кода не могу проверить правильно ли ты спроектировал таблицы.
Твой пример с вложенными подзапросами неэффективный: MySQL будет обходить построчно объединенную таблицу users, likes (а в ней будет N x M строк, так как по умолчанию таблицы объединяются декратовым произведением) и для каждой строчки делать подзапросы. То есть будут сотни или тысячи подзапросов.
В случае с взаимными лайками еще хуже: он выбирает все строки из likes и для каждой делает подзапрос. И все это повторяется много раз.
В общем, ошибки:
> FROM users, likes Зачем перечислять тут 2 таблицы? Ты понимаешь, что делаешь?
Вместо подзапросов (тем более двойной вложенности) надо джойнить.
Руссукие алиасы не стоит делать, это лишнее по моему.
> знаю его совсем чуть-чуть, начинал учить, но бросил > Попытался ебануть регу к рест сервису - охуел с того, какой велосипед делается, и какие скудные у ангуляра доки. Тебе не кажется что главная проблема в слабых знаниях? Так как ты можешь сделать только то, что описано в примерах, а сам что-то нестандартное написать не можешь.
Аноны, хочу сказать, что я крайне негативно к таким вещам отношусь. Людям лень угулбляться, решать например мои задачки с подвохами, они кое-как освоят основы, потом идут на работу и быдлокодят, а потом кому-то в их коде копаться придется. Я это не ободряю. Не понимаешь яваскрипта — иди учись, а не работай.
>>398062 Это ты о других думаешь. Тебе вот доставляет помогать куче дегенератов, типа меня. А остальным похер на других. Учиться, а не работать? Но ведь на работе деньги платят, и похер что быдлокод. И похер что оп треда этого не одобряет.
Совет — это хорошо, мы рады когда кто-то помогает советами, но ты должен учить правильному, а не неправильному.
Ты предлагаешь сделать денормализацию ради оптимизаций — но где в задаче что-то сказано про оптимизацию? Это задача для начинающих на изучение джойнов и группировок и они сначала должны полностью научиться ими пользоваться, а потом думать про оптимизацию, а не наоборот.
И даже в случае с кешем все равно таблица пользователей и лайков нужна.
Потому твой совет скорее собъет с толку. Надо было сначала написать про нормализацию и джойны, потом добавить что ради оптимизации делается кеш, хранящий вычисленные данные.
А не делать советы, без объяснений (про нормализацию и кеш).
> и для старых обновляется количество (раз в пять минут, например, можешь чаще, можешь реже) Если у нас много пользователей и лайков, это неэффективно. Они же со временем только копиться будут.
Я не знаю точно, как сделано в том же контакте, но думаю, что цифру в кеше они увеличивают сразу, а не по таймеру.
> отдельными объектами абстрактных классов Нельзя создать объект абстрактного класса. Абстрактный класс это как раз класс, не предназначенный для создания объектов, а как основа для наследования.
> сделать дерево в виде классов? Конечно, дерево в виде объектов. Я уже не первый раз рассказываю, чем объекты лучше массивов:
— массивы — это бардак так как нигде не определены какие в них могут быть элементы, а какие нет. Используя массивы. ты приходишь вот к такому аду: https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7 (в Друпале формы описываются огромными валоженными сложными массивами, в которых невозможно разобраться без мануала)
— у массивов нет классов. Глядя на массив ты не можешь сказать точно что он хранит, а имея объект ты всегда можешь проверить какого он класса — у массивов нет методов — у массивов нет инкапсуляции, то есть приватных свойств — у массивов нет наследования
А, ты про определение конструкций, начинающихся с [ , но не тегов? Ты бы мог сначала сделать без этого (то есть если идет код вида [??? то парсер выбрасывает исключение и останавливается).
Тут нужен не костыль, а что-то нормальное. Например, функция парсинга открывабщего или закрывающего тега может вместо него вернуть текстовый узел. Для этого ей надо собирать токены в дополнительный массив, и если последовательность не соответствует корректному тегу, создать текстовый узел из него.
Если это сложно, сделай первую версию без этого, потом прикрутим.
Ты не понимаешь, как работает селект. Он работает примерно так. Допустим есть запрос:
SELECT fields FROM tables WHERE cond GROUP BY group ORDER BY order HAVING having LIMIT limit
(некоторые части не обязательны).
Сначала берется список таблиц tables. Это может быть одна таблица, несколько таблиц или несколько таблиц связанных джойнами. Если таблиц несколько, то они объядиняются, обычно по принципу «перебираем все комбинации строчек» то есть если указаны 2 таблицы по 20 строк то поулчается объединенная таблица на 400 строк.
Затем записи отсеиваются по условию cond
Затем группируются (несколько строчек объединяются в одну) по условию group . Если условие group не указано, но ты использовал в fields аггрегатные функции вроде COUTN() или SUM() то все записи группируются в одну.
Затем группированные записи отсеиваются по условию having
Затем сортируются
Затем берется часть результата, соответствующая ограничению limit, а из нее поля fields. На этом же этапе делаются подзапросы в SELECT (для каждой строчки результата — отдельный подзапрос, естественно).
То, что получилось и возвращается как результат.
Чтобы запомнить, вот порядок действий: FROM+JOIN, WHERE, GROUP, HAVING, ORDER, LIMIT, SELECT. Его ты (и все остальные аноны) должны знать наизусть.
Таким образом если ты не делаешь выборку полей из likes и не используешь эти поля в условиях, то не надо ее указывать.
Мог бы написать тут, что непонятно, я бы пояснил и в итоге мы бы разобрались. Заодно научился бы искать и исправлять ошибки в настройках. Что сразу сдаваться.
> будет выполнено по три запроса к таблице likes (твои подзапросы), У него там один подзапрос вложенный, по числу записей в likes так что гораздо больше.
Cross join еще называют декартовым произведением (для каждой строчки первой таблицы присоединяются все строки из второй).
Ты сделай запрос SELETC FROM t1, t2 и посмотри сам. И нет, с подзапросами решение не годится, надо сделать нормально. Ну и код создания таблиц покажи, там тоже попридираться можно.
Тем не менее, в нашем треде мы одобряем желание научиться и не одобряем желание сделать кое-как, не понимая.
Работы бывают разные, где-то принимают с быдлокодом, а где-то нет.
Что касается других, это их право, если им нравится ограничивать себя и свой уровень, и всю жизнь выполнять примитивные рутинные задачи (ну или может они планируют стать менеджерами и перестать кодить, кто их знает).
Не беда, сделаешь эту задачу, станешь умнее. А то понять это, ни разу не написав код парсера, довольно сложно, я бы тоже не понял если мне только на словах объясняли.
Подскажите, как я понял, для того, чтобы нормально работать в гите надо установить локальный хост и туда уже назначить папку гит? У меня локалхоста нет, подскажите его лучше сделать? Меня разрывают 3 варианта: денвер, хампп или попробовать сделать самому (но тут я гуглил и свежих решений не нашел)?
> надо установить локальный хост правильно это наызывается «веб-сервер». Веб-сервер - это программа (например, Апач, Нгинкс) которая принимает запросы от браузера по протоколу HTTP и отвечает на них. Установив веб-сервер, ты можешь организаовать сайт на своем компьютере. Для гита он не нужен.
«локальный хост» значит «мой компьютер» и звучит довольно бессмысленно.
> для того, чтобы нормально работать в гите надо установить локальный хост Нет. Нужен только гит и пустая папка, в которой ты создаешь репозиторий. Создать можно либо через git init (пустой с нуля) либо git clone (клонировать существующий например на Гитхабе). Подробности в книге: http://git-scm.com/book/ru/ (она небольшая, понятная и на русском. Глупо не прочитать).
> Меня разрывают 3 варианта: денвер, хампп или попробовать сделать самому (но тут я гуглил и свежих решений не нашел)? Однозначно пробовать самому. Вот немного устаревший мануал: https://gist.github.com/codedokode/10774100
Учиться работать в гите лучше всего на комадной строке, как в книге. К гиту есть также приложения с графическим интерфейсом, но начинающий запутается в них и скорее всего все сломает. То есть изучи гит сначала, па потом ставь любое графическое прилоежние: http://git-scm.com/downloads/guis
Я графическим приложением смотрю историю и диффы, а коммиты делаю из командной строки.
>>398088 Вообще, мне не только для гита, а еще свой код тестировать на веб-сервере. Я пол года назад пробовал настроить сам (т.к. денвер устарел, а хампп перегружен ненужным софтом), вроде ок установил апач, пхп последний, а вот с майскл какая-то беда приключилась, что установилась целая библиотека майскл приложений.
> какая-то беда приключилась, что установилась целая библиотека майскл приложений. Нужен только сам MySQL Server и по желанию Workbench (рисовать схемы таблиц). Остальное можно удалять, наверняка через стандартный диалог Установка/Удаление программ в настройках это можно сделать.
Знаю что тупой вопрос, но срошу, как активировать апач? Т.е. я скачал дистрибутив с сайта апачлонги, кинул папку apache24 в корневую директорию, а как её оттуда активировать в службы? В мануале написано прописать: >Start apache in a DOS box: >httpd.exe >Install as a service: >httpd.exe -k install Но у меня нет досбокса, да и раньше я без него устанавливал через установщик МСИ. И, нужен ли апач монитор?
> Но у меня нет досбокса, да и раньше я без него устанавливал через установщик МСИ. Имеется в виду не DOSBox (виртуальная машина имитирующая древний компьютер), а консоль. Вот краткий гайд по консоли: https://gist.github.com/codedokode/10539568
Так что это просто мануал неточно написан.
Если ты выполнишь то, что там написано, то Апач установится как служба (фоновая программа, которая может запускатья при запуске компьютера). Ты можешь управлять службами, зайдя в Пуск -> настройки -> Администрирование -> Службы или Пуск -> services.msc (я предпочитаю второй способ)
> нужен ли апач монитор? Решай сам, он не обязателен, он просто позволяет запускать/останавливать службу, но может тебе больше нравится когда в углу горит иконка с меню.
>Start apache in a DOS box: >httpd.exe Это если ты хочешь запустить Апач как обычную программу прямо в консоли, руками. Не советую, лучше установить Апач как службу и прописать ее автозапуск (ну или запускать вручную).
Кажется я что-то не до понимаю. Скачал архив с апачем, кинул его в c:/apache24 (на скрине). А как его в службы установить? Пробовал через консоль разные команды, ничего не работает.
>>398117 А все, оказывается если апач идет не установщиком, а архивом, то он запускается через файл httpd.exe в папке bin. Как в этом случае создать несколько локалхостов? Т.е. не отдельные папки внутри localhost, а отдельные веб-сервера, например, чтобы сайт загружался прямиком из text.loc.
Парсеро-вопрос. Мне же, чтобы парсить парный таг надо вызывать getNextToken() пока не найду закрывающий таг, а если не найду надо вернуть этот токен ([tag) как простой текст, и парсить дальше с этого места, но ведь позиция уже будет в самом конце. Менять позицию вручную $tokenizer->position = ты сказал не правильно, делать в токенайзере специальный метод по проверке на закрывающий тег тоже. Как же тогда быть?
Ребят, у вас есть ламповая конфочка? Просто я сыч-омежка, в моём окружении айтишников нет, а так хоть можно будет с кем-нибудь пообсуждать какие-нибудь задачки.
Друг, я прошу прощения, что вообще влез в эту тему. Тред не читал и не знал, что это какое-то обучение идёт.
В любом случае, имхо, задача неправильная. Плохому учите вы. С подзапросами, или с группировкой - это будет плохо работать в реальной жизни при большом количестве пользователей (записей в таблице). Имхо, может сформироваться шаблон, что так делать правильно и другие варианты рассматриваться уже не будут.
По поводу как это можно делать в очень больших системах - возможно, тем и правда на каждую запись "в таблицу лайков" обновляется аггрегирующая таблица - это тоже вариант. Просто нужно сравнивать что выгоднее - каждый раз делать три операции записи вместо одной и бороться с блокировками при одновременных лайках, либо периодически обновлять эту таблицу.
> задача неправильная. Плохому учите вы. С подзапросами, или с группировкой - это будет плохо работать в реальной жизни при большом количестве пользователей
Смотри, это задача для проверки и закрепления понимая, как работают джойны. Ее решает человек, который только-только про эти джойны прочитал.
Я считаю, надо сначала изучить основы баз данных, включая нормализацию, а потом говорить про оптимизации, а не наоборот. Так как человеку который не знаком с осноdами SQL про оптимизацию запросов говорить глупо — он не поймет. И если такие вещи давать с самого начала, то это будет только запутывать и отвлекать.
Или тут я не прав?
> Имхо, может сформироваться шаблон, что так делать правильно и другие варианты рассматриваться уже не будут. Чтобы этого не было, надо делать урок по оптимизаиям. Но я все равно считаю, сначала нормализация, потом все остальное. Так как иначе мы получим человека, увлекающегося преждевременной оптимизацией там где это не надо.
> это будет плохо работать в реальной жизни при большом количестве пользователей Верно. Но до большого количества пользователей нам пока далеко.
Плюс, никто же не предлагает такой запрос в код писать. Может я его один раз ручакми в консоли наберу чтобы статистику посмотреть.
> Просто нужно сравнивать что выгоднее - каждый раз делать три операции записи вместо одной и бороться с блокировками при одновременных лайках, либо периодически обновлять эту таблицу.
В хайлоад обычно используются NoSQL кеши, соответственно единичку мы прибавляем не в базе данных, а в кеше, а вставку записи делаем в БД. соответственно, проблем нет. Что касается контакта, у них вообще свое NoSQL хранилище на Си, хранящее данные в памяти, для таких целей есть:
>>398128 >>398117 Подскажите, никак не могу создать сторонний локалхост, вот прописал в хттпд.конф: <VirtualHost :80> DocumentRoot C:/Apache24/htdocs/test1.loc ServerName test1.loc </VirtualHost> Это прописал в хостс: test1.loc 127.0.0.1 Создал папку test1.loc в htdocs. В браузере пишет проблема с загрузкой траницы, будто он обращается к интернет страничке, а не к веб-серверу. И, почему-то, сам локалхост теперь стал переходить в эту папку - test1.loc, а не htdocs. В чем проблема?
> Внешние команды — их большинство — это фактически программы, лежащие на диске. Оболочка ищет их не по всему диску, а только в заранее заданных папках. Список папок перечислен в специальной переменной PATH
> В Windows PATH — это всякие системные папки вроде c:\windows и так далее + текущий каталог, в котором ты находишься
Тебе надо перейти в папку где лежит httpd.exe либо набирать полный путь к нему (вроде c:\hello\httpd.exe)
>>398173 > Ответ http://ideone.com/GufMwT Еще фишка в том, что там может быть другой валидный тег, так-что его придется таки парсить, а не просто принимать как обычный текст.
>>398177 Вот что выдало. В папке тест1.лок есть пхп файлик, но, даже если бы там было пусто, мне бы показывался как пустой каталог, а не попытка подключится к серверу. Апач перезапускал.
>>398182 Я цитировал, но спамм-лист. В смысле, в куске от начальной до текущей позиции могут быть другие теги. Ну вообще "что-то не так" будет если будет парсирован уже весь текст, а закрывающего тега так и не будет, так что текущей позиции и не будет. Так что я напутал немного, все ок.
> Функция должна вызывать или возвращать сама себя? Вызывать. это и есть рекурсия.
Тут важно не впасть в бесконечнуб рекурсию, потому должно быть как-то так:
открытьКлетку(коорд.) { открытьСамуКлетку(коорд); если (вокруг 0 мин и она не заминирована) { обходим соседние клетки; для каждой еще не открытой клетки вызываем открытьКлетку(коорд); } }
Обрати внимание на это:
> каждой еще не открытой клетки
должна быть проверка, чтобы 2 раза не открывать уже открытую клетку.
>>398183 бро, я сделал победу более сильного дабла в случае, если дабл выпал обоим. Именно для этого я не давал победу за дабл, а только умножил сумму (хотя умножить можно и на 7). Учту всё, что ты сказал, спасибо. Алсо, почему не пашет вот этот код? Чую, что что-то с выводом строковой переменной. http://pastebin.ru/mpupdZTg Здесь вроде условия оформлены правильно, в 3 строки читалось бы хуже
> Ну вообще "что-то не так" будет если будет парсирован уже весь текст, а закрывающего тега так и не будет, так что текущей позиции и
Да, согласен, сложно получается. Тогда можно так:
парситьПарныйТег (скобки) { парситьОткрывающийТег (скобки) если все плохо, возвращаем текстовый узел и выходим; если все хорошо, то открывающий тег есть и назад пути нет. ..... }
Причина — ты перепутал скобку } c ) (ideone кстати это показывает).
И все же оформлены if неправильно. Стандарты не я придумал, это общепринятая вещь и в нормальной команде тебя все равно попросят переделать код нормально — иначе будет бардак если каждый будет изобретать свой стиль.
> в 3 строки читалось бы хуже Это ты просто не привык.
> Именно для этого я не давал победу за дабл, а только умножил сумму (хотя умножить можно и на 7). Если так то ок.
> PHP Notice: Undefined variable: postNumber in /home/ya0fBf/prog.php on line 5
? У тебя ошибка в названии переменной.
Если ты запускаешь код у себя то наверно у тебя выключено отображение ошибок.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log . Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
>>398196 >Server not found >Firefox can't find the server at www.test1.loc. Вот ошибку выдает. Прописал в виртуал хосты <VirtualHost :80> DocumentRoot C:/Apache24/htdocs/test1.loc ServerName test1.loc ErrorLog logs/some.log </VirtualHost> Но сам.лог пустой.
>>398198 Ну, не факт же, что закрывающий тег есть. Но тут все понятно, просто откатимся к сохраненной позиции. Другое дело что контент надо будет складывать? Сейчас токены на стороне токенайзера храняться, надо или делать координаты начала и конца контента тега, чтобы запускать на нем рекурсив, или складывать их в отдельный массив и передавать токенайзеру.
> Ну, не факт же, что закрывающий тег есть Даже если нету, наверно есть смысл его добавить, а не превращать все в текст. HTML-парсер в браузерах работает так:
битый открывающий тег вроде x<2 — выводит как текст если есть открывающий тег, а закрывающего нет, он его дописывает, при этом блочные теги автоматом закрывают строчные:
<div><strong>123</div> — тег strong будет закрыт автоматически <div>1223 — браузер закроет див автоматически
>>398214 Ну я пишу test1.loc, а браузер преобразовывает в www.test1.loc. localhost работает норм, и пхп в нем работает, НО локалхост начал работать из папки test1.loc может с этим что-то связанО?
ОП, так подскажи что я не так сделал что не могу сделать дополнительный веб-сервер? Могу все заново пересказать как делал и прикрепить файлы хостс и апач конф?
>>398234 С актуальными книжкам и так туго, а тебе еще на русском подавай. Чем не повод подучить? Я так делал. В литературе этой тематике слов не много, я через тройку недель мог уже читать без переводчика процентов 80.
ОПушка, я тебя заебал, но пожалуйста, можешь пояснить, что не так с этим кодом? Я уже заебался искать в нём ошибки, почему оставшийся к выплате кредит приравнивается к нулю? http://pastebin.ru/y78vgdII Кстати, конфочку я тоже создал, добавляйтесь в скайп к bitardinio.
Чики, программач. Короче, делаю задание. Даны md5 хэши, необходимо подобрать пароли, которые зашифрованы с помощью md5. Пароли должны включать столько-то англ символов и цифр. Задание элементарно. Я создаю функцию, которая рандомно генерит строку из нужного количества символов, затем прогоняю эту строку через $hash = md5($string); и просто сравниваю полученный $hash с теми md5, которые даны в условии. Вот только... Не работает, блядь.
>>398252 Спасибо, действительно что-то я ступил. Только такой вопрос, а как сделать так, чтобы локалхост был на всю папку htdocs, а всякие тест.локи были внутри? А то я на локалхост зашел, а он меня на test1.loc преренаправил.
>>398259 1) Делаешь алфавит, содержащий нужные англ. сиволы и цифры (длиной N символов). 2) Делаешь буфер длиной M, где M - длина проверяемого пароля. 3) На каждом шаге инкрементируешь буфер на 1 с переносом (как в школе - если значение первой ячейки после инкремента = N, сбрасываешь её в 0 и инкрементируешь следующую, если это была последняя - останавливаешься, потому что нихуя не нашёл). 4) На каждом же шаге отображаешь все ячейки буфера на алфавит (банально charset[buffer]), полученный пароль хэшируешь, проверяешь. Частные случаи можно делать быстрее, без буфера, прямо с алфавитом.
>>398268 Потому что так перебор займет рандомное время. Чтобы понять мое объяснение, посчитай 71999 + 1 столбиком на бумажке, а потом представь, что цифры - это номера символов в строке "abcdefghij". А потом представь, что твои цифры не от 0 до (10-1), а от нуля до (len(charset)-1).
В пхп нет функции =. или вроде такой, чтобы прибавить к данной строке еще строку? В гугле нету, но почему-то люто кажется, что я это видел. ошибся наверное, но лучше спрошу.
Будь внимателен к мелочам. В программировании нельзя пропустить точку с запятой или не так поставить скобку, тут все должно быть точно. Впрочем, со временем ты привыкнешь и будешь на автомате правильно писать.
Символов больше, визуального мусора и строка рвется на части (по моему суъективному мнению):
"hello {$user->name}, you have {$count} unread messages"
'hello ' . $user->name . ', you have ' . $count . ' unread messages'
Обрати внимание, как запятая неудачно висит в пространстве во втором примере.
И если ты предпочитаешь конкатенацию потому что она удобнее и лучше читается, то это одно. Но если из-за якобы выигрыша в скорости то это очень нездоровый признак. Таких людей лучше не брать на работу, так как вместо нее они будут заниматься ерундой.
>>398295 А я, например, предпочитаю не заказывать у фрилансеров, которые пишут так, как ты - вместо написания одного класса они напишут десять, мотивируя это хорошей архитектурой и вот этим твоим "ну а чё там оптимизировать по мелочам". При более-менее серьёзных изменениях "хорошую" архитектуру всё равно придётся переделывать, так что я предпочитаю, чтобы хотя бы работало быстро. Смесь разных кавычек плохо смотрится, но что ж поделать, если в PHP всё не как у людей: по непонятной причине не поддерживаются спецсимволы в одинарных.
Ёпта. Вот у меня метод parse( ), который возращает распарсенный массив узлов (чтобы можно было парсить и контент тегов рекурсивно, возращается в конце все равно корневой объект, другим методом, использующим этот)Всё бы хорошо, но нужно чтобы на каждый вызов parse( ), был отдельный инстанс токенайзера. Есть выход, кроме как создавать её в области метода (без $this) и передавать другим методам в аттрибутах? https://github.com/Electric-Lizard/Some_Parser/blob/dev/includes/parser.php
>>398304 Нет, экранированные символы обрабатываются один раз ещё на этапе синтаксического разбора, причём не особо замедляя процесс (т.к., \' и \\ всё равно приходится поддерживать), и после него никак не отличаются от других символов в памяти. А вот переменные в строках с двойными кавычками, хоть и на определённые заранее места, но приходится подставлять каждый раз.
Вот я еще нашел ссылку, http://www.html5rocks.com/ru/tutorials/internals/howbrowserswork/ там описаны в общих чертах парсеры HTML и CSS в браузере. Можешь почитать потом, хотя там используется не рекурсивный спуск, а конечные автоматы (так получается сложнее в нашем случае).
> так что я предпочитаю, чтобы хотя бы работало быстро. Ради того, чтобы работало быстро, ты меняешь двойные кавычки на одинарные? Ты либо тролль либо ненормален. В любом случае нам дальше не о чем разговаривать.
Кстати, это ограничение парсера на алгоритме рекурсивного спуска, что он плохо работает в случаях когда есть 2 конструкции с похожим началом, ну например
[ name (открывающий тег) [ / name (закрывающий тег)
Ты вынужден заглядывать вперед, чтобы понять какой тип тега перед тобой (а в итоге может оказаться что это вообще не тег). Решение либо завести токен [/ чтобы заглядывать вперед было не надо, либо использовать более сложные парсеры (на основе конечных автоматов) которые умеют решать такие ситуации. Такие сложные парсеры обычно не пишут руками, а генерируют с помощью генераторов парсеров из описания грамматики (пример такого для яваскрипта: http://pegjs.majda.cz/ ).
>>398314 Я не тролль, я из соседнего треда мы с тобой уже не в первый раз спорим по разным поводам, и ты меня не совсем правильно понял. Я имел в виду, что использование двойных кавычек, в числе прочего - признак подхода "а мне похуй на производительность" (можешь в другой соседний тред сходить >>397409). Но что касается кавычек, я сейчас померял даже на свежем PHP: для простых литералов одинарные быстрее. Если приходится собирать строку более чем из 2-3 переменных, разница становится незаметной, и в некоторых случаях, при большом количестве подстановок двойные кавычки ебут конкатенацию (получается в 1.3 раза быстрее в одном из случаев). Так что буду переучиваться :-) > всё не как у людей Я на няшной пишу, последние пару лет ещё и на Python, но PHP тоже знаю.
> признак подхода "а мне похуй на производительность" Это признак подхода «мне нравится аккуратный и читаемый код».
Какая разница в абсолютных величинах между двойными и одинарными кавычками? Ты знаешь?
Насчет производительности, эта задача решается не заменой кавычек. Если ты считаешь что вид кавычек имеет хоть какое-то значение, это значит что ты в этой теме не разбираешься.
> для простых литералов одинарные быстрее Насколько? Не во сколько, а на сколько секунд быстрее?
> Я на няшной пишу, последние пару лет ещё и на Python, Ох лол. А в Питоне какие кавычки быстрее работают?
>>398323 > Это признак подхода «мне нравится аккуратный и читаемый код». ... и мне похуй, что однажды посещаемость повысится, и сервак встанет, это проблемы клиента, а я люблю обмазываться своим кодом и далее по тексту. Ещё раз повторю: встанет НЕ из-за кавычек, а из-за общего пренебрежения вопросами производительности. Кавычки - лишь "индикатор".
> А в Питоне какие кавычки быстрее работают? В питоне escape-последовательности в одинарных работают в отличие от.
> на сколько секунд Нет. Очевидно, что ответ будет зависеть от конкретного скрипта, от железа, от того, сколько этих скриптов сейчас работают параллельно. Никаких на тут быть не может.
> , а из-за общего пренебрежения вопросами производительности. Не вижу связи. Но я считаю, что плохо написаннный код очень тяжело читать, исправлять, оптимизировать, а хорошо написанный — легко и приятно. Потому это очень важно.
На моём железе в самом извращённом случае (синонимайзер по шаблонам) двойные быстрее (200 мс, дохуя шаблонов, сотня килобайт текста). И хотя я был уверен, что двойные кавычки медленнее (мерял несколько лет назад, и они были медленнее), ты меня >>398320 переубедил, Переубеди ещё в HTML одинарные ставить, а то echo "<a href=\"$url\">..." неудобно пиздец. Ну да ладно, шаблонизаторы рулят..
> хорошо написанный — легко и приятно Проблема только в том, что большинство считает хорошо написанным кодом ООП головного мозга, где вместо какого-нибудь массива абстрактный класс фабрикой погоняет. Эти же самые люди обычно делают mb_strlen на UTF-8 строке в условии for() и другие глупости, в том числе и двойные кавычкину насчёт них ты оказался прав, ПРАВ, ПРАВ, а когда им об этом говоришь, тебе рассказывают про микрооптимизации.
Можешь немного поподробней рассказать, что это за буферы такие и что они делают? Или где о них почитать можно? Каково их применение? Я то нуб в пхп, считай, три дня им занимаюсь.
>>398173 >Джойны и группировки. Для начала попробуй считать только число полученных лайков например, а потом постепенно усложняй. Посчитать только полученные или только поставленные лайки - совсем легко. Запихнуть в один запрос и то, и другое - уже проблемы. Как впихнуть туда еще и взаимные лайки, у меня совсем нет идей.
>>398342 В общем у меня только гейство, вроде http://sqlfiddle.com/#!2/ca600/1/0 такого выходит. Днем буду узнавать у вас, как получать взаимные лайки без вложенных запросов.
> в самом извращённом случае (синонимайзер по шаблонам) А ты уверен что проблема именно в кавычках, а не в других местах алгоритма? Интуиция подсказывает, что в другом.
> а когда им об этом говоришь, тебе рассказывают Ну исправь, если это мешает. А вместо абстрактных рассуждений покажи цифры где например скрипт вместо 10 секунд начинает выполняться за одну — это будет куда как убедительнее.
А если это не мешает, то тогда какая разница? Это именно нездоровый фанатизм, когда оптимизируют то, что этого не требует. И когда люди тратят на это время вместо того, чтобы заняться чем-то более нужным.
Я не могут вспомнить ни одной ситуации где микрооптимизации хоть что-то решали. То что ты заменишь 10 классов на 1, обычно ничего не решает. Обычно решает изменение схемы хранения данных, алгоритмов и другие высокоуровневые вещи (и внезапно - их удобнее делать на аккуратном коде,а если он спутанный и микрооптимизированный то его проще переписать с нуля).
И то, прежде чем их делать, надо спросить, а точно ли это приоритетная вещь или есть какие-то другие вещи, которые дадут большую отдачу. Главная цель любого проекта обычно получение прибыли, а не написание идеальных алгоритмов.
> echo "<a href=\"$url\">..." неудобно Не выводи код через echo. Это же невозможно ни читать ни редактировать. Алсо, если тебе все же хочется назло маме отморозить уши всем поставить echo, юзай heredoc/nowdoc (что это? нагугли сам)
> Запихнуть в один запрос и то, и другое - уже проблемы Это специально задача такая
> Как впихнуть туда еще и взаимные лайки, у меня совсем нет идей. Тут надо мыслить реляционными операциями. Берем пользователя, и приджойниваем к нему 2 таблицы: все поставленные лайки, все полученные лайки (ты приджойнил одной, но поверь, 2 удобнее и более «правильно»). После чего мы получаем все возможные комбинации пар
(кому я поставил), (от кого получил)
Осталось лишь посчитать число взаимных. Такая вот подсказка.
Ты используешь подзапросы опять? Нехорошо, нехорошо.
Если уж ты делаешь подзапрос для выборки взаимных лайков, что тебе мешает сделать так (сджойнить таблицу на саму себя):
SELECT FROM likes left JOIN likes right ON (лайк взаимен)
когда ты джойнишь таблицу на таблицу, ты получаешь все возможные варианты комбинаций
(строка левой таблицы)(строка правой)
остается только отфильтровать их чтобы остались только взаимные лайки. И эту таблицу взаимных лайков уже можно сгруппировать по пользователям (чтобы получить количество). Тебе не нужны допольнительные поззапросы.
Чтобы понять, о чем я говорю, сделай 2 вещи:
- сначала сделай inner джойн таблицы лайков на себя и выведи что получится
- потом добавь условие чтобы остались только взаимные пары лайков - потом сгруппируй по пользователям и приджойнь таблицу пользователей. Ты должен получить таблицу вида «имя — число взаимных лайков»
Тогда я думаю ты сам увидишь.
Теперь советы и замечания по коду.
— будь последователен при выборе имен. Либо users.id, user.name либо users.user_id, users.user_name
— для всех колонок надо укзаывать можно ли туда ставить NULL. NULL значит «неизвестно» и ты должен сам понять, разрешать его в колонке или нет. Естественно, колонки где запрещен NULL и не указано значение по умолчанию, становятся обязательными для заполнения.
— 20 символов на имя — неразумно. Это напоминает историю про бабушку, которая родилась в 1900 году и не могла указать год рождения на фейсбуке так как там список начинается с 1905
— я бы вместо похожих liker/liker использовал более различимые from/to но это уже дело вкуса
— ты прописал внешние ключи. Молодец. Но ты не прописал действия ON DELETE и ON UPDATE явно, хотелось бы их увидеть.
— в таблице лайков надо поставить уникальный (а еще логичнее первичный) ключ на пару (от кого, кому) чтобы нельзя было вставить повторяющиеся данные
> CASE WHEN `likes`.`liker_id`=`users`.`user_id` THEN 1 ELSE 0 END Сравнение возвращает либо 0 либо 1 потому можно писать просто
SUM(a = b)
или использовать лаконичный if:
SUM(IF(a = b, 1, 0))
— я бы использовал короткие алиасы таблиц, типа u, l1, l2 — чтобы писать меньше — и не использовал косые кавычки. Но это дело вкуса, тут можешь делать как хочешь
> GROUP BY `users`.`user_id` > ORDER BY `users`.`user_id`; GROUP BY включает сортировку, потому ORDER тут не нужен (а мы узнали что ты этого не знал :) ).
— есди джойнить лайки 2 раза, а не один, можно считать число полученны/отданных через COUNT(DISTINCT)
Но вообще, неплохо, я вижу ты начинаешь понимать джойны, только разберись с тем как выбирать взаимные лайки.
>>398340 Под буфером я имел в виду некую структуру данных, в которой хранят какие-то промежуточные данные. В данном случае, это массив из M целых чисел, каждое из которых в диапазоне 0 .. N - 1. http://ideone.com/2qtMHd как-то так В двух функциях, в общем-то, нет необходимости. Если завести флаг переноса в next_state, можно будет генерировать пароль и делать инкремент одним и тем же циклом.
>>398458 Скачивать оттуда МСИ инсталлер? А то я скачал архив какой-то (из списка ниже), распаковал, а это не установщик, а бинарник или как это называется.
>>398461 Можно. Всё можно. Можно класс сделать. Будет 30 секунд работать вместо пяти. А можно объединить циклы, убрать count, ещё подумать, и будет ровно вдвое быстрее, чем сейчас. Привет.
>>398389 >будь последователен при выборе имен. Либо users.id, user.name либо users.user_id, users.user_name Буду. >для всех колонок надо укзаывать можно ли туда ставить NULL. Недостаточно указать лишь те, где нельзя? >20 символов на имя — неразумно. Я изначально 10 вообще поставил, но одна фамилия не влезла. Я понимаю, что в реальных условиях и десять, и двадцать - мало. >я бы вместо похожих liker/liker использовал более различимые from/to но это уже дело вкуса from/to выглядит лучше, так и сделаю. >ты прописал внешние ключи Кстати о них, я ничего про них не понял. Он только ради >ON DELETE и ON UPDATE нужны? >я бы использовал короткие алиасы таблиц, типа u, l1, l2 — чтобы писать меньше — и не использовал косые кавычки. Пока что я предпочитаю длинные. В коротких к пяти утра я совсем запутался бы. >есди джойнить лайки 2 раза, а не один Я так и пытался изначально, но что-то у меня не вышло. Сейчас еще попробую. >разберись с тем как выбирать взаимные лайки. http://sqlfiddle.com/#!2/fb2fa/4
И еще, как мне страничку перезагрузить? location.reload - не работает. Но, наверное, если код будет не в jsbin'е, а просто из файла запускать, то перезагрузит?
> Недостаточно указать лишь те, где нельзя? Можно, так как по умолчанию NULL разрешен. А там где можно обычно пишут DEFAULT NULL
> Кстати о них, я ничего про них не понял. http://denis.in.ua/foreign-keys-in-mysql.htm — читал? Ключи защищают твою базу от внесения неправильных данных, могут автоматически удалять и обновлять дочерние записи при изменении/удалении родителя, в общем их надо ставить обязательно.
Ну и они несут документирующую функцию: сразу видно на что ссылается колонка.
>>ON DELETE и ON UPDATE > нужны? Конечно
>>разберись с тем как выбирать взаимные лайки. Все верно. Теперь можно вернуться к основной задаче. Только там придется считать более хитро чтобы обойтись 2 джойнами.
>>398490 С предсказания > mb_strtolower(trim($hash)); // everything might happen проиграл. Готовишься к Чебурашке, вдруг, латиницу в хексах кириллицей заменят?..
Вот, объединил циклы, убрал count и конкатенацию: http://ideone.com/d5iy63 (может, ещё что-то можно было придумать, но я этот ваш php 5.6 только установил, до этого, стыдно признаться, 5.3 был). Да, твой вариант в целом лучше только вот ты забыл абстрактный класс PasswordElement, чтобы в будущем можно было использовать разные алфавиты и даже слова из словаря для некоторой позиции в пароле. Заодно пришлось бы сделать класс парсера, токена, чтобы шаблон пароля разгребать. И AlphabetBuilder, конечно же, куда же без него (ну там ->addRange, addCharacter, ->capitalize и т. д. Всё перечислил?.
Прошу прощения, если достал (ну и извини за некоторую долю троллинга, чего уж тут). Такие споры обычно по-другому и не кончаются. Всего хорошего.
>>398499 А подскажи пожалуйста, как из архива сделать службу? Внутри мануалов никаких нет, просто распакованный, как я понял, MySQL. Я бы хотел установить, как ты сказал - сам майскл и воркбенч.
>>398535 > русских букв в utf-8 Предполагал, что ты заметишь. Рабочий, но ждать придётся очень долго намного медленнее твоего (будет брутиться вдвое больший charset, да ещё с дубликатами, и вдвое большее количество символов). Всегда приходится чем-то жертвовать. Но даже если я сделаю "честную" поддержку UTF-8 (т.е., верну конкатенации, разобью charset на символы), то я всё равно буду значительно быстрее тебя. Только вот "честно и красиво" - это медленнее, чем две функции с копипастом ага-ага, качественный код. Одна быстрая и c поддержкой UTF-8, а другая ещё быстрее и без. Учитывая, что 82% паролей у русскоговорящих юзеров не содержат русских символов, оно того стоит. И это скорее худший случай: цифры меняются в зависимости от аудитории, на многих сервисах русскоязычные пароли вообще запрещены, а на некоторых, по неведомым мне причинам, вообще 1251 до сих пор. А ещё можно воспользоваться тем фактом, что у русскоязычных символов в UTF-8 всего два возможных префикса. Такие вот оптимизации. На этом, пожалуй, уж точно пора закончить. Добра.
Ты сейчас ешё вспомнишь, что пароли на PHP не подбирают, потому что он медленный? Да, на PHP не подбирают, зато на JS подбирают, на AS3 подбирают. С теми же самыми трюками, прямо в браузере.
>>398542 Делаю как там, дошел до момента когда надо запустить как службу, захожу в службы, нажимаю запуск, а мне написало что программа не отвечает и я её не могу запустить и ничего сделать, даже кнопка запуска исчезла, втф?
Оцените мой говнокод, анончики. Понимаю, что можно оптимизировать по памяти, но так вроде понятнее. Алсо, правильно содержимое массива указал, или лучше в строчку? http://pastebin.ru/s8FJoByi Вчерашний новичок
>>398591 Где я придираюсь? Я пытаюсь понять, что ты имел ввиду вообще в своем посте. Что значит запустить код в sublime text? Какого ты хочешь результата?
Парни, немного не в тему, но все же. Надумываю учить питон, для веба, плюс еще можно применить в других областях. За универсальность уважаюб. Стоит ли тратить на это время? Или для веба оптимальнее использовать рнр? Опять же с рнр имел опыт.
>>398597 Нихуя не понял. Зделойте в факе пояснение по серверам, ide редакторам, прочему. Я вот нихуя не пойму, говнокодить вроде получается, уже на средних задачках, но писать в айдеоне невозможно.
Тебе нужно установить сервер и пхп на него. Я устанавливал вот по этому мануалу: сам пхп http://php-myadmin.ru/learning/instrument-php.html Сервер http://php-myadmin.ru/learning/instrument-apache.html Еще в будущем тебе понадобится mysql, но пока и этого хватит. Запускается код, когда ты в браузере обращаешься по его адресу, то-бишь если у тебя файл test.php в папке локалхост, ты вбиваешь в адресную строку что-то вроде localhost/test.php, но ни в коем случае не "открыть с помощью".
>>398600 Алсо, есть еще готовые сборки, типа Xamp, где ничего настраивать не надо, но ОП не рекомендует ими пользоваться новичкам, он хочет, чтобы ты лишился девственности, ставя сервер.
>>398593 http://pastebin.com/NgBEmTAs сохраняешь в <папка с sublime text 3>\Data\Packages\User\PHP.sublime-build, правишь путь в последних строках, пользуешься, не забывая выставлять кодировку исходника выставлять в UTF-8. Ctrl+B синтаксис, Ctrl+Shift+B выполнение.
Последний раз, когда я поставил Убунту в виртуалку, она реагировала на клик мышью не меньше чем 10 секунд. Грузилась вообще минуты 2.
Там конечно памяти было немного, может 300-400 Мб, но Windows в аналогичной конфигурации работает нормально. Все, кроме Убунты в такой конфигурации работало нормально.
Конечно, выяснилось что проблема не столько в линуксе, сколько в том что Убунта в отсутствие видеокарты начала эмулировать эту видекарту на процессоре (очень медленно), но тем не менее.
Линукс я ставил и раньше, и в виртуальной машине, и на реальную, и всегда windows был роднее, привычнее, удобнее и быстрее.
Так что не всем совет «просто поставь убунту» подойдет.
Первый раз слышу про подбор паролей в браузере. Не представляю, зачем это может понадобиться. Школьнику-хакеру не хватило на видеокарту?
Есть же оптимизированные программы типа PasswordCracker, mdcrack и иже с ними. Ну и если есть видеокарта то там вообще скорость может быть очень хорошая (10 млрд md5 в секунду, и никто не запрещает тебе поставить много видеокарт в параллель). Плюс есть радужные таблицы, для них правда диск большой нужен, но зато простые хеши ломаются мгновенно.
> Джойнить результат запроса - это же нормально? Это нормально, но это по-прежнему подзапрос. Тут он конечно выполняется всего 1 раз, и это терпимо, но можно вообще без него обойтись и написать запрос значительно короче.
Добейся чтобы код запускался в консоли. После этого ты сможешь настроить в саблайме BuildSystem, чтобы эту же команду можно было выполнять нажатием клавиши:
>пояснение PHP может работать в двух как бы режимах:
- 1. отдельно - 2. как часть веб-сервера, например Апач
В режиме 1 (отдельном) ты запускаешь скрипт, PHP его выполняет и ты видишь результат. Без лишних посредников. В таком режиме ты можешь запускать скрипт в консоли. ideone тоже работает в таком режиме: твой код он передает php на исполнение, а тебе показывает что тот вывел.
В режиме 2 (как часть сервера) ты должен установить еще и веб-сервер. Ты открываешь в браузере страницу, браузер шлет запрос, веб-сервер принимает запрос и запускает php-код, то что выведет код он отправляет в браузер, а он отображает.
В таком режиме php работает на сайтах. Например, на вконтакте.
- используется веб-сервер Апач, и PHP подключается к нему как модуль
- исплоьзуется веб-сервер nginx, и PHP запускается через php-fpm (это исплоьзуется на серверах)
- используется еще какой-нибудь другой веб-сервер и php запускается через php-fpm (php-fpm — это программа-надсмотрщик, которая запускает и убивает процессы-работники php по мере необходимости)
Наверно не очень понятное объяснение, так что можешь задавать вопросы если что-то непонятно.
Насчет редакторов и IDE: есть редакторы (Notepad++, SublimeText) и есть IDE (Eclipse PDT, Netbeans, PhpStorm). IDE отличаются большими возможностями:
— более умное автодоплнение (Sublime показывает все похожие слова из открытого файла, а IDE анализирует код и показывает варианты более точно)
— рефакторинг, например ты можешь выделить кусок кода и выбрать «вынести в функцию» и IDE сама выполнит это действие
— в IDE бывает встроен отладчик, которым можно выполнять код по шагам. смотреть содержимое переменных
Молодец. Я в своей работе часто сижу в консоли и знание консольных команд позволяет делать разные вещи. например, искать что-то в файлах на сервере, считать сколько раз слово встретилось в логе, и т.д.
Скажи пожалуйста, а как устанавливать связку апач-php на линукс? В сети есть всякие мануалы, и в них типа прописываешь пару комманд в терминале и всё, у тебя всё стоит. Что-то я к такому не привык. Возникает ощущение что это установка готовой сборки, ну а хочется типа научиться ставить с 0. Это оно и есть? Алсо я пока не ставил, только вот сейчас буду. Линукс - Убунта на виртуалке (Virtualbox)
А еще вот такая хуйня котаны. когда в шинде прописываешь echo % % path % %, то получается что крайние знаки % лишние и он выводит % значение переменной %, стало быть ему нужно только echo % path % Пикрилейтед, алсо пробелы между % что бы вакаба не прятала под спойлер.
А еще оп рекомендует в регулярках экранировать символы двумя слешами \\s \\w \\. и типа того, когда в документации написано что \s \w и тп. Почему так? Откуда пошло это разногласие?
> В сети есть всякие мануалы, и в них типа прописываешь пару комманд в терминале и всё, у тебя всё стоит.
Так и есть. В Линукс никто не мучается с поиском офииального сайта, скачиванием, нажиманием кнопочем Далее. Просто ставишь любые программы пакетным менеждером (в Убунте и Дебиане это apt-get, в других дистрибутивах другой).
И это не сборка, а именно сами программы. В Убунте/дебиане надо написать лишь
sudo apt-get install php5 apache2
И потом также можно установить расширения к php если надо.
Ты можешь почитать про работу пакетного менеджера тут (рекомендуется):
> Линукс - Убунта на виртуалке Советую кстати отключить графическую оболочку там если еще не отключил. Лучше настроить виртуалбокс чтобы он разрешал соединения внутрь и логиниться в систему по SSH c помощью PuTTY.
В принципе, этого уже достаточно чтобы работать с базами данных, но советую потом почитать список того, что надо знать и изучить то, что еще не знаешь: https://gist.github.com/codedokode/10539213
Она там висит в списке из-за какой-то ошибки. То, что в консоли — запустилось успешно. То есть MySQL отдельно работает нормально, только как служба не работает.
Раз так, то у тебя вариант либо запускать mysql вручную (ты можешь поместить команду запуска в bat файлик чтобы запускать двойным кликом, а не руками). Либо удалить эту MySQL и попробовать скачать другую версию, постарше. В интернете пишут что в 5.5 такой проблемы нет.
> стало быть ему нужно только echo % path % Значит я ошибся. Бывает, спасибо за внимательность.
> А еще оп рекомендует в регулярках экранировать символы двумя слешами \\s \\w \\. и типа того, когда в документации написано что \s \w и тп. Почему так? Откуда пошло это разногласие?
По правилам регулярных выражений бекслеш один, верно. Но ты пишешь регулярное выражение внутри рhp-строки, а в ней бекслеши имеют особое значение тоже. Бекслеш является началом escape-последовательности. Например,
\n вставляет в строку символ переноса строки \" вставляет двойную кавычку \\ вставляет в строку бекслеш ...
Чтобы сделать строку из одного символа бекслеш, ты должен повторить его 2 раза:
$x = "\\"; echo $x; // выведет один бекслеш
Потому бекслеши надо удваивать.
Но тут есть особенность, если ты исплоьзуешь несуществующую escape-последовательность, например \d то php оставляет символы как есть. Потому
\d \\d
работают одинаково. Можно проверить, сделав echo "\d"; echo "\\d"; — они выведут одно и то же (\d)
Многие по этой причине пишут бекслеш один раз.
А вот если ты хочешь найти бекслеш то все сложнее. По правлам регулярок ты должен написать так:
\\
но с учетом правил php каждый бекслеш надо удвоить и получается
Сейчас буду делать эти шаблоны. http://jsbin.com/tomejibeve/1/edit?html,css,js,output . А так - все работает. Кстати, как сделать так, чтобы все не вырвиглазно выглядело? Какими сделать окошечки, цвет поля, ну ты понел. А то у меня с чувством прекрасного беда.
>>398752 >>398727 ОП, таки установил MySQL как службу! Перезагрузил комп и она уже работает! Единственное я 2 вещи сам сделал, когда делал завного - выключил брендмауэр (как я понял в нем была вся соль) и добавил директорию в параметры системы - и все заработало. Единственное, у меня апач работает через иконку запуска, надо погуглить чтобы и он как служба был.
Такой вопрос, получается я установил базовый набор пхп-программиста и мне еще надо установить какой-нибудь пхпмайадмин для удобного редактирования БД и все?
То есть, попробуй поиграть с цветами, эффектом выпуклости ячеек, может чуть скруглить края. Ну и обычно поле под ячейками как бы плоское, а не разделено черными линиями. И шрифт можешь поменять на шрифт без засечек попробовать, сделать его чуть больше и жирнее.
Насчет оформления окошка — тут можно взять за основу что-то из этого:
> Такой вопрос, получается я установил базовый набор пхп-программиста и мне еще надо установить какой-нибудь пхпмайадмин для удобного редактирования БД и все?
Да. Кстати, мне больше нравится adminer — он новее и минималистичнее, хотя я уже давно им не пользовался, в основном командную строку юзаю. Также, есть отдельные программы типа sqlYog.
И никогда не выставляй в открытый доступ скрипты типа adminer, mysqladmin на боевых серверах — хакеры их найдут и взломают тебя.
> выключил брендмауэр (как я понял в нем была вся соль) Кстати, может быть, он блокирует программу так как она пытается открыть порт. Надо тогда там добавить mysql в исключения или разрешить ей открывать порт 3306.
Или, что лучше, ты можешь в my.ini настроить чтобы он открывал порт не наружу для всех желающих, а только на внутреннем интерфейсе. Это делается опцией bind-address=127.0.0.1 (там наверно стоит 0.0.0.0 что значит слушать на всех интерфйесах).
Мне кажется, в этом случае брандмауэр не будет беспокоиться.
Открытый доступ - это когда страницу с phpmyadmin можно открыть из браузера. То есть когда ты например на боевом сайте создаешь папочку http://example.com/myadmin и кладешь туда этот майадмин.
Во-первых, ты можешь по забывчивости оставить доступ к базе без пароля.
Во-вторых, в этих скриптах бывают уязвимости.
Я на сервере в логах сам видел обращения от ботов, которые искали phpmyadmmin на нем.
Потому если тебе надо сделать его доступным через интернет, закрой его хотя бы http-авторизацией через htpasswd. Так боты не пролезут.
>>398795 Еще есть пара вопросов: 1. Какой ОС ты пользуешься? 2. Нормально через командную строку управлять БД? Я, просто, пользовался только через пхпмайадмин или админер, видел бд в командной строке только когда устанавливал майскл, выглядит не очень наглядно и нельзя сделать кучу быстрых операций.
Я посмотрел, уязвимости которые ищут боты, вроде были только в очень старых версиях, в новых про уязвимости неизвестно, но я бы все равно закрывал доступ, так безопаснее будет.
Злоумышленник может подсунуть человеку, у которого есть доступ к myadmin, специальную ссылку, и при переходе по ней выполнится нужное злоумышленнику действие либо он получит данные для доступа. Или же в некоторых случаях хранящийся в базе яваскрипт может выполниться на странице myadmin.
Windows, но с cygwin (bash + портированные линуксовые утилиты для командной строки)
> Нормально через командную строку управлять БД? Нормально. Когда надо что-то найти нестандартное, ты все равно будешь в своем майадмине писать sql-запрос.
Конечно для просмотра небольших таблиц графический интерфейс будет удобнее и нагляднее. И наверно для новичка проще.
Но на больших базах, где много таблиц, много данных и колонок, он по моему неудобен.
Плюс, в консоли если видишь что запрос тупит, его можно прервать, а как прервать запрос из браузера? даже если ты закроешь страницу, php-скрипт на сервере продолжит выполняться скорее всего.
Плюс, в консоли можно использовать транзакции, временные таблицы, а в phpmyadmin нет.
Ну не знаю, я как-то комфортно себя в консоли чувствую. А интерфейс phpmyadmin кажется перегруженным и содержит много лишнего.
Вы так синхронно посоветовали мне отключить графику и настроить доступ через SSH. Но скажите зачем? Я вот установил линукс что бы научиться работать с ним, как бы. Поучить пользоваться коммандной строчкой и все такое. А вы как я понимаю советуете просто отрубить не нем графику, установить туда апач и пхп и сделать из него некий виртуальный сервер и коннектиться к нему с моей же винды? Я не тот анон у которого убунта дико тормозит на виртуалке, у меня все сносно. В общем я и не против для расширения кругозора все это сделть. Просто поясните мне в двух словах зачем. Хочется понимать больше.
Если ты его используешь как сервер, зачем тебе графическая оболочка? Ни у Апача, ни у MySQL нет никакого графического интерфейса.
> пользоваться коммандной строчкой Для командной строки не нужен графический интерфейс.
> Я вот установил линукс что бы научиться работать с ним, как бы. В смысле, научиться запускать браузер и копировать файлы перетаскиванием? Там же изучать нечего, это все очевидно.
> вместо '../test'? Потому что это ненадежно и в половине случаев не работает. Кто тебе сказал что так можно писать?
_ _ DIR _ _ указывает на каталог в котором находится текущий файл.
../test ищет файл в текущей директории и в include_path, соответственно нет никаких гарагтий что он его найдет. То, что иногда это работает — это везение и случайное совпадение текущей директории с той в которой файл.
>>398773 http://jsbin.com/pituhecixo/1/edit?html,js,console,output - пока не работает, у меня есть вопрос. В Util.showWindow() я поместил метод по созданию нового поля, но как мне контекст поля туда притащить? Ведь событие на кнопку я смогу повесить только внутри Util.showWindow(), в основной программе кнопки не видно, т.к она еще не создана.
Котаны, в общем такое дело. Пока все равно не стал удалять гуи на убунте и сижу разбираюсь. Сначала пытался понять где тут вообще менюха приложений и терминал. Потом нашел. Установил апач с помощью
sudo apt-get update
sudo apt-get install apache2
далее в мануале предлагают узнать ip хоста с помощью комманды ifconfig eth0 | grep inet | awk '{ print $2 }'
оке, выводит вместо стандартного 127.0.0.1 адрес 10.0.2.15 - это что такое? Локалхост виртуалбокса? Из браузера на виртуалке заходит прекрасно и пишет что It works! но на виртуалке и 127.0.0.1 тоже самое показывает, втф? А из виндового браузера 10.0.2.15 не открывается уже просто так. Требует логин и пароль. Причем данные юзера Убунты не подходят. Такие дела? Что вообще я делаю?
Смотри, у виртуалки по умолчанию создается один (тоже виртуальный) сетевой интерфейс, в режиме nat. Все пакеты с него перехватываются сетевой подсистемой VirtualBox на хосте и отправляются в интернет от его имени. А то, что придет в ответ, передается на сетевую карту виртуалки. При этом хост переписывает IP-адреса в пакетах как требуется. То есть VirtualBox работает как роутер для гостя.
Но с использованием NAT извне нельзя никак установить соединение с гостем. Все соединения инициируются только им.
Ты не можешь в таком режиме соединиться с Апачом в госте.
Отключить NAT тоже нельзя так как тогда гость потеряет выход в интернет.
Что делать? Надо добавить гостю вторую сетевую карту, в режиме Host-only networking. В этом режиме на хосте создается виртуальный сетевой интерфейс, и он соединяется в вирутальную локальную сеть с сетевой картой гостя. У этой карты есть IP-адрес, с помощью которого ты можешь соединиться с сервером на госте. Через эту сеть хост и гость могут соединяться друг с другом (но пи этом эта сеть не имеет связи с интернетом потому NAT тоже должен быть включен).
Создать виртуальную сетевую карту мало. Ты еще должен объяснить ОС гостя что ее надо задействовать и пакеты на Ip-адрес твоего компьютера должны идти через нее, а все остальные через NAT. Для этого надо настроить гостевую ОС.
Там как раз создается сначала вторая сетевая карта для гостя, а потом она настраивается в ОС гостя.
> далее в мануале предлагают узнать ip хоста > с помощью комманды лучше бы просто набрать ifconfig, а то эта команда криво и ненадежно вырезает ip адрес из текста.
> А из виндового браузера 10.0.2.15 не открывается уже просто так. Требует логин и пароль. Причем данные юзера Убунты не подходят. Это ты к кому-то в твоей локалке подсоединяешься. Тот адрес который тебе пишет Убунта — это ее адрес за NAT, в виртуальной сети, между ей и сетевой подсистемой Virtual Box, и в которую ты с хоста не имеешь доступа.
Там должен быть адрес типа 192.168.56... по моему.
Да, ошибочка вышла. Но все равно с DIR получается надежнее так как путь к файлу указан явно. А без абсолютного пути проверяются каталоги в include_path.
Насчет пхп есть вопрос. Где смотреть/изучать методы/подходы которые можно применить в реализации всякой хуйни? Например пагинация, я без понятия на данный момент как организовать это, не считая взять готовый скрипт.
> А из виндового браузера 10.0.2.15 не открывается уже просто так. Требует логин и пароль. Причем данные юзера Убунты не подходят. Добавлю еще комментарий. Вот смотри, ты подключен в интернет через провайдера. Вряд ли у тебя есть белый внешний IP, скорее у тебя приватный IP типа 10.x.x.x.
Сеть выглядит так:
(ты 10.x.x.x) <-- локалка провайдера --> (10.y.y.y шлюз с NAT a.b.c.d) <-- интернет
Шлюз, как ты видишь имеет 2 сетевых карты с 2 IP адресами, одна карта в локальной сети с приватным IP, другая в интернете c публичным. Таким образом, вся сеть снаружи видна как 1 узел с 1 IP адресом.
В этом случае твои пакеты идут по локалке до шлюза провайдера, он их перехватывает, заменяет в них обратный IP адрес с твоего на a.b.c.d и отправляет в интернет. А с приходящими пакетами делает обратную операцию.
Извне из интернета ты никак не можешь соединиться с твоим компьютером в локалке так как она не имеет прямого соединения и локальные компьютеры в интернете не видны.
Так вот, между хостом и гостем организован такой же NAT.
> выводит вместо стандартного 127.0.0.1 Набери ifconfig и увидишь все в том числе 127.0.0.1. В компьютере есть несколько сетевых интерфейсов.
Например у тебя скорее всего их минимум два:
- локальный интерфейс loopback c адресом 127.0.0.1. Это как бы виртуальная сетевая карта, пакеты с которой не уходят в сеть, а остаются на компьютере
- сетевой интерфейс соответствющий реальной сетевой карте с Ip-адресом типа 10.x.x.x. Это твой внешний Ip-адрес, видимый с других компов в локалке. C него пакеты уходят в сеть и приходят на него.
Также и в виртуальной машине, есть loopback интерфейс и есть интерфейс eth0 с 10.x.x.x. Ну и ты еще должен настроить второй интерфейс eth1 c адресом типа 192.168,x,x
Аноны, я предлагаю открыть рубрику «задачи с собеседований». В ней мы можем посмотреть на задачи с собеседований и попробовать их решить.
Для начала пару задач, которые я увидел в соседних разделах:
> Я на собеседовании не смог сделать алгоритм поиска двух наибольших элементов в массиве. Собственно, задача, дан массив чисел, найдите 2 наибольших. Решать можно на JS или PHP, кому что роднее.
> Напишите алгоритм сортировки Дам массив чисел, отсортируйте по возрастанию без использования стандартной функции sort() и подобных. на JS/PHP.
Кто хочет может порешать, а я соответственно могу проверить или дать подсказку. Готовых решений в нашем треде ОП никогда не дает, если кто тут новенький, но зато дает подсказки.
Создавал таблицу через MySQL Workbench. Три представленные таблицы - связующие многие-ко-многим. Вот только почему во всех трех в ограничениях внешнего ключа всё разное, по понятно. Да, и что там нужно прописать, чтобы юаза понимала, что это связь многие-ко-многим?
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут:
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Есть задачки по основам JS и DOM, хорошие, многие их с ходу решить не могут, попроси, дадим ссылку. Есть задачка на MySQL.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее. ОП обычно занят, но где-то раз в сутки в треде появляется.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Мануал по PHP — http://www.php.net/manual/ru/langref.php
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Не поздно ли в мои 40 становиться программистом? Ох, это будет сложно, но если ты покажешь лучшие знания, чем моложежь, то шансы есть.
Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 2 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.
В общем, давайте начинать уже!