INSERT NULL值不起作用而我得到0.000

时间:2014-02-18 01:14:43

标签: 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: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'"; 

3 个答案:

答案 0 :(得分:5)

如果某个字段为空或有人在编辑时将其清除(我认为也可以),则该值为空字符串。

因此,为了确保在空字符串中插入NULL,您可以(对于所有可能为NULL的变量):

$test1 = ($_POST['test1'] === '') ? NULL : $_POST['test1'];

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

您应该为sql插入使用预准备语句。

修改:另请注意,当您尝试插入NULL值时,应该只插入NULL而不是'NULL'。通过切换到带有绑定变量的预准备语句,也可以解决这个问题。

编辑2:这里可行的临时解决方案是从sql语句中删除引号并将其添加到赋值中:

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

$insert = "INSERT INTO tests SET 
member_id='$_SESSION[SESS_MEMBER_ID]', 
test1=$test, 
test2=$test2,
test3=$test3,
...

我已经使用(float)至少摆脱了sql注入问题(mysql_real_escape_string()可能更好,不知道,不再使用它了...),但是这更像是一个黑客而不是一个真正的解决方案。 请切换到带有绑定变量的预准备语句

答案 1 :(得分:2)

您必须完全将NULL 中的项目从中删除。

尝试类似:

foreach ($_POST as $k => $v)
{
    $query .= "{$k}='{$v}',";
}

你必须让你的逗号工作等等。

警告:

请不要在生产中使用此代码。您应始终sanitize user inputs,使用parameterized SQL,并且不接受您不期望的POST密钥。

答案 2 :(得分:1)

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

CREATE TABLE IF NOT EXISTS MyTable (
  MyField datatype DEFAULT NULL,
);

如果要更新表而不是重新创建表,请执行以下操作:

ALTER TABLE MyTable
ALTER COLUMN MyField datatype DEFAULT NULL