作者:ThanksGiven | 来源:互联网 | 2022-12-01 16:19
使用PHP版本7.1.9,MariaDB 10.1.26.
我正在向MySQL数据库提交一组表单数据.输入看起来像这样;
// I have removed additional html form code for brevity
etc...
当输入为空时,我想在NULL
我的数据库中插入一个值,这是我遇到问题的地方.
我确保我的数据库表设置为;
允许null =是
默认 - null
我的用于处理表单提交的PHP代码如下(请忽略任何安全漏洞) ;
// I have removed additional php code for brevity
$arr_ip = $_POST['ip'];
for ($i = 0; $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
有人可以告诉我我做错了什么以及如何解决问题,除了使用准备好的陈述?
1> Script47..:
' 请忽略任何安全漏洞 '
但是安全漏洞是造成错误的原因.
如果你传递NULL就没问题,但如果你传递IP(可能是一个字符串),你就不会引用它,因此错误正在发生.
但是,当您添加引号时,NULL现在被视为字符串而不是NULL因此被添加的字符串.
您可以使用预准备语句来防止这种情况发生.
FYI ...
您可以通过使用foreach
循环而不是循环来使代码更简单for
:
foreach ($_POST['ip'] as $ip) {
// insert here
}
看起来更干净,也更容易打字.
此外,使用带有正确标志的filter_var进行IP验证是值得的,以确保传递有效的IP.
编辑#2
另一种方法是NULL
通过if语句检查:
if (is_null($ip)) {
// don't quote
} else {
// quote
}
但是我将重申关于预准备语句的使用,从长远来看,重写系统以使用预准备语句所花费的时间是值得的,因为你将学习新技能并获得写作安全的经验码.