PHP表单输入数组为NULL

时间:2018-10-23 12:00:39

标签: php mysql arrays null mariadb

使用PHP版本7.1.9,MariaDB 10.1.26。

我正在向MySQL数据库提交一系列表单数据。输入看起来像这样;

// I have removed additional html form code for brevity
<input type="text" name="ip[]">
<input type="text" name="ip[]">
etc...

当输入为空时,我想在数据库中插入一个NULL值,这就是我遇到的问题。

我确保将数据库表设置为;

  • 允许null =是
  • 默认-空

我用于处理表单提交的PHP代码在下面(请忽略任何安全漏洞);

// I have removed additional php code for brevity
$arr_ip = $_POST['ip'];
for ($i = 0; $i < count($arr_ip); $i++) {
    $arr_ip[$i] = $arr_ip[$i] ? $arr_ip[$i] : 'NULL';
    $sql = "INSERT INTO staff (ip) VALUES ( ".$arr_ip[$i]." )
}

我收到的错误是;

  

SQLSTATE [42000]:语法错误或访问冲突:1064您有一个   您的SQL语法错误;检查与您的手册相对应的手册   正确语法的MySQL服务器版本.. ..

当我var_dump($arr_ip)得到时;

array(2) {
  [0]=>
  string(15) "123.123.123.123"
  [1]=>
  string(0) ""
}

如果我在插入中将PHP更改为以下内容(注意附加的' '),则查询成功运行,插入了两个记录,但但是字面词为NULL插入数据库而不是插入(NULL)值。

$arr_ip = $_POST['ip'];
for ($i = 0; $i < count($arr_ip); $i++) {
    $arr_ip[$i] = $arr_ip[$i] ? $arr_ip[$i] : 'NULL';
    $sql = "INSERT INTO staff (ip) VALUES ( '".$arr_ip[$i]."' )
}

除了使用准备好的语句外,有人可以告诉我我在做什么错以及如何解决该问题吗?

1 个答案:

答案 0 :(得分:7)

'请忽略任何安全漏洞'

但是安全漏洞是导致此错误的原因。

如果传递NULL会很好,但是如果传递IP(大概是字符串),则不会引用它,因此会发生错误。

但是,当您添加引号时,现在会将NULL视为字符串,而不是NULL,因此将其添加为字符串。

您可以使用prepared statements来防止这种情况的发生。

仅供参考...

您可以使用foreach循环而不是for循环来简化代码:

foreach ($_POST['ip'] as $ip) {
    // insert here
}

看起来更干净,也更容易输入。

此外,值得使用filter_var和正确的flag来进行IP验证,以确保通过有效的IP。

编辑#2

另一种方法是通过if语句检查NULL

if (is_null($ip)) {
    // don't quote
} else {
    // quote
}

但是我要重申关于准备语句的用法,从长远来看,重写系统以使用准备语句的时间将是值得的,因为您将学习新技能并获得经验编写安全代码。