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 :: null записывается в базу как ноль

 PHP.SU

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


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

> Без описания
highroller
Отправлено: 24 Сентября, 2015 - 12:35:51
Post Id


Новичок


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


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




Значит ситуация такова:
Есть таблица в которой значения полей в которой 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'. В чем может быть причина?
 
 Top
OrmaJever Модератор
Отправлено: 24 Сентября, 2015 - 12:42:35
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




а вы бы вывели запрос да посмотрели, там примерно такая запись num = '', а должна быть вот такая num = null. Вот и думайте как это исправить


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
LIME
Отправлено: 24 Сентября, 2015 - 12:47:08
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




OrmaJever ошибаешься
При пустой строке и без not null будет именно null
highroller проверь настройки полей
Должно быть проставлено разрешение значения null по умолчанию
И тогда при пустой строке будет проставлен null
Конечно если не передается 0 явно
 
 Top
highroller
Отправлено: 24 Сентября, 2015 - 12:50:53
Post Id


Новичок


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


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




LIME уже проверил, null разрешен, по умолчанию - null
Ноль точно не передается
Непосредственно перед запросом:
if ($num == null)echo 'TRUE'; результат - 'TRUE'
 
 Top
LIME
Отправлено: 24 Сентября, 2015 - 12:53:35
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




Дык сам запрос выведи и смотри
Если сам не догонишь сюда его кидай
Вместе с таблицой в формате create
(Добавление)
$num === null
 
 Top
Мелкий Супермодератор
Отправлено: 24 Сентября, 2015 - 13:17:50
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




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.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 24 Сентября, 2015 - 13:28:51
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




Мелкий ошибся видимо
Когдато столкнулся с написанием автоинкремента как пустой строки, там можно и null также писать
null вообще тема скользкая
 
 Top
highroller
Отправлено: 24 Сентября, 2015 - 16:31:21
Post Id


Новичок


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


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




Вот дамп таблицы:


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("Запрос не выполнен!");

(Отредактировано автором: 24 Сентября, 2015 - 16:32:46)

 
 Top
Sail
Отправлено: 24 Сентября, 2015 - 16:35:24
Post Id



Участник


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


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




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("Запрос не выполнен!");

Добавьте
и всё поймёте.
 
 Top
Мелкий Супермодератор
Отправлено: 24 Сентября, 2015 - 16:56:12
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




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.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 24 Сентября, 2015 - 17:02:15
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




Мелкий пишет:
Отключается через NO_AUTO_VALUE_ON_ZERO в том же sql_mode.
избегается использованием "человеческой" модели
 
 Top
highroller
Отправлено: 24 Сентября, 2015 - 17:16:20
Post Id


Новичок


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


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




Всем спасибо за помощь Радость Видно глаз совсем замылен
Добавил проверку типа
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;";

(Отредактировано автором: 24 Сентября, 2015 - 18:14:19)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB