webew
Войти » Регистрация
 
PHP

массивы, isset и NULL из MySQL

17 сентября 2011, 3:24
Автор: 1234ru
Существует случай, когда isset($array['something']) вернет FALSE, даже когда элемент 'something' установлен (хотя это и не очевидно).
Этот случай - когда $array['something'] содержит NULL.

Встречаться это может при получении данных из MySQL, когда соответствующие ячейки содержат NULL:

mysql> CREATE TABLE t (i INT);
Query OK, 0 rows affected (0.23 sec)

mysql> INSERT INTO t VALUES ();
Query OK, 1 row affected (0.06 sec)

mysql> SELECT * FROM t;
+------+
| i    |
+------+
| NULL |
+------+
1 row in set (0.02 sec)


В PHP:

$sql = "SELECT i FROM t";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);

print_r($row); // Array ( 0 => )

// как видно, элемент присутствует в массиве
// несмотря на это, isset возвращает FALSE:

echo (isset($row) == FALSE); // TRUE

// единственный путь установить истину -
// использование функции array_key_exists:

echo array_key_exists(0, $row); // TRUE


Такое поведение isset() отражено в документации:

Цитата:
isset — Determine if a variable is set and is not NULL


Однако на практике в PHP хранение величин NULL встречается редко, и о такой особенности можно позабыть.
Добавить комментарий
NO USERPIC

rgbeast

На мой взгляд это не редкий случай, а распространенная причина путаницы. В MySQL по умолчанию значение поля NULL (если не определить иначе) и многие считают это эквивалентом пустого значения. Практично, конечно, объявлять все поля NOT NULL (если нет специальной необходимости в NULL), но это требует дополнительного усилия.
17.09.2011, 12:49
Ответить

1234ru

Я имел в виду хранение величин NULL в PHP, а не в MySQL (поправил сообщение). В PHP я особо не припомню случаев, чтобы я NULL записывал (обычно - FALSE; а теперь, из-за isset - точно FALSE будут всегда использовать)
То, что не убивает нас, делает нас инвалидами.
18.09.2011, 04:33
Ответить
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: