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
Форумы портала PHP.SU :: Версия для печати :: null записывается в базу как ноль
Форумы портала PHP.SU » » Работа с СУБД » null записывается в базу как ноль

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

1. highroller - 24 Сентября, 2015 - 12:35:51 - перейти к сообщению
Значит ситуация такова:
Есть таблица в которой значения полей в которой null
Есть набор переменных:
$id=$_POST['id'];}
$num=$_POST['num'];}
$price=$_POST['price'];}
$rarity=$_POST['rarity'];}
$sell=$_POST['sell'];}
$coef=$_POST['coef'];}

Есть запрос:
$query="UPDATE `$dbName`.`$table` SET `num`='".$num."',`price`='".$price."',`coef`='".$coef."' WHERE `$table`.`id`='".$id."' LIMIT 1;";

Значения всех переменных - null, но после выполнения запроса в базе я вижу '0' вместо 'null'. В чем может быть причина?
2. OrmaJever - 24 Сентября, 2015 - 12:42:35 - перейти к сообщению
а вы бы вывели запрос да посмотрели, там примерно такая запись num = '', а должна быть вот такая num = null. Вот и думайте как это исправить
3. LIME - 24 Сентября, 2015 - 12:47:08 - перейти к сообщению
OrmaJever ошибаешься
При пустой строке и без not null будет именно null
highroller проверь настройки полей
Должно быть проставлено разрешение значения null по умолчанию
И тогда при пустой строке будет проставлен null
Конечно если не передается 0 явно
4. highroller - 24 Сентября, 2015 - 12:50:53 - перейти к сообщению
LIME уже проверил, null разрешен, по умолчанию - null
Ноль точно не передается
Непосредственно перед запросом:
if ($num == null)echo 'TRUE'; результат - 'TRUE'
5. LIME - 24 Сентября, 2015 - 12:53:35 - перейти к сообщению
Дык сам запрос выведи и смотри
Если сам не догонишь сюда его кидай
Вместе с таблицой в формате create
(Добавление)
$num === null
6. Мелкий - 24 Сентября, 2015 - 13:17:50 - перейти к сообщению
LIME пишет:
При пустой строке и без not null будет именно null

Мне известны два варианта и ни в одном из них на пустую строку null'а нет.
CODE (SQL):
скопировать код в буфер обмена
  1. mysql> CREATE TABLE test (
  2.     ->   id integer AUTO_INCREMENT PRIMARY KEY,
  3.     ->   numb int DEFAULT NULL
  4.     ->   ) engine=innodb;
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> INSERT INTO test (id,numb) VALUES(1,NULL);
  8. Query OK, 1 row affected (0.00 sec)
  9.  
  10. mysql> INSERT INTO test (id,numb) VALUES(2,0);
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> INSERT INTO test (id,numb) VALUES(3,'');
  14. Query OK, 1 row affected, 1 warning (0.00 sec)
  15.  
  16. mysql> INSERT INTO test (id,numb) VALUES(4,'0');
  17. Query OK, 1 row affected (0.00 sec)
  18.  
  19. mysql> SET sql_mode=STRICT_ALL_TABLES;
  20. Query OK, 0 rows affected (0.00 sec)
  21.  
  22. mysql> INSERT INTO test (id,numb) VALUES(5,NULL);
  23. Query OK, 1 row affected (0.01 sec)
  24.  
  25. mysql> INSERT INTO test (id,numb) VALUES(6,0);
  26. Query OK, 1 row affected (0.00 sec)
  27.  
  28. mysql> INSERT INTO test (id,numb) VALUES(7,'');
  29. ERROR 1366 (HY000): Incorrect integer value: '' FOR COLUMN 'numb' at row 1
  30. mysql> INSERT INTO test (id,numb) VALUES(8,'0');
  31. Query OK, 1 row affected (0.00 sec)
  32.  
  33. mysql> SELECT * FROM test;
  34. +----+------+
  35. | id | numb |
  36. +----+------+
  37. |  1 | NULL |
  38. |  2 |    0 |
  39. |  3 |    0 |
  40. |  4 |    0 |
  41. |  5 | NULL |
  42. |  6 |    0 |
  43. |  8 |    0 |
  44. +----+------+
  45. 7 rows IN SET (0.00 sec)
  46.  
  47. mysql> SELECT version();
  48. +-----------------+
  49. | version()       |
  50. +-----------------+
  51. | 5.5.44-0+deb8u1 |
  52. +-----------------+
  53. 1 row IN SET (0.00 sec)


highroller пишет:
В чем может быть причина?

В том, что вы зачем-то конкатенируете строку запроса с данными. Используйте нормальные prepared statements.
7. LIME - 24 Сентября, 2015 - 13:28:51 - перейти к сообщению
Мелкий ошибся видимо
Когдато столкнулся с написанием автоинкремента как пустой строки, там можно и null также писать
null вообще тема скользкая
8. highroller - 24 Сентября, 2015 - 16:31:21 - перейти к сообщению
Вот дамп таблицы:


CREATE TABLE IF NOT EXISTS `misc` (
`id` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT,
`num` int(11) DEFAULT NULL,
`name` text NOT NULL,
`price` int(11) DEFAULT NULL,
`coefficient` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

--
-- Дамп данных таблицы `misc`
--

INSERT INTO `misc` (`id`, `num`, `name`, `price`, `coefficient`) VALUES
(0001, NULL, 'item1', NULL, NULL),
(0002, NULL, 'item2', NULL, NULL);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


Такой запрос непосредственно в консоли
UPDATE `price1`.`misc` SET `num`='null',`name`='item1',`price`='null',`coefficient`='null' WHERE `misc`.`id`='0001' LIMIT 1;
выдает вполне ожидаемые результаты, т. е. null в нужных полях.
А вот тот же запрос выполненный из php - уже нули
$query="UPDATE `price1`.`misc` SET `num`='".$num."',`name`='".$name."',`price`='".$price."',`coefficient`='".$coefficient."' WHERE `misc`.`id`='0001' LIMIT 1;";
mysql_query($query) or die("Запрос не выполнен!");
9. Sail - 24 Сентября, 2015 - 16:35:24 - перейти к сообщению
highroller пишет:
А вот тот же запрос выполненный из php - уже нули
$query="UPDATE `price1`.`misc` SET `num`='".$num."',`name`='".$name."',`price`='".$price."',`coefficient`='".$coefficient."' WHERE `misc`.`id`='0001' LIMIT 1;";
mysql_query($query) or die("Запрос не выполнен!");

Добавьте
и всё поймёте.
10. Мелкий - 24 Сентября, 2015 - 16:56:12 - перейти к сообщению
highroller пишет:
выдает вполне ожидаемые результаты, т. е. null в нужных полях.

CODE (SQL):
скопировать код в буфер обмена
  1. mysql> CREATE TABLE IF NOT EXISTS `misc` (
  2.     ->  `id` int(4) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
  3.     ->  `num` int(11) DEFAULT NULL,
  4.     ->  `name` text NOT NULL,
  5.     ->  `price` int(11) DEFAULT NULL,
  6.     ->  `coefficient` int(11) DEFAULT NULL,
  7.     ->  PRIMARY KEY (`id`),
  8.     ->  UNIQUE KEY `id` (`id`)
  9.     ->  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
  10. Query OK, 0 rows affected (0.00 sec)
  11.  
  12. mysql>  INSERT INTO `misc` (`id`, `num`, `name`, `price`, `coefficient`) VALUES
  13.     ->  (0001, NULL, 'item1', NULL, NULL),
  14.     ->  (0002, NULL, 'item2', NULL, NULL);
  15. Query OK, 2 rows affected (0.00 sec)
  16. Records: 2  Duplicates: 0  Warnings: 0
  17.  
  18. mysql> UPDATE `misc` SET `num`='null',`name`='item1',`price`='null',`coefficient`='null' WHERE `misc`.`id`='0001' LIMIT 1;
  19. Query OK, 1 row affected, 3 warnings (0.00 sec)
  20. Rows matched: 1  Changed: 1  Warnings: 3
  21.  
  22. mysql> SELECT * FROM misc;
  23. +------+------+-------+-------+-------------+
  24. | id   | num  | name  | price | coefficient |
  25. +------+------+-------+-------+-------------+
  26. | 0001 |    0 | item1 |     0 |           0 |
  27. | 0002 | NULL | item2 |  NULL |        NULL |
  28. +------+------+-------+-------+-------------+
  29. 2 rows IN SET (0.00 sec)


Вполне себе 0, а не NULL. И тройка варнингов на месте.

LIME пишет:
Когдато столкнулся с написанием автоинкремента как пустой строки, там можно и null также писать

И 0 тоже спровоцирует выдачу нового сиквенса. Отключается через NO_AUTO_VALUE_ON_ZERO в том же sql_mode.
11. LIME - 24 Сентября, 2015 - 17:02:15 - перейти к сообщению
Мелкий пишет:
Отключается через NO_AUTO_VALUE_ON_ZERO в том же sql_mode.
избегается использованием "человеческой" модели
12. highroller - 24 Сентября, 2015 - 17:16:20 - перейти к сообщению
Всем спасибо за помощь Радость Видно глаз совсем замылен
Добавил проверку типа
if ($_POST['num']==null){$num="NULL";}else{$num=$_POST['num'];}
все заработало как надо!
Можно закрывать


P.S. Кавычки, как всегда кавычки...
Вот правильный запрос
$query="UPDATE `price1`.`misc` SET `num`=$num,`name`='$name',`price`=$price,`coefficient`=$coefficient WHERE `misc`.`id`='0001' LIMIT 1;";

 

Powered by ExBB FM 1.0 RC1