Несуществующая константа возврат true

Каждый раз, когда пользователь входит в систему, я извлекаю сериализованный массив, содержащий права. Когда я десериализирую массив и пытаюсь присвоить каждое право константе, несуществующие константы возвращают TRUE. Например, вот мой звонок в базу данных:

    $req_level = $pdo->prepare('SELECT * FROM users_levels WHERE level_id = ?');
$req_level->execute(array($row['level_id']));
$row_level = $req_level->fetch();
$user_level_name = $row_level['name'];
$permissions = unserialize($row_level['permissions']);
foreach ($permissions as $permission) {
define(strtoupper($permission), 1);
}
$req_level->closeCursor();

Мой массив ($ permissions):

Array ( [0] => users_read [1] => users_update [2] => customers_read [3] => customers_update )

Когда я вызываю все возможные константы, я должен получить TRUE для тех, кто существует, и FALSE для тех, кто не существует, но вот что я получил …

USERS_READ : <?=USERS_READ?> <br/>
USERS_UPDATE : <?=USERS_UPDATE?> <br/>
USERS_CREATE : <?=USERS_CREATE?> <br/>
USERS_DELETE : <?=USERS_DELETE?> <br/>

Когда я повторяю константы …

  • USERS_READ: 1
  • USERS_UPDATE: 1
  • USERS_CREATE: USERS_CREATE
  • USERS_DELETE: USERS_DELETE

Таким образом, все возвращает TRUE в этом случае.

Любая идея ?

0

Решение

Как правило, в PHP не найденные константы превращаются в строки с одинаковыми именами. Таким образом, попытка использовать константу «USERS_READ» становится строкой «USERS_READ» при попытке ее использования. Строка ‘USERS_READ’ при преобразовании в логическое значение будет истинной.

Итак, вам нужно использовать метод defined чтобы проверить, существует ли он, прежде чем пытаться оценить константу:

http://php.net/manual/en/function.defined.php

Или вы можете сделать что-то вроде этого:

function userHasPermission( $permission ) {
return constant($permission) === 1;
}

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector