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我的数据库中插入一个值,这是我遇到问题的地方.
我确保我的数据库表设置为;
我的用于处理表单提交的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)
有人可以告诉我我做错了什么以及如何解决问题,除了使用准备好的陈述?
' 请忽略任何安全漏洞 '
但是安全漏洞是造成错误的原因.
如果你传递NULL就没问题,但如果你传递IP(可能是一个字符串),你就不会引用它,因此错误正在发生.
但是,当您添加引号时,NULL现在被视为字符串而不是NULL因此被添加的字符串.
您可以使用预准备语句来防止这种情况发生.
您可以通过使用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)
但是我将重申关于预准备语句的使用,从长远来看,重写系统以使用预准备语句所花费的时间是值得的,因为你将学习新技能并获得写作安全的经验码.