function save($gmt, $name, $address, $phone, $remark) { $query= "INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('$gmt', '$name', '$address', '$phone', '$remark')"; mysql_query($query); }
Здесь адрес, телефон и примечание могут иметь значение NULL. Мне это нужно, так что, когда я передаю нулевой параметр в свою функцию, он сохраняет пустое значение в базе данных (NULL). Мне нужно знать, какое лучшее решение для этого.
Благодарю.
Это решение PHP, но вы должны использовать mysqli, потому что mysql устарел, пожалуйста, прочитайте больше о mysqli . Кроме того, вы должны учитывать SQL-инъекцию
function save($gmt, $name, $address, $phone, $remark) { if(empty($phone)){ $phone = 'NULL'; }else{ $phone = "'".$phone."'"; } if(empty($remark)){ $remark = 'NULL'; }else{ $remark = "'".$remark."'"; } $query= "INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('$gmt', '$name', '$address', $phone, $remark)"; mysql_query($query); } //tests save("a", "b", "c", "", "")."<br>"; save("a", "b", "c", "d", "")."<br>"; save("a", "b", "c", "d", "e")."<br>"; /* INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', NULL, NULL) INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', 'd', NULL) INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', 'd', 'e') */ ?>
DEMO
Попробуйте переключиться на подготовленные заявления (которые в качестве бонуса менее склонны к SQL-инъекциям).
function save($gmt, $name, $address, $phone, $remark) { if(!isset($phone) || empty($phone)) { $phone = null; } if(!isset($remark) || empty($remark) { $remark = null; } $db = new PDO(...); $stmt = $db->prepare("INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES (:gmt, :name, :address, :phone, :remark)"); $stmt->bindValue("gmt", $gmt, PDO::PARAM_STR); $stmt->bindValue("name", $name, PDO::PARAM_STR); $stmt->bindValue("address", $address, PDO::PARAM_STR); $stmt->bindValue("phone", $phone, PDO::PARAM_STR); $stmt->bindValue("remark", $remark, PDO::PARAM_STR); $stmt->execute(); }
Это корректно обрабатывает null
значения в MySQL
PHP не печатает NULL – это всего лишь пустая строка. Поэтому в вашем примере вы попытаетесь вставить ''
, который в SQL снова является пустой строкой.
Вы должны использовать NULL
(без кавычек).
И наилучшей практикой для этого является использование ORM или PHP-структуры с уровнем абстракции базы данных, который делает это для вас.
Используя тернарный оператор, вы также можете использовать
$add = ($address == '' ? NULL : $address); $phn = ($phone == '' ? NULL : $phone); $rmk = ($remark == '' ? NULL : $remark);