使用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
值,这就是我遇到的问题。
我确保将数据库表设置为;
我用于处理表单提交的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]."' )
}
除了使用准备好的语句外,有人可以告诉我我在做什么错以及如何解决该问题吗?
答案 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
}
但是我要重申关于准备语句的用法,从长远来看,重写系统以使用准备语句的时间将是值得的,因为您将学习新技能并获得经验编写安全代码。