这个问题在这里已经有答案了:
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]."' )
}
有人能告诉我我做错了什么,以及如何解决这个问题,而不是使用事先准备好的声明吗?
1条答案
按热度按时间n53p2ov01#
'请忽略任何安全漏洞'
但是安全漏洞是导致错误的原因。
如果您传递null就可以了,但是如果您传递ip(可能是一个字符串),您没有引用它,因此发生了错误。
但是,当您添加引号时,null现在被视为一个字符串,而不是null,因此是要添加的字符串。
您可以使用准备好的语句来防止这种情况发生。
仅供参考。。。
通过使用
foreach
循环而不是for
回路:看起来更干净,打字也更容易。
另外,使用带有正确标志的filter\u var进行ip验证,以确保传递有效的ip也是值得的。
编辑#2
另一种方法是检查
NULL
通过if语句:但我要重申的是,关于预处理语句的用法,从长远来看,重写系统以使用预处理语句所花费的时间是值得的,因为您将学习新的技能并获得编写安全代码的经验。