【问题标题】:If no value is posted insert NULL into SQL database [duplicate]如果没有发布值,则将 NULL 插入 SQL 数据库 [重复]
【发布时间】:2014-06-11 19:34:24
【问题描述】:

我知道这个主题有很多问题,但我就是无法理解。 我正在使用 php 将帖子插入数据库。每当我的字段为空时,它都会在数据库中插入“0”而不是 NULL 值...我的代码如下:

<?php
$host=""; // Host name 
$username=""; // Mysql username 
$contra=""; // Mysql password 
$db_name=""; // Database name 

// Connect to server and select database.
$dbh= mysql_connect("$host", "$username", "$contra")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form 
$var1=$_POST["var1"]; 
$var2=$_POST["var2"]; 
$var3=$_POST["var3"]; 
$var4=$_POST["var4"]; 

// To protect MySQL injection
$var1=stripslashes($var1);
$var2=stripslashes($var2);
$var3=stripslashes($var3);
$var4=stripslashes($var4);

$var1 = mysql_real_escape_string($var1);
$var2 = mysql_real_escape_string($var2);
$var3 = mysql_real_escape_string($var3);
$var4 = mysql_real_escape_string($var4);

            $sql="INSERT INTO PREGUNTAS (Var1, Var2, Var3, Var4) VALUES('$var1', '$var2', '$var3', '$var4');";
            $table= mysql_query($sql, $dbh) or die ("you've got a problem");            
                    }
    break;
}
 ?>

我试着像这样启动变量

$var2 = isset($_POST["var2"]) ? "'$var2'" : "NULL";

if($_POST['var2'] == "") $_POST['var2'] = "NULL";

但它们都不起作用,查询仍在添加 0。

我收到以下错误/通知:

注意:未定义索引:var2 in /.....php on line ...

你能帮帮我吗?

谢谢!

【问题讨论】:

  • 因为'NULL'是一个字符串,而NULL(不带引号)表示空值
  • 可能在您的数据库中为这些列设置的默认值是 0。因此,当传递 NULL 时,输入 0(默认值)。
  • 您应该查看 PDO 以正确引用这些字符串
  • stripslashes 不会阻止 SQL 注入。

标签: php mysql sql post null


【解决方案1】:

您已经在查询中引用了字段值,因此即使您在 PHP 中将特定变量设置为字符串 NULL,您仍然会尝试这样做

INSERT ... VALUES ('NULL', ...)

一个 SQL NULL 是一个关键字,如果你想让数据库把它当作一个实际的空值,它不能被引用,例如

INSERT ... VALUES(NULL, 'NULL', ...)
                  ^^^^---actual SQL null
                        ^^^^^^--- a string which contains the letters N, U, L, L

这意味着您需要以不同的方式重建查询:

if ($_POST['var1'] == '') {
    $db_var1 = 'NULL';
} else {
    $db_var1 = "'" . mysql_real_escape_string($_POST['var1']) . "'";
}

INSERT ... VALUES($db_var1, ...)

【讨论】:

  • OP -> 考虑使用 mysqli 来更好地帮助避免 sql 注入
【解决方案2】:

改用empty() 函数

$var2 = !empty($_POST["var2"]) ? "'$var2'" : NULL;

isset() 将始终为真,因为输入字段已提交,同时避免在 NULL 中使用双引号,否则您将插入一个字符串

【讨论】:

  • 这将继续插入 NULL 作为字符串..
【解决方案3】:

试试这个:

$fields = array('var1','var2','var3','var4');
$values = array();
foreach($fields as $field) :
    $field = isset($_POST[$field])? trim($_POST[$field]) : null;
    if(is_null($field)) continue;
    $values[$field] = "'".mysql_real_escape_string($field)."'";
endforeach;

if(is_array($values) AND !empty($values)) :
    $query = "INSERT INTO PREGUNTAS (".implode(',', array_keys($values)).") VALUES (".implode(',', array_values($values)).")";
    $table= mysql_query($query, $dbh) or die ("you've got a problem");  
endif;

或者这个:

试试这个:

$fields = array('var1','var2','var3','var4');
$values = array();
foreach($fields as $field) :
    $field = isset($_POST[$field])? trim($_POST[$field]) : null;
    if(is_null($field)) {
        $values[$field] = 'NULL',
        continue;
    }
    $values[$field] = "'".mysql_real_escape_string($field)."'";
endforeach;

if(is_array($values) AND !empty($values)) :
    $query = "INSERT INTO PREGUNTAS (".implode(',', array_keys($values)).") VALUES (".implode(',', array_values($values)).")";
    $table= mysql_query($query, $dbh) or die ("you've got a problem");  
endif;

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 2019-01-21
    • 2011-10-28
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2019-11-17
    相关资源
    最近更新 更多