«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2017/04/14 18:55:57  №973704 1
4jiYlNsEWZg.jpg (159, 666x655)
655x666
Вопрос опу по файлшарингу.

Хранить ли в модели файла, а также в базе данных полный путь на скачку (http://fileshare.loc/download/id) и полный путь к папке downloads (C:\Apache24\htdocs\file-sharing\app\Controller/../../public/downloads/2017/04/14) или же обойтись короткими как у меня? /downloads/2017/14/04 папка и /download/id скачка соответственно.

Также неизбежно ли отказываться от конструктора класса-модели и создавать отдельный метод setProperties из-за того, что set_fetch_type(\PDO::fetch_class, 'ClassName') будет требовать третьим аргументом передачу свойств для конструктора, которые проблематично в моем FIleGateway получить?
Ответы: >>973746 >>973811 >>976691
Аноним 2017/04/14 19:47:49  №973746 2
>>973704
Это все не в модели хранится, а в конфиг файле/классе. Модели либо конфиг класс передается, либо готовые значения из конфиг класса (лучше). В конфиг классе может как относительный через _DIR_, так и абсолютный храниться, на то он и конфиг.
Ответы: >>973812
Аноним 2017/04/14 22:12:04  №973811 3
>>973704

Так у меня динамически создаются эти пути (год/месяц/день), как мне это хранить в конфиге-то.
Ответы: >>973812 >>979513
Аноним 2017/04/14 22:12:20  №973812 4
Аноним 2017/04/20 04:06:10  №976691 5
>>973704

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

В коде сделать функции которые из этого относительного пути генерируют URL и полный путь.

При скачивании в URL в конце должно стоять исходное имя файла: /download/13/файл%20файл.txt

> Также неизбежно ли отказываться от конструктора класса-модели
Удобнее конструктор без аргументов.

> и создавать отдельный метод setProperties
Можно и его, а можно свойства напрямую или через сеттеры менять.


>>973774

Названия у тебя очень неудачные и трудно понимать код. ЧТо такое TempHandler например? Непонятно. Что такое TempInterface? Комментариев тоже нет.

> $object->tempChanges()
наверно tempChanges надо в интерфейсе описать? Так как сейчас у тебя там ни одного метода не описано и значит вызывать ты тоже ничего не можешь.

> if (!empty($order->getDirty)) {
Скобки забыл

> $temp->name = 'change';
тут наверно константа нужна

> $temp->value = json_encode($tempArray);
Если можно, лучше бы в памяти хранить сам массив, а преобразовывать в JSON только в момент сохранения в БД.

https://github.com/MakeevD/MicroCrm/blob/master/app/Helpers/SearchOrders.php
тут тоже много странного, например почему фильтр записей наследуется от модели, почему куча статических методов которые явно должны быть нестатическими?

Фильтр можно было сделать в виде объекта с полями, соответствующими отдельным критериям поиска.

>>973748

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

Ты должен просто вызывать методы, которые описаны в интерфейсе, а не гадать, какой именно там класс.

Подход вида if ($x instanceof Class1) не работает, так как позже могут допсать новые классы, реализующие интерфейс.
Ответы: >>977068
Аноним 2017/04/20 22:21:42  №977068 6
>>976691

Относительно папки с файлами это значит включая ее в этом пути? /downloads/2010/10/10 или /2010/10/10
Ответы: >>979512
Аноним 2017/04/25 02:19:47  №979512 7
>>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 02:20:17  №979513 8
>>976909

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

>>976826

Чтобы отделить выражение от остальной части строки: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

Они не обязательны.

>>976751

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

>>974013

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

> Т.е., допустим, по фокусу на инпут идёт один запрос на сервер
На фокус ничего делать не требуется, только при нажатии клавиш.

> откуда в потоке приходят записи и колбэком заносятся в общий селект.
Не надо изобретать велосипед, уже есть селекты на JS которые работают с аякс-запросами: select2, chosen.

>>973867

Если это объект из DOM или SimpleXmlElement, то там есть методы, поищи в мануале.

>>973811

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

>>973499

В CSS есть анимация и transition (переходы).
Аноним 2017/04/25 06:58:11  №979545 9
>>979512
>А зачем нужен хеш? Чтобы доказать, что пользователь действительно получил ссылку, а не пытается подтвердить несуществующий ящик, мы генерируем сложный случайный код (не хеш, с чего ты решил, что это результат хеш-функции?), и просим пользователя его предъявить как подтверждение владения почтовым ящиком. Злоумышленник не может угадать код.
Было бы удобно не создавать новых полей или таблиц которые содержат этот код, а просто отправить хеш тот самый который получаем из пароля.
Ответы: >>980992
Аноним 2017/04/27 14:40:32  №980992 10
>>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 11
>>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 12
>>980992
>Ну так этот хеш может сгенерировать и злоумышленник, так как он знает свой пароль.
Не может, так как он не знает соль. Но если мы позволяем не активированному пользователю логиниться и сохраняем хэш в куки, тогда злоумышленник может получить его от туда. Значит остается только вариант с созданием дополнительных таблиц/колонок?
Ответы: >>981471
Аноним 2017/04/28 13:59:01  №981471 13
>>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 14
>>981471
>Локально у себя может быть проще поставить Апач вместо того, чтобы возиться с настройкой нгинксов.
Зачем ты об этом говоришь, если изначальный вопрос только про быстродействие сайта был?