带有NULL的PHP​​表单输入数组

The*_*eek 2 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...
Run Code Online (Sandbox Code Playgroud)

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

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

  • 允许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]." )
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误是;

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

var_dump($arr_ip)我得到;

array(2) {
  [0]=>
  string(15) "123.123.123.123"
  [1]=>
  string(0) ""
}
Run Code Online (Sandbox Code Playgroud)

如果我' '在插入中将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]."' )
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我做错了什么以及如何解决问题,除了使用准备好的陈述?

Scr*_*t47 7

' 请忽略任何安全漏洞 '

但是安全漏洞是造成错误的原因.

如果你传递NULL就没问题,但如果你传递IP(可能是一个字符串),你就不会引用它,因此错误正在发生.

但是,当您添加引号时,NULL现在被视为字符串而不是NULL因此被添加的字符串.

您可以使用预准备语句来防止这种情况发生.

FYI ...

您可以通过使用foreach循环而不是循环来使代码更简单for:

foreach ($_POST['ip'] as $ip) {
    // insert here
}
Run Code Online (Sandbox Code Playgroud)

看起来更干净,也更容易打字.

此外,使用带有正确标志的filter_var进行IP验证是值得的,以确保传递有效的IP.

编辑#2

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

if (is_null($ip)) {
    // don't quote
} else {
    // quote
}
Run Code Online (Sandbox Code Playgroud)

但是我将重申关于预准备语句的使用,从长远来看,重写系统以使用预准备语句所花费的时间是值得的,因为你将学习新技能并获得写作安全的经验码.