Php 插入无效的空值,我得到0.000

Php 插入无效的空值,我得到0.000,php,mysql,Php,Mysql,我试图将一个表单输入到一个使用数值(主要是小数)的数据库中 这个表单可以很好地更新和插入,但是我希望NULL字段可以将NULL插入数据库 如果我将字段留空,它仍会将0.000放入数据库。我将数据库设置为NULL=YES 是否有一段简短的代码可以用于所有14个文本框 这是我的代码: <?php if (isset($_POST['submit'])) { $date2 = date("y-m-d"); // DATE OF TANK ADDITION $time2 = date("H:i:

我试图将一个表单输入到一个使用数值(主要是小数)的数据库中

这个表单可以很好地更新和插入,但是我希望
NULL
字段可以将
NULL
插入数据库

如果我将字段留空,它仍会将
0.000
放入数据库。我将数据库设置为
NULL=YES

是否有一段简短的代码可以用于所有14个文本框

这是我的代码:

<?php
if (isset($_POST['submit'])) {

$date2 = date("y-m-d"); // DATE OF TANK ADDITION
$time2 = date("H:i:s", time() - 3600);   // TIME OF TANK ADDITION 

$test1 = $_POST['test1']; 
$test2 = $_POST['test2']; 
$test3 = $_POST['test3']; 
$test4 = $_POST['test4']; 
$test5 = $_POST['test5']; 
$test6 = $_POST['test6']; 
$test7 = $_POST['test7']; 
$test8 = $_POST['test8']; 
$test9 = $_POST['test9']; 
$test10 = $_POST['test10']; 
$test11 = $_POST['test11']; 
$test12 = $_POST['test12']; 
$test13 = $_POST['test13'];
$test14 = $_POST['test14'];
$time = $_POST['time'];
$date = $_POST['date'];
$month = $_POST['month'];
$day = $_POST['day'];
$active1 = $_POST['active1'];
$active2 = $_POST['active2'];
$active3 = $_POST['active3'];
$active4 = $_POST['active4'];
$active5 = $_POST['active5'];
$active6 = $_POST['active6'];
$active7 = $_POST['active7'];
$active8 = $_POST['active8'];
$active9 = $_POST['active9'];
$active10 = $_POST['active10'];
$active11 = $_POST['active11'];
$active12 = $_POST['active12'];
$active13 = $_POST['active13'];
$active14 = $_POST['active14'];
$tank = $_POST['tank'];


$insert = "INSERT INTO tests SET 
member_id='$_SESSION[SESS_MEMBER_ID]', 
test1='$test1', 
test2='$test2',
test3='$test3',
test4='$test4',
test5='$test5',
test6='$test6',
test7='$test7',
test8='$test8',
test9='$test9',
test10='$test10',
test11='$test11',
test12='$test12',
test13='$test13',
test14='$test14',
date='$date', 
month='$month', 
day='$day', 
time='$time',
active1='$active1',
active2='$active2',
active3='$active3',
active4='$active4',
active5='$active5',
active6='$active6',
active7='$active7',
active8='$active8',
active9='$active9',
active10='$active10',
active11='$active11',
active12='$active12',
active13='$active13',
active14='$active14',
tank_id='$tank'"; 

您必须将所需的项目
NULL
完全排除在查询之外

尝试以下方法:

foreach ($_POST as $k => $v)
{
    $query .= "{$k}='{$v}',";
}
你必须让逗号起作用,等等

警告:


请不要在生产中使用此代码。您应该始终使用和不接受您不期望的POST键。

当某个字段为空或有人在编辑时清除它时(我认为这也是可能的),该值是一个空字符串

因此,为了确保在有空字符串的地方插入
NULL
,您可以执行以下操作(对于可以为
NULL
)的所有变量):

这将真正将值设置为
NULL
,而不是插入时将转换为0的空字符串

您应该为sql插入使用准备好的语句

编辑:还要注意,当您尝试插入
NULL
值时,应该只插入
NULL
而不是
'NULL'
。这个问题也可以通过切换到带有绑定变量的预处理语句来解决

编辑2:一个临时解决方案可以在这里工作,即从sql语句中删除引号并将其添加到赋值中:

$test1 = ($_POST['test1'] === '') ? NULL : ("'" . (float) $_POST['test1'] . "'");
...
以及:


我已经使用了
(float)
来至少解决了这里的sql注入问题(
mysql\u real\u escape\u string()
可能更好,不知道,不要再使用它了…),但这更像是一种黑客行为,而不是真正的解决方案请切换到带有绑定变量的准备语句

您的表结构中是否有特定字段的
默认空值
? 该表需要知道如何处理默认值

CREATE TABLE IF NOT EXISTS MyTable (
  MyField datatype DEFAULT NULL,
);
如果要更新表而不是重新创建表,请执行以下操作:

ALTER TABLE MyTable
ALTER COLUMN MyField datatype DEFAULT NULL

您可以显示您的表结构或创建语法吗?您是否将字段设置为默认值为null?是默认值设置为null空白值不为null
NULL
为NULL,在
INSERT
语句中完全缺少该字段是触发默认值的原因。MySQL将“尽最大努力”转换您的空白字段。您应该认真考虑规范化您的数据库表。OP没有提到默认值,只提到字段可以为空的事实。@StephenJackson无论您在哪里初始化变量,这一行将取代您的(第7行)您应该对所有可以为
NULL
的变量执行此操作。我将第7行更改为您上面的代码,并且我的表中仍然得到0.000,默认值设置为NULL,而NULL在表中设置为YESphpMyadmin@StephenJackson手动设置值时,默认值并不重要。对于哪个列,您得到0.000,
test1
列?您真的应该发布您的数据库结构。@StephenJackson您真的应该切换到准备好的语句。现在的问题是,您试图将字符串
'NULL'
插入数据库,而您应该添加
NULL
(不带单引号)。只需执行
var\u转储($insert)
你会明白我的意思。@StephenJackson如果值不是空字符串,你可以通过在赋值中添加引号并从sql字符串中删除它们来修复/破解它,但预处理语句肯定会更容易,并且可以摆脱你现在遇到的令人讨厌的sql注入问题。
CREATE TABLE IF NOT EXISTS MyTable (
  MyField datatype DEFAULT NULL,
);
ALTER TABLE MyTable
ALTER COLUMN MyField datatype DEFAULT NULL