Это обычно происходит при непосредственном использовании функции с empty
.
Пример:
if (empty(is_null(null))) {
echo 'empty';
}
Это связано с тем, что empty
- это языковая конструкция, а не функция, она не может быть вызвана с выражением в качестве аргумента в версиях PHP до 5.5. До PHP 5.5 аргумент empty()
должен быть переменной , но произвольное выражение (такое как возвращаемое значение функции) допустимо в PHP 5.5 +.
empty
, несмотря на его имя, на самом деле не проверяет, является ли переменная «пустой». Вместо этого он проверяет, существует ли переменная, или == false
. Выражения (например, is_null(null)
в примере) всегда будут считаться существующими, поэтому здесь empty
проверяет только, равен ли он false. Здесь вы можете заменить empty()
на !
, например. if (!is_null(null))
, или явно сравнить с ложным, например. if (is_null(null) == false)
.
Вопросы, относящиеся
Преимущества состоят в том, что Вы сохраняете историю (хороший для аудита), и Вы не должны волноваться о расположении каскадом удаления через различные другие таблицы в базе данных, которые ссылаются на строку, которую Вы удаляете. Недостаток - то, что необходимо кодировать любые методы создания отчетов/дисплея для принятия флага.
До, если бы это - обычная практика - я сказал бы да, но как с чем-либо, используете ли Вы его, зависит от Ваших бизнес-потребностей.
РЕДАКТИРОВАНИЕ: Мысль о другом disadvantange - Если у Вас есть уникальные индексы на таблице, удаленные записи, все еще поднимет "одну" запись, таким образом, необходимо будет кодировать вокруг той возможности также (например, таблица User, которая имеет уникальный индекс на имени пользователя; удаленная запись все еще заблокировала бы имя пользователя удаленных пользователей для новых записей. Работа вокруг этого, которое Вы могли прикрепить на GUID к удаленному столбцу имени пользователя, но это очень hacky обходное решение, которое я не рекомендовал бы. Вероятно, при том обстоятельстве было бы лучше просто иметь правило, что, как только имя пользователя используется, это никогда не может заменяться.)
Логические удаления, если плохо обращаются со ссылочной целостностью.
Это - право, думают, чтобы сделать, когда существует временный аспект данных таблицы (допустимый FROM_DATE - TO_DATE).
Иначе перемещают данные в Таблицу Аудита и удаляют запись.
Зато:
Это - более легкий способ откатывать (если вообще возможный).
легко видеть то, что было состоянием в отдельном моменте вовремя.
Ре: "Это безопасно?" - который зависит от того, что Вы имеете в виду.
, Если Вы подразумеваете, что путем выполнения физический удаляют, Вы будете предотвращать любого от когда-либо нахождения удаленных данных , тогда да, это более или менее верно; Вы более в безопасности в физическом удалении уязвимых данных, которые должны быть стерты, потому что это означает, что постоянно пошло от базы данных. (Однако поймите, что могут быть другие копии рассматриваемых данных, такой как в резервном копировании, или журнале транзакций или зарегистрированной версии от в пути, например, анализатор пакетов - просто, потому что Вы удаляете из своей базы данных, не гарантирует, что это не было сохранено где-то в другом месте.)
, Если Вы подразумеваете, что путем выполнения логичный удаляют, данные более безопасны, потому что Вы никогда не будете терять данных , это также верно. Это хорошо для контрольных сценариев; я склонен разрабатывать этот путь, потому что он допускает основной факт, что, как только данные сгенерированы, он никогда не будет действительно , уходят (особенно, если он когда-нибудь имел возможность того, чтобы быть, скажем, кэшируемым интернет-поисковиком). Конечно, реальный контрольный сценарий требует, чтобы не только были, удаляет логичный, но и что обновления также зарегистрированы, наряду со временем изменения и агента, кто внес изменение.
, Если Вы подразумеваете, что данные не попадут в руки никого, кто, как предполагается, не видит его, тогда это полностью до Вашего приложения и его структуры безопасности. В этом отношении, логичный удаляют, не более или менее безопасно, чем что-либо еще в Вашей базе данных.
Я - большой поклонник логического, удаляют, специально для приложения Направления деятельности, или в контексте учетных записей пользователей. Мои причины просты: часто времена, я не хочу, чтобы пользователь был в состоянии использовать систему больше (так учетная запись добираются, отметили, как удалено), но если бы мы удалили пользователя, мы потеряли бы всю их работу и такой.
Другой общий сценарий - то, что пользователи могли бы быть воссозданы, некоторое время будучи удаляет. Это - намного более хороший опыт для пользователя иметь весь их подарок данных, как это было, прежде чем они были удалены, вместо того, чтобы должными быть воссоздать его.
я обычно думаю об удалении пользователей больше как "приостановка" их неограниченно долго. Вы никогда не знаете, когда они должны будут законно вернуться.
Я обычно использую логические удаления - я ищу им работу хорошо, когда Вы также периодически архивируете от 'удаленных' данных к заархивированной таблице (который может искаться в случае необходимости), таким образом имеющий шанс влияния на производительность приложения.
Это работает хорошо, потому что у Вас все еще есть данные, если Вы когда-либо контролируетесь. При удалении его физически это пошло !
Логичны, удаляет обычную практику? Да я видел это во многих местах. Они безопасны? Это действительно зависит, они немного менее безопасный тогда, данные были перед удалением их?
, Когда я был Техническим Выводом, я потребовал, чтобы наши команды сохранили каждую часть данных, я знал в то время, когда мы будем использовать все эти данные для создавания различных приложений BI, хотя в то время, когда мы не знали, каковы требования будут. В то время как это было хорошо с точки зрения аудита, поиска и устранения неисправностей и создания отчетов (Это было электронной коммерцией / сайт инструментов для транзакций B2B, и если кто-то использовал инструмент, мы хотели записать его, даже если их учетная запись была позже выключена), это действительно имело несколько оборотных сторон.
оборотные стороны включают (не включая других, уже упомянутых):
, Когда решение использовать логичный, физический удаляет, или архивация, я задал бы мне эти вопросы:
Это довольно стандартно в случаях, где требуется сохранить историю чего-то (например, учетные записи пользователей как @Jon упоминания Dewees). И это - конечно, прекрасная идея, если существует сильный шанс пользователей, просящих восстановления после удаления.
, Если Вы обеспокоены логикой отфильтровывания удаленных записей от Ваших запросов, становящихся грязными и просто усложняющих Ваши запросы, можно просто создать представления, которые делают фильтрацию для Вас и используют запросы против этого. Это предотвратит утечку этих записей в создании отчетов о решениях и таком.
Adventages являются сохранением/увековечиванием данных. disventage был бы уменьшением в производительности, когда запросы или получение данных из таблиц с significal суммой мягких удаляют. В нашем случае мы используем комбинацию обоих: как другие упомянули в предыдущих ответах, мы soft-delete
users/clients/customers
, например, и hard-delete
на items/products/merchandise
таблицы, где там дублированы записи, которым не нужно пчеле keept.