Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Можно ли задать идентификатор равный 0?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
nkl
Отправлено: 29 Июля, 2013 - 10:06:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Сабж звучит примерно так: Может ли в столбце, который является первичным ключом таблицы, плюс, он еще и AUTO_INCREMENT, хранится значение 0.
Вручную, в таком столбце можно поменять значение, главное, что б оно было уникальным. Я попробовал в такой таблице одной строке присвоить 0, привелось нормально, далее таблица заполняется нормально, автоматически добавляется нужные идентификаторы, все норм. Выбрать из этой таблицы строку с идентификатором 0 тоже выбирает. В общем, работает. Вопрос к знатокам, чем чревато использование строки с идентификатором 0? И вообще, плохо это аль хорошо или вообще нормально это?
 
 Top
EuGen Администратор
Отправлено: 29 Июля, 2013 - 10:10:45
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Ничем не чревато с точки зрения БД. Единственное - полагаться на проверки наподобие
PHP:
скопировать код в буфер обмена
  1. if(!$rgData['id']) //данных в таблице не нашлось

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
nkl
Отправлено: 29 Июля, 2013 - 11:02:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




0, NULL и '' это вроде не одно и то же?
 
 Top
EuGen Администратор
Отправлено: 29 Июля, 2013 - 11:06:13
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




nkl пишет:
0, NULL и '' это вроде не одно и то же?

В php - да. В MySQL - нет. Сравнение на NULL корректно делать при помощи IS NULL (т.к. NULL не является сравнимой в обычном смысле величиной и означает отсутствие значения). Если у Вас id равен нулю, то из MySQL он и выберется как 0 - но вот дальше, помня правила сравнения php для оператора "==", следует побеспокоиться о том, чтобы верный с точки зрения БД id не сравнивался некорректно с пустой строкой или null, к примеру.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
quinlena
Отправлено: 29 Июля, 2013 - 13:51:35
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Лучше использовать -1, так лучше
 
 Top
EuGen Администратор
Отправлено: 29 Июля, 2013 - 14:09:42
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




quinlena пишет:
Лучше использовать -1, так лучше

Обоснуйте.
Мои аргументы против этого:
* Как минимум придётся использовать уже знаковый тип данных.
* Нет никакой причины использовать отрицательные значения для id, поскольку они будут такими же числами, а, значит, можно ограничиться и положительными значениями. Вкупе с предыдущим пунктом - положительными id с допустимым интервалом, вдвое большим, чем если использовать отрицательные значения
* Использование отрицательных id обязывает их использовать во всех таблицах-связках или просто связах по ключу, потому как в противном случае несоответствие типов не даст даже построить foreign key, а, если заботиться о целостности на уровне приложения, придётся отказаться от запросов JOIN, поскольку они уже не будут соответствовать реальной структуре данных.

На деле, использовать 0 тоже необязательно, однако это, по крайней мере, не противоречит логике (я сам иногда использую 0 в приложениях для того, чтобы указывать uid=0, gid=0 по аналогии с *nix ОС для детерминирования простых пользователей и root-пользователя, ввиду особенности AND/OR операций с использованием нуля).

quinlena,
Также, ввиду того, что это не первый случай подобных ответов, приведу свой недавний комментарий: http://forum.php.su/topic.php?fo...56950#1374856950 (и, как следствие, тему: http://forum.php.su/topic.php?fo...25&topic=799 - пункт 3)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Июля, 2013 - 16:04:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen пишет:
(я сам иногда использую 0 в приложениях для того, чтобы указывать uid=0, gid=0 по аналогии с *nix ОС для детерминирования простых пользователей и root-пользователя, ввиду особенности AND/OR операций с использованием нуля)
+1
В моем велосипеде тоже есть root-пользователь и root-группа пользователей айдишники которых равны нулю.
 
 Top
caballero
Отправлено: 29 Июля, 2013 - 16:19:36
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
В моем велосипеде тоже есть root-пользователь и root-группа пользователей айдишники которых равны нулю.

-1 Улыбка

нулевой id есть смысл для незарегистрированого юзера. имеется ввиду создание фейкового екземпляра с id = 0 и именем типа "Гость". Для того чтобы не писать if else по всему коду и писать не задумываясь - echo "Здраствуйте, " . $user->username;

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
EuGen Администратор
Отправлено: 29 Июля, 2013 - 16:22:16
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




caballero пишет:
нулевой id есть смысл для незарегистрированого юзера. имеется ввиду создание фейкового екземпляра с id = 0 и именем типа "Гость". Для того чтобы не писать if else по всему коду и писать не задумываясь - echo "Здраствуйте, " . $user->username;

И это тоже- хороший пример использования 0 в качестве id. Но -1 это тоже число, к тому же обладающее перечисленными выше недостатками при использовании в качестве первичного ключа. Речь здесь об альтернативе "ноль" или "не ноль", на фоне чего -1 не даёт накаких преимуществ (нет разницы, -1 или, например, 1000, и то, и другое - не ноль), вместо того порождая проблемы. Поэтому, уверен, -1 и отрицательные значения не следует использовать в качестве первичного ключа (исключая, возможно, редкие случаи, когда того потребует бизнес-логика)
upd. Если имелось ввиду "-1", как альтернатива написанному выше "+1", то - здесь всё решает архитектура, кому что удобнее. Мне, к примеру, очень удобно использовать 0 в качестве операнда в логических выражениях, изящно решая проблему root-пользователя и в то же время не порождая многочисленные if-проверки. Кому-то удобнее использовать 0 для гостевого доступа. Сути (то есть применимости 0 в качестве нормального значения первичного ключа) это не меняет.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 29 Июля, 2013 - 16:26:15
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




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

(Отредактировано автором: 29 Июля, 2013 - 16:27:09)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Июля, 2013 - 16:39:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




caballero пишет:
нулевой id есть смысл для незарегистрированого юзера
Как уже выше сказал EuGen, все решает архитектура приложения, я гостя определяю по приоритету группы, у гостя он равен 1001, что означает самый низший, и так я точно знаю что это гость.
И опять же для существующих или создаваемых групп у меня нельзя указать число приоритета больше 1000.
 
 Top
nkl
Отправлено: 29 Июля, 2013 - 18:03:37
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Не думал что моя темы вызовет стль бурный диспут, всем спасибо. Мне главное что бы потом этот 0 можно было сравнивать вот так $var == 0, $var != 0, $var > 0 и т.д. Радость
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Июля, 2013 - 21:03:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




nkl пишет:
$var == 0, $var != 0, $var > 0
именно так и не получится сравнить.
А вот так получится:

(int) $var === 0, (int) $var !== 0, (int) $var > 0

Вообще меня в последнее время начинает выбешивать нестрогая типизация в пхп..
 
 Top
EuGen Администратор
Отправлено: 30 Июля, 2013 - 12:25:31
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar
https://github[dot]com/almadomundo/dimension/blob/master/README.md
Ну и spl-типы в крайнем случае.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
nkl
Отправлено: 30 Июля, 2013 - 13:13:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




0 или не 0, вот в чем вопрос! Прям дилемма какая! Если я сделаю так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM TABLE WHERE id = 0

и получу массив типа:
$array[1]['id'] = 0;
$array[1]['value'] = 'бла-бла-бла';

Разве нельзя будет потом сравнить так: $array[1]['id'] == 0?
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB