«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/04/09 17:40:46  №1377929 1
Анончик помогающий с регулярками, глянь, где я не прав. https://ideone.com/S53UAG Решение я обосновал так, с начала я выкидываю к хуям все кроме цифр. Теперь нам не принципиально что в начале, затем проверяем число знаков и наконец проверяем что в начале 7 или 8, потом сразу же меняем 7 на 8мь. Я не могу понять почему на этапе проверки первых цифр происходит ошибка.
Ответы: >>1378083 >>1378169
Аноним 2019/04/09 19:18:46  №1377979 2
>>1353705 (OP)
Ох уж эта ебля с настройками, не могу направлять запросы через ФронтКонтроллер. Если на прямую к нему обращаться, то создает роутер и выполняет функцию из класса роутера. Чего я только не делал. И закидывал в стандартный путь, и новый адресс делал, и разные htaccess создавал, и переустанавливал ос. Уже не понимаю куда смотреть.
php7.2 Апач2.4 на виртуалке ubuntu 18.04.
Это в .htaccess:
"AddDefaultCharset utf-8

RewriteEngine on
RewriteBase /
RewriteRUle ^(.*)$ index.php"
Ответы: >>1378163 >>1378169
Аноним 2019/04/10 05:37:31  №1378169 3
>>1377979

А в чем проблема? В том, что не вызывается index.php?

Для начала проверь, включено ли в конфиге Апача выполнение htaccess:

- https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
- https://www.linode.com/docs/web-servers/apache/how-to-set-up-htaccess-on-apache/

Не забудь, что после изменения конфига надо перезапустить Апач.

Далее, глянь в лог ошибок веб-сервера (/var/log/apache2 или /var/log/httpd). Посомтри, нет ли там чего странного.

>>1377929

Там в начале может быть либо +7, либо 8. Если просто 7 или +8 - то это ошибка. Также, выкидывать лучше не все, а только пробелы, скобки, минусы. Ну а еще лучше все же написать полноценную регулярку для проверки:

- в начале идет 8 или +7
- затем выражение (одна цифра, за ней любое число скобок, минусов, пробелов), которое повторяется 11 раз

Далее, у тебя ошибки в коде:

> \tif (mb_substr ($clearNum,0,1)=='/7|8/'){

Знак "равно" просто делает посимвольное сравнение, он не интерпретирует выражение как регулярку. Тебе тут нужен preg_match.
Ответы: >>1378186 >>1378542
Аноним 2019/04/10 16:28:15  №1378531 4
Вопрос по симфони.
Допустим юзер отправляет через форму какие-то данные. Сразу, как эти данные приходят в контроллер мне нужно сделать с ними некоторую работу, которая требует времени. Результат этой работы возвращать юзеру не нужно. Но нужно вернуть ему сообщение, типа "мы вас услышали. спасибо. идите нахуй". Как мне это сделать, не дожидаясь, пока вот та времязатратная работа завершится?
Ответы: >>1378539 >>1380459
Аноним 2019/04/10 16:41:58  №1378542 5
Ответы: >>1378586 >>1380459
Аноним 2019/04/10 18:01:45  №1378586 6
>>1378542
Буквы-флаги. В начали урока по регуляркам. Вместо /[a-zA-Z]/
можно написать /[a-z]/i
Если используешь русские буквы в выражении - ставь флаг 'u'.
/[а-яё]/iu
Так же у тебя по условию нужно проверить является ли строка номером. У тебя она является номером, хотя содержит "позвать Люсю".
Ответы: >>1378663
Аноним 2019/04/10 18:14:04  №1378602 7
Не могу понять что делает <<<? В книге написано что это какой то маркер но больше нихуя не написано, помогите плиз.
Ответы: >>1378611
Аноним 2019/04/10 18:18:09  №1378611 8
>>1378602
Нагуглил что это heredoc какой то. Я так понимаю, это аналог htmlского <pre>?
Ответы: >>1380459
Аноним 2019/04/10 18:44:18  №1378663 9
>>1378586
Окей понял. За флаги спасибо, а то только через 101 проверил, а там автоматом проверяется. Перепсал с первичной проверкой любого текста. Но теперь почему-то выражение принимается в любом случае вне зависимости от того есть в нем буквы или нет (я писал только русские). http://sandbox.onlinephpfunctions.com/code/cce3879a8929314360111bd939069d09b7020410
Ответы: >>1378756 >>1380459
Аноним 2019/04/11 13:30:32  №1379192 10
Как правильно создавать константу? В видеоуроках говорят что const CONSTANT, а в кнгиге define('CONSTNAME', value).
Где истина?
Ответы: >>1380459
Аноним 2019/04/12 12:39:59  №1379741 11
Сап двачеры. Помогите с одной проблемой:
echo <<< END
хуй
залупа
END; - видимо не работает в 7 версии - так как по-другому вывести несколько строк?
Ответы: >>1379743 >>1380456
Аноним 2019/04/12 14:06:23  №1379804 12
Аноны, вот в выводе списка студентов есть кнопки постраничной навигации, сортировки и поиска, по отдельности это все понятно как сдклать. Вопрос, я жму на смену страницы в постраничной навигации, передается по get параметром номер страницы, а как передать текущую выбранную пользователем сортировку в таблице,чтобы она не сбилась?
Ответы: >>1379829 >>1379833
Аноним 2019/04/12 14:37:21  №1379833 13
tmp22.jpg (29, 509x207)
207x509
>>1379804
Вот моя функция на пике, которая решает эту проблему.
Идея в том, что гет-параметры сохраняются из предыдущего запроса и просто подставляются в новую ссылку. Функция передаётся как замыкание в шаблон и через неё формируются ссылки на пагинацию и т.д.
Если у кого есть идея лучше - прошу озвучить, так как я писал от балды.
Ответы: >>1380001 >>1380456
Аноним 2019/04/13 18:18:19  №1380456 14
>>1379833

У тебя как-то странно сделано, что параметры сохраняются в $this->get. Это значит, что если ты с помощью функции linkMaker() создашь 2 анонимных функции, то одна будет влиять на другую (параметры, переданные в одну, отобразятся в другой). Это неправильно. Лучше сделать так:

function makeLinkGenerator(array $basicParams): callable {
\treturn function (array $override) { ... };
}

Использование:

$linkGen = makeLinkGenerator(['sort' => 'name', 'page' => 3]);
echo $linkGen(['page' => 2]); // Меняем страницу
echo $linkGen(['sort' => 'score', 'page' => '']); // при смене сортировки сбрасываем пагинацию

Можно сделать аналогичную штуку с помощью объекта:

$linkGen = new LinkGenerator([....]);
$linkGen->makeLink([....]);

Можно сделать специализированные функции для разных видов ссылок:

$linkGen = new LinkGenerator([....]);
$linkGen->makePaginationLink(3);
$linkGen->makeSortLink('-name');

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

Можно вместо массива с базовыми параметрами использовать объект ViewParams/ViewFilter.

Также стоит предусмотреть такие вещи:

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

>>1379741

Возможно, у тебя там отступ (пробелы) перед END или какие-то лишние символы после.
Ответы: >>1380688 >>1380690
Аноним 2019/04/13 18:19:38  №1380459 15
>>1378663

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

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

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

>>1378542

Чтобы регулярка корректно работала с нелатинскими символами в кодировке utf-8 (а у тебя она), надо ставить флаг u. Иначе регулярка думает, что перед ней текст в 1-байтовой кодировке, а русская буква - это 2 отдельных символа (так как она кодируется 2 байтами в utf-8). Описано тут: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

>>1379192

const появился в PHP7, а книга наверно написана раньше. Лучше использовать const.

>>1378611

Это способ записи больших строк. Можно использовать кавычки, а можно heredoc. Ты бы документацию вместо книги почитал бы, например:

- https://www.php.net/manual/ru/language.types.string.php
- https://ru.wikipedia.org/wiki/Heredoc-%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81

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

>>1378531

Есть очереди задач для этого.
Ответы: >>1381843 >>1381844
Аноним 2019/04/14 08:24:17  №1380688 16
tmp23.jpg (125, 1173x382)
382x1173
>>1380456
>У тебя как-то странно сделано, что параметры сохраняются в $this->get. Это значит, что если ты с помощью функции linkMaker() создашь 2 анонимных функции, то одна будет влиять на другую (параметры, переданные в одну, отобразятся в другой). Это неправильно.

>$this->get
Так ведь там весь массив гет из реквеста, а не просто место для сохранения. Параметры не столько сохраняются, сколько апдейтятся - меняется только один, за который отвечает ссылка, и она пересобирается с новым значением.
Ну и разные функции нет смысла создавать - всегда один гет-массив приходит в запросе и с ним работаем.
Вообще, задумка была такой, что замыкание передаётся в шаблон под каким-то именем, где просто вызывается как на пикрелейтед. Меняются только запрошенные параметры, остальные не остаются как были. Ну и пустой писанины чтоб поменьше.

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

>если мы меняем сортировку, то надо сбрасывать пагинацию
Зачем? Количество записей ведь не изменилось. Я вот со своей этой функцией поигрался - вполне юзабельно вроде. Страницы жмёшь - меняет страницы, сортировку меняешь - сортировка только и меняется, что нажали - то и выводит.
Ответы: >>1388215 >>1388213
Аноним 2019/04/15 13:56:36  №1381843 17
>>1380459
>Есть очереди задач для этого.
Ты имеешь в виду какой-нибудь rabbitmq? Из пушки по воробьям же. Мне нужно просто отправить юзеру view сразу, до того как долгий таск завершится. Я до этого писал всякую шляпу на fat free framework и там есть функция abort, которая делает нужное
https://fatfreeframework.com/3.6/base#abort
Я вполне способен залезть в исходники и посмотреть, что она там делает и перенести это в симфони, но ведь скорее всего это уже там есть и мой велосипед всяко будет хуже.
Ответы: >>1388215 >>1388213
Аноним 2019/04/25 02:21:36  №1388213 18
>>1380688

> Ну и разные функции нет смысла создавать - всегда один гет-массив приходит в запросе и с ним работаем.

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

- не использовать анонимную функцию, а использовать объект, каждый генератор ссылок - это новый объект
- использовать анонимную функцию, но хранить данные в замыкании, а не в $this, так что каждая функция изолирована от других

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

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

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

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

>>1381843

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

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