«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2017/04/11 22:28:26  №972125 1
Выручайте ОП, аноны. Не могу в 10 задание по HTML&СSS, там где картинки кошек.
https://github.com/codedokode/pasta/blob/master/html/html.md
Вот сам код:
https://codeshare.io/a3yENm
Проблема собственно с чем:
- Как правильно сделать внутри картинки заголовок? Я делал через position: relative и в него вложил position:absolute. Не уверен, что так и задумывалось.
- Как кусочек текста из figure который обвернут в span перенести на след строку? Его тоже делать absolute и выравнивать/выставлять margin`ом?
- Я никак не могу нагуглить, как сделать сноски слева от текста. Там в тег em вставлен собственный атрибут, я как понимаю, нужно его как-то использовать, но как именно? Можно ссылку какую-то или как это называется?
Ответы: >>972190 >>972460 >>972472
Аноним 2017/04/12 09:48:33  №972289 2
Может в тг или конфе вк cоберёмся? Заебало гуглить тупые вопросы часами.
Выгода для всезнаек и не нуфагов сомнительна от такого кооператива.

Например вынес подключение к БД в отдельный файл bd.php, в нём прописаны настройки подключения и собственно подключение к бд, подключаю этот файл к скрипту, в котором необходимо выполнить действия с БД, но внезапно записанный объект в $database не является глобальной переменноq, т.е использовать его в своём коде я не могу, нужно походу объявлять глобальную переменную или ещё какой-нибудь хуйни наворотить.
Аноним 2017/04/12 10:38:42  №972305 3
>>972289
Ну так запиши это в виде класса, подключить класс и создай объект класса, использовать лучше синглетон
Ответы: >>974354
Аноним 2017/04/12 13:52:20  №972370 4
http://phpclub.rf.gd/pr/res/945059.html#955473
>Также, если интересен вопрос оптимизации выборки, то тут придется усложнять схему БД. Сейчас, чтобы вывести посты на главной, приходится делать много запросов, и они не очень эффективные (например, подсчет числа постов в каждом треде отдельно).
>
>Можно добавить в тред поля для хранения числа постов, а также ссылки на последние посты (либо сделать это через отдельную таблицу связи тред - последние посты). Соответственно данные можно будет выбрать в 2 захода: выбираем треды, затем собираем из них id ОП-поста и последних постов и выбираем их одним запросом. Но это конечно немного усложнит работу с базой, так как при изменениях надо обновлять эти дополнительные поля. Но зато снизит нагрузку на базу при выборке.
Этот совет будет актуален, если я перешел на Доктрину? Я реализовал ассоциацию Один-Ко-Многим и теперь, когда я получаю Тред, я получаю его Посты и Файлы, и теперь подсчет количества постов выполняется посредством метода count() класса ArrayCollection.

https://github.com/someApprentice/phpClub/blob/master/src/Threader.php#L115
https://github.com/someApprentice/phpClub/blob/master/src/Thread.php#L15
https://github.com/someApprentice/phpClub/blob/master/src/Post.php#L12

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

https://github.com/someApprentice/phpClub/blob/master/src/Threader.php#L117-L125

Мне следует получать посты через свои запросы?


>Также, строить цепочку постов через выбор всех постов в БД очень неэффективно. Лучше сделать таблицу связи "многие-ко-многим", связывающую посты, может быть такого вида:
>
>from_id | to_id
>
>или такого
>
>from_id | to_id | depth
>
>То есть мы берем пост, и для каждой ссылки в нем вставляем записи в таблицу связи. Можно вставлять только ссылки из самого поста, тогда надо делать несколько SQL запросов, чтобы построить цепочку, а можно вставлять ссылки еще и на посты с большей глубиной вложенности, тогда цепочка выбирается одним запросом, но таблица будет больше по объему.
А как из с таблицы с глубиной вложенности получить всю цепочку одним запросом?

Из примера выше (http://phpclub.rf.gd/pr/res/945059.html#956138):

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

>A -> B
>A -> C
>A -> D
>B -> C
>B -> D
>C -> D

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


>И еще, может стоит добавить опцию, чтобы сохранялись и выводились ссылки на тред в архиве /pr/ и в архиваче, если они есть. Просто, чтобы было.
А как это реализовать? В /pr/ к ссылке на архив треда добавляется дата сохранения, которую неизвестно как получить, а на архиваче используются свои собственные id тредов.
Ответы: >>972377
Аноним 2017/04/12 14:04:21  №972377 5
>>972370

> Я реализовал ассоциацию Один-Ко-Многим и теперь, когда я получаю Тред, я получаю его Посты и Файлы, и теперь подсчет количества постов выполняется посредством метода count() класса ArrayCollection.

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

> Мне следует получать посты через свои запросы?
Да.

> А как из с таблицы с глубиной вложенности получить всю цепочку одним запросом?
Давай я пример приведу. Допустим пост A ссылается на B, C, пост B ссылается на D, E. Получаются такие записи:

post | reference | depth
A | B | 1
A | C | 1
A | D | 2
A | E | 2
B | D | 1
B | E | 1

Соответственно чтобы получить всю цепочку начиная с A, бы делаем выборку WHERE post = A

Если же мы делаем одноуровневую таблицу, то получается так:

post | ref
A | B
A | C
B | D
B | E

И мы должны сделать 3 запроса:

WHERE post = A // получаем B, C
WHERE post IN (B, C) // получаем D, E
WHERE post IN (D, E) // ничего

> А как это реализовать? В /pr/ к ссылке на архив треда добавляется дата сохранения, которую неизвестно как получить, а на архиваче используются свои собственные id тредов.
Прописывать в конфиг какой-нибудь вручную.
Ответы: >>972417 >>975117
Аноним 2017/04/12 15:26:40  №972417 6
>>972377
>Соответственно чтобы получить всю цепочку начиная с A, бы делаем выборку WHERE post = A
Но если мы хотим получить всю цепочку начиная с B, нужно будет сделать ещё один запрос WHERE reference=B, и так далее, пока мы не найдем всех предков.

Ответы: >>974354
Аноним 2017/04/12 17:11:37  №972472 7
>>972125

> - Как правильно сделать внутри картинки заголовок? Я делал через position: relative и в него вложил position:absolute. Не уверен, что так и задумывалось.

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

> - Как кусочек текста из figure который обвернут в span перенести на след строку? Его тоже делать absolute и выравнивать/выставлять margin`ом?

Какой способ позиционирования позволяет располагать блоки вертикально? Очевидно, display: block

> - Я никак не могу нагуглить, как сделать сноски слева от текста. Там в тег em вставлен собственный атрибут, я как понимаю, нужно его как-то использовать, но как именно? Можно ссылку какую-то или как это называется?

Тебе надо почитать про генерируемый контент и CSS-свойство content:

http://htmlbook.ru/css/content
http://htmlbook.ru/css/attr
http://htmlbook.ru/css/counter-increment
http://htmlbook.ru/css/before
http://www.umade.ru/resources/specifications/CSS2/generate.html



Ответы: >>972694
Аноним 2017/04/12 21:25:27  №972615 8
>All Unicode regex engines discussed in this tutorial treat any single Unicode code point as a single character. When this tutorial tells you that the dot matches any single character, this translates into Unicode parlance as "the dot matches any single Unicode code point". In Unicode, à can be encoded as two code points: U+0061 (a) followed by U+0300 (grave accent). In this situation, . applied to à will match a without the accent. ^.$ will fail to match, since the string consists of two code points. ^..$ matches à.
>Matching a single grapheme, whether it's encoded as a single code point, or as multiple code points using combining marks, is easy in Perl, PCRE, PHP, Boost, Ruby 2.0, and the Just Great Software applications: simply use \X. You can consider \X the Unicode version of the dot.
http://www.regular-expressions.info/unicode.html
Это правда, что с юникодом регексы надо писать иначе, чем до юникода? В том, что касается "количества символов", например в "этот символ повторяется n раз", речь идёт о юникод-графемах или о "code points"? Я как-то не замечал этого, работая с юникодовскими регексами.
Ответы: >>972624
Аноним 2017/04/12 21:32:13  №972624 9
>>972615

Юникод - сложная штука, к сожалению. действительно, буквы вроде "а с кружочком сверху" может быть закодирована 2 способами: как один символ или как буква a + модификатор-кружочек. Это не единственный подвох, в Юникоде полно других.

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

Данная проблема отчасти решается нормализацией строки перед применением регулярки. Нормализация приводит такие символы к единому виду.

Про \X кстати первый раз слышу.

> В том, что касается "количества символов", например в "этот символ повторяется n раз", речь идёт о юникод-графемах или о "code points"?
Число повторений идущего перед квантификатором выражения, то есть:

.{10} = 10 codepoints
\X{10} = 10 graphemes

К счастью, ситуации, когда надо отмерять ровно N сложносочиненных символов, довольно редки.
Ответы: >>972692
Аноним 2017/04/12 22:38:26  №972692 10
>>972624
> > В том, что касается "количества символов", например в "этот символ повторяется n раз", речь идёт о юникод-графемах или о "code points"?
> Число повторений идущего перед квантификатором выражения, то есть:

> .{10} = 10 codepoints
> \X{10} = 10 graphemes
Бло, я мог бы так критически облажаться. Не попадись мне эта статья.
А php вполне мог бы заменять кодпойнты на графемы, если ему указать флаг u, это вроде как логично. Теперь кроме флага u придётся ещё и \X ставить, если есть хотя бы намёк, скажем, на шведский алфавит, или на китайские знаки.
Ответы: >>974354
Аноним 2017/04/12 22:40:40  №972694 11
>>972472
Да, посмотрел все, спасибо. Вроде внешне вышло все как и должно быть, но меня не покидает ощущение, что я гавнокожу. Я правильно понимаю, что по CSS и HTML вообще нету никаких code conventions, или канонов по оформлению разметки? Если не впадлу и есть время скажите, где кривая реализация в CSS. P.S. Все тот же урок с котом.
https://codeshare.io/21V8Z1
Ответы: >>972738 >>972820 >>974354
Аноним 2017/04/13 00:25:47  №972738 12
>>972694
Двачую этого. Есть где-то свод правил по типу PSR для PHP, как CSS и HTML оформлять? Имена классов, селекторы и прочее.
Ответы: >>972820 >>974354
Аноним 2017/04/16 11:18:21  №974354 13
>>972305

Синглтон это плохой паттерн в данном случае.

>>972417

> Но если мы хотим получить всю цепочку начиная с B, нужно будет сделать ещё один запрос WHERE reference=B, и так далее, пока мы не найдем всех предков.

Может быть я не так понял условия задачи? Вот в этом примере, когда мы создаем большую таблицу связей:

post | reference | depth
A | B | 1
A | C | 1
A | D | 2
A | E | 2
B | D | 1
B | E | 1

Мы ищем посты не по условию WHERE reference =, а по условию WHERE post = и выборка WHERE pos t = A включает в себя и посты из выборки с post = B (D и E).

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

>>972692

Проблемы будут не только с регулярками, например mb_lenth() вернет длину в codepoints.

>>972694

В HTML используют отступ в 2 или 4 пробела. Имена тегов пишут в нижнем регистре.

В CSS пишут свойства либо вертикально, либо горизонтально. Имена классов и id пишут маленькими буквами, разделяя слова минусами.

Есть еще БЭМ.

Погуглить стайлгайды можно по словам вроде "html style guide". Вот я например гугловский выгуглил: https://google.github.io/styleguide/htmlcssguide.html

>>972738

Погуглить стайлгайды можно по словам вроде "html style guide". Вот я например гугловский выгуглил: https://google.github.io/styleguide/htmlcssguide.html
Ответы: >>974508
Аноним 2017/04/16 18:34:27  №974508 14
>>974354
>> Но если мы хотим получить всю цепочку начиная с B, нужно будет сделать ещё один запрос WHERE reference=B, и так далее, пока мы не найдем всех предков.
>
>Может быть я не так понял условия задачи? Вот в этом примере, когда мы создаем большую таблицу связей:
>
>post | reference | depth
>A | B | 1
>A | C | 1
>A | D | 2
>A | E | 2
>B | D | 1
>B | E | 1
>
>Мы ищем посты не по условию WHERE reference =, а по условию WHERE post = и выборка WHERE pos t = A включает в себя и посты из выборки с post = B (D и E).
>
>То есть если представить посты и связи как дерево, то в этой таблице мы одним запросом выбираем всех потомков узла любой глубины вложенности, а не только непосредственных детей.
>Может быть я не так понял условия задачи?
Проясню на всякий случай условия задачи:

Если мы имеем пост №1, на который ссылается №2, и на номер №2 ссылается №3, то какой бы пост мы не выбрали мы должны получить всю эту цепочку.


Я с самого начала был запутан этой таблицей, я думал что A это самый старший предок, который имеет ответы B, C и т.д, но, тем не менее, это не меняет принципа моего вопроса - Если B имеет ссылки на предков, то он не имеет ссылок на детей и получить всю цепочку только одной выборкой WHERE post=B нельзя, нужно делать


Ответы: >>974518
Аноним 2017/04/16 18:57:13  №974518 15
>>974508

А, понял, о чем речь. Может быть можно тогда допилить таблицу и добавить туда не только "потомков", но и "предков" поста, с depth = -1, -2 и тд?

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

WHERE post = A
UNION
WHERE reference = A

Вообще, я сейчас поймал себя на мысли, что связи между постами образуют не дерево (где у узла ровно один предок, и много потомков), а граф без циклов (где узел может ссылаться на любое число узлов и любое число узлов может ссылаться на него, но циклов нет так как пост может ссылаться только на предыдущие посты): https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D1%84

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

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

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

Ответы: >>975117
Аноним 2017/04/17 18:14:53  №975117 16
>>972377
>> Я реализовал ассоциацию Один-Ко-Многим и теперь, когда я получаю Тред, я получаю его Посты и Файлы, и теперь подсчет количества постов выполняется посредством метода count() класса ArrayCollection.
>
>Ну так это сверхнеэффективно, выбрать кучу постов в память только для того, чтобы получить их количество или получить первые 3.
>
>> Мне следует получать посты через свои запросы?
>Да.
Ха, даже если я использую NativeSQL запросы, то я всё равно получаю ArrayCollection на самом деле PersistentCollection, не знаю почему со всеми постами. У меня не получилось нагуглить как получить сущность без ассоциаций. Значит нужно отказаться от них?

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

Ответы: >>975160 >>976106 >>976106
Аноним 2017/04/17 19:22:06  №975160 17
>>975117
Почему бы тебе не использовать getSingleScalarResult();???

Пример:
public function getTotal()
{
return $this->createQueryBuilder('post')
->select('COUNT(post)')
->getQuery()
->getSingleScalarResult();
}
Ответы: >>975177 >>975178 >>975192
Аноним 2017/04/17 19:35:19  №975177 18
>>975160

Зачем вы тут используете Query Builder? Пишите на DQL сразу, будет и проще и читабельнее. Query Builder для сборки запросов из частей, а тут запрос всегда одинаковый.

Алсо тут проще обычный SQL запрос использовать без маппингов, через DBAL.
Ответы: >>975183
Аноним 2017/04/17 19:37:12  №975178 19
>>975160
Да, это скорее всего работает. Сейчас проверю.
Ответы: >>975192
Аноним 2017/04/17 19:43:01  №975183 20
>>975177
> Пишите на DQL сразу, будет и проще и читабельнее.
>Алсо тут проще обычный SQL запрос использовать без маппингов, через DBAL.
Иди своей дорогой, сталкер.
Ответы: >>976106
Аноним 2017/04/17 20:04:41  №975192 21
Аноним 2017/04/19 01:41:40  №976106 22
>>975191

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

Также у тебя там 2 свитча для математических действий, попробуй объединить в один.

>>975183

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

То же касается и DQL, смысл тут его использовать если можно без него обойтись.

Ты вместо аккуратного запроса нагородил кучу скобок и стрелок и наверно думаешь что Query Builder придумали как замену SQL.

>>975159

Очень полезная фича. Раньше тип указывали через phpdoc вроде @return SomeClass, а теперь можно нормально на уровне языка указать.

>>975117

Во-первых, я не советую исплоьзоваь NativeSQL с маппингом. Если тебе нужен маппинг - используй DQL или Query Builder , если тебе нужно посчитать количество то можно выполнить обычный SQL запрос без маппинга, напрямую через DBAL.

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

Соответственно запрос вида

$em->find('Thread', $threadId);

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

Для подсчета числа постов ты можешь использовать

SELECT COUNT(*) FROM posts WHERE thread_id = ?

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

Далее, тебе надо для треда получить 3 последних поста. Тут есть много вариантов:

1) через DQL делаем запрос вида

SELECT p FROM posts WHERE IDENTITY(posts.thread) = ? ORDER BY postedTime DESC
с опцией setMaxResults(3)

Это будет преобразовано в SQL запрос вида SELECT .. ORDER BY postedTime DESC LIMIT 3

Разумеется, нужен индекс по (thread_id, postedTime) для оптимальной выборки.

Этот метод позволяет выбрать 3 последних поста оптимально, но только для 1 треда. Нужно для 10 тредов - нужно 10 запросов.

2) потому можно при желании применить денормализацию и хранить в БД ссылки на 3 последних поста каждого треда. Либо в самой таблице тредов в виде id, либо в виде таблицы связи многие-ко-многим треды <-> посты. В Доктрине она оформляется как ассоциация hasMany по моему.

Это позволяет одним запросом выбрать 3 последних поста для N тредов сразу.

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

Ну например в такой ситуации:

1: $thread = $em->find('Thread', $threadId);
2: $posts = $thread->getPosts();
3: foreach ($posts as $post)

делается 2 SQL запроса:

В строчке 1 - SELECT FROM threads WHERE id = ?
В строчке 3 (да, в 3, а не в 2, так как у нас ленивая коллекция) - SELECT FROM posts WHERE thread_id = ?

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

>>975117

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

Ну давай взвесим:

1) если не дублировать данные. таблица будет раза в 2 меньше, но надо сделать 2 запроса которые можно объединить в 1 с помощью UNION
2) если дублировать данные, таблица будет больше, при добавлении поста надо делать больше вставок, зато мы делаем 1 запрос вместо 2.

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

Ответы: >>976188
Аноним 2017/04/19 10:24:58  №976188 23
>>976106
>Если понимать, как работает Доктрина,то станет видно что любые обращения к коллекции $posts вызовут загрузку всех постов треда в память. даже если они все нам не нужны.
Такое поведение будет и при getRepository()?

>По моему пункт 1 выгоднее. У нас ведь была цель избавиться от потенциально большого числа запросов (если цепочка постов длинная), а два запроса или один - разницы особой нет.
Но нужно сделать не два запроса, а ещё столько же сколько детей. Получается мы делаем эти запросы либо при вставке либо при получении. Только есть разница, что мы вставляем только один раз при добавлении поста, а получаем каждый раз когда пользователь получает цепочку. С такой перспективы кажется лучше 2-ой вариант.
Ответы: >>976350
Аноним 2017/04/19 15:56:12  №976350 24
>>976188

getRepository возвращает объект репозитория и ничего не загружает из базы вообще.

> Но нужно сделать не два запроса, а ещё столько же сколько детей.
Нет, я говорил про вариант, где для построения цепочки нужно ровно 2 запроса:

1) для постов, до которых можно дойти по стрелкам в графе WHERE post = A (на которые ссылается A)
2) для постов, до которых можно дойти, идя против направления стрелок в графе WHERE reference = A (которые ссылаются на A)

Посмотри на граф со стрелками и может быть станет понятнее.

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

Ответы: >>976361
Аноним 2017/04/19 16:29:57  №976361 25
>>976350
>2) для постов, до которых можно дойти, идя против направления стрелок в графе WHERE reference = A (которые ссылаются на A)
Но если пост A ссылается на пост B то нужно будет сделать запрос WHERE reference = B, и так далее.

При условии что структура такая:

>post | reference | depth
>A | B | 1
>A | C | 1
>A | D | 2
>A | E | 2
>B | D | 1
>B | E | 1
Ответы: >>976687
Аноним 2017/04/20 04:04:53  №976687 26
>>976518

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

>>976403

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

>>976391

Можно, она для этого и придумана, но неудобно. Прямой слеш поддерживается и в Линуксе, и в винде, проще использовать его.

Вообще, иногда полезно иметь класс с вспомогательными функциями для работы с путями, вроде склеивания путей.

Вот примеры таких библиотек (нашел на packagist.org по слову path):

- https://github.com/donutclub/php-path
- https://github.com/vweevers/php-path
- https://github.com/webmozart/path-util

>>976361

Кажется, я понял, что ты имел в виду.

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

> Получается мы делаем эти запросы либо при вставке либо при получении. Только есть разница, что мы вставляем только один раз при добавлении поста, а получаем каждый раз когда пользователь получает цепочку.
Ну да, либо мы строим полный список заранее, либо делаем много запросов.
Ответы: >>977026
Аноним 2017/04/20 20:00:55  №977026 27
>>976687
>А зачем ты вообще присылаешь ссылку на почту? Попробуй начать рассуждать с этого.
Чтобы удостовериться что почта существует, конечно же. В таком ключе становиться очевидно, что не так важно что должно содержаться в ссылке. Просто я часто видел в таких ссылках содержится какой-то хэш-код.
Ответы: >>979512
Аноним 2017/04/25 02:19:47  №979512 28
>>977716

ок, верно.

>>977633

А что у тебя там за связи? Многие-ко-многим между categories и executor? Ты не пробовал сделать как тут описано ( http://symfony.com/doc/2.7/form/form_collections.html )? В частности, посмотри пункт "Doctrine: Ensuring the database persistence" в конце.

Также, в Доктрине прописаны связи между category и executor как многие-ко-многим?

>>977180

> Анончики как в регулярках в утверждениях указать чтобы проверялась наличие не только одной точки/знак вопроса/восклицательный знака, но и все возможные варианты, вот такие например .../??/!!!!
Использовать второе утверждение, проверяющее что дальше идет не знак препинания:

(?<=[.,])(?![.,]) - соответствует позиции после точкой или запятой, за которой нет другой точки или запятой.

Решено верно.

>>977068

Можно включать, можно не включать.

>>977026

А зачем нужен хеш? Чтобы доказать, что пользователь действительно получил ссылку, а не пытается подтвердить несуществующий ящик, мы генерируем сложный случайный код (не хеш, с чего ты решил, что это результат хеш-функции?), и просим пользователя его предъявить как подтверждение владения почтовым ящиком. Злоумышленник не может угадать код.
Ответы: >>979545
Аноним 2017/04/25 06:58:11  №979545 29
>>979512
>А зачем нужен хеш? Чтобы доказать, что пользователь действительно получил ссылку, а не пытается подтвердить несуществующий ящик, мы генерируем сложный случайный код (не хеш, с чего ты решил, что это результат хеш-функции?), и просим пользователя его предъявить как подтверждение владения почтовым ящиком. Злоумышленник не может угадать код.
Было бы удобно не создавать новых полей или таблиц которые содержат этот код, а просто отправить хеш тот самый который получаем из пароля.
Ответы: >>980992
Аноним 2017/04/27 14:40:32  №980992 30
>>979545

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

>>980038

А какое именно условие надо поправить?

>>980278

> join seans s2 on s2.start > s.start
Тут должно быть >=

> список фильмов, для каждого указано общее число посетителей за все время, среднее число зрителей за сеанс и общая сумма сбора по каждому, отсортированные по убыванию прибыли.
А любопытно, для подведения итога тут не подойдет GROUP BY WITH ROLLUP вместо UNION?

> число посетителей и кассовые сборы, сгруппированные по времени начала фильма:
Тут можно сделать так:

SELECT CASE
WHEN HOUR(start) BETWEEN 9 AND 14 THEN '9-15'
WHEN HOUR(start) BETWEEN 15 AND 17 THEN '15-18'
END CASE as group,
...
GROUP BY group

Также, можно заджойниться на созданную на лету таблицу:

SELECT ...
FROM seans
JOIN (
SELECT '9:00' AS start, '15:00' AS end
UNION
SELECT '15:00' AS start, '18:00' AS end
) AS periods ON seans.start >= period.start AND seans.start < period.end
...
GROUP BY periods.start

Так, в общем, верно решено. Только названия стоит получше придумывать и ключевые слова писать большими буквами.
Ответы: >>981086 >>981349
Аноним 2017/04/27 17:59:50  №981086 31
>>980992
Да, WITH ROLLUP подошёл и помог избавиться от лишнего запроса с джойном:
http://sqlfiddle.com/#!9/3935de
https://pastebin.com/BFvfR3U8

Правда в мануале написано, что ORDER BY и WITH ROLLUP взаимно исключающие: https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html
Поэтому для сортировки нужно оборачивать запрос с ROLLUP в ещё один запрос вида SELECT * FROM (...) ORDER BY column
Однако такой подход будет при сортировке также учитывать строку 'Итого'.
Ответы: >>981471
Аноним 2017/04/28 02:10:22  №981349 32
>>980992
>Ну так этот хеш может сгенерировать и злоумышленник, так как он знает свой пароль.
Не может, так как он не знает соль. Но если мы позволяем не активированному пользователю логиниться и сохраняем хэш в куки, тогда злоумышленник может получить его от туда. Значит остается только вариант с созданием дополнительных таблиц/колонок?
Ответы: >>981471
Аноним 2017/04/28 13:59:01  №981471 33
>>981007

Нет, не любой. Ты все путаешь.

Во-первых, 2ch.hk - это не URL. Прочти мой урок про URL, это будет полезно: https://github.com/codedokode/pasta/blob/master/network/urls.md

Во-вторых, PHP не поддерживает любые URL, а поддерживает "потоки", за счет чего в некоторых функциях можно вместо имени файла указать похожий на URL идентификатор:

http://php.net/manual/ru/intro.stream.php
http://php.net/manual/ru/wrappers.php

То, что ты указал, для PHP - это просто имя файла.

>>981024

Локально у себя может быть проще поставить Апач вместо того, чтобы возиться с настройкой нгинксов. Также, у Апача больше настроек и опций конфигурации, чем у нгинкса. Есть вещи, которые нгинкс в принципе сделать не может. Хотя я не думаю, что это плохо - это все же в первую очередь веб-сервер для быстрой раздачи контента.

>>981063

На ideone не включили почему-то нужное расширение. Используй альтернативы, например 3v4l.org

>>981086

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

Конечно можно было извернуться как-то так

ORDER BY IF(id = 'Итого', 1, 0) ASC, ...

но наверно это уже лишнее усложнение.

>>981348

Нужна программа на PHP, которая будет брать данные из базы и генерировать на их основе HTML код, а также обрабатывать запросы на изменение данных.

>>981349

Лучше сделать отдельное случайное число, чтобы не создавать потенциальных уязвимостей. Если тебе жалко места, можно сделать отдельную таблицу кодов подтверждений и чистить в ней старые записи.
Ответы: >>981482
Аноним 2017/04/28 14:12:00  №981482 34
>>981471
>Локально у себя может быть проще поставить Апач вместо того, чтобы возиться с настройкой нгинксов.
Зачем ты об этом говоришь, если изначальный вопрос только про быстродействие сайта был?