php带有空值的表单输入数组

fruv7luv  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(235)

这个问题在这里已经有答案了

php/mysql插入空值(3个答案)
两年前关门了。
使用php版本7.1.9、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 在我的数据库中,这是我遇到的问题。
我已经确保我的数据库表设置为;
allow 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更改为以下内容(请注意 ' ' )在insert中,查询运行成功,插入了两条记录,但没有插入文字 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]."' )
}

有人能告诉我我做错了什么,以及如何解决这个问题,而不是使用事先准备好的声明吗?

n53p2ov0

n53p2ov01#

'请忽略任何安全漏洞'
但是安全漏洞是导致错误的原因。
如果您传递null就可以了,但是如果您传递ip(可能是一个字符串),您没有引用它,因此发生了错误。
但是,当您添加引号时,null现在被视为一个字符串,而不是null,因此是要添加的字符串。
您可以使用准备好的语句来防止这种情况发生。

仅供参考。。。

通过使用 foreach 循环而不是 for 回路:

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

看起来更干净,打字也更容易。
另外,使用带有正确标志的filter\u var进行ip验证,以确保传递有效的ip也是值得的。
编辑#2
另一种方法是检查 NULL 通过if语句:

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

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

相关问题