我以两种方式生成以下查询,但使用相同的函数插入数据库:
在person值(‘、'john’、'smith‘、'new york’、'NY‘、’123456‘)中插入;
下面的方法导致正确的插入,sql数据库中没有额外的空行。
foreach($_POST as $item)
$statement .= "'$item', ";
$size = count($statement);
$statement = substr($statement, 0, $size-3);
$statement .= ");";下面的代码应该生成一个与上面的查询相同的查询(它们的响应是相同的),但是当我使用它时,在正确的数据行之后,一个额外的空白行(带有id)被插入到数据库中。所以每次插入两行。
$mytest = "INSERT INTO person VALUES('','$_POST[name]', '$_POST[address]','$_POST[city]', '$_POST[state]', '$_POST[zip]');";因为我需要对表单中发布的项运行验证,并且需要在将其存储到数据库之前执行一些操作,所以我需要能够使用第二个查询方法。
我不明白这两个人怎么会不同。我使用完全相同的函数连接并插入数据库,所以问题不存在。
下面是我的插入函数,以供参考:
function do_insertion($query) {
$db = get_db_connection();
if(!($result = mysqli_query($db, $query))) {
#die('SQL ERROR: '. mysqli_error($db));
write_error_page(mysqli_error($db));
} #end if
}感谢您在这方面的任何现场/帮助。
发布于 2014-11-19 17:52:03
在查询中直接使用$_POST会让您发现很多不好的事情,这只是错误的做法。在进入数据库之前,您至少应该做些事情来清理数据。
通常情况下,$_POST变量可以包含其他值,具体取决于浏览器、表单提交。你试过在你的前额做空/空检查吗?
!~伪码不用于生产~!
foreach($_POST as $item)
{
if(isset($item) && $item != "")
{
$statement .= "'$item', ";
$size = count($statement);
$statement = substr($statement, 0, $size-3);
$statement .= ");";
}
}请阅读@tadman关于使用bind_param和保护自己不受SQL注入影响的评论。为了回答您的问题,您的$_POST很可能包含正在放入查询中的空数据,并导致添加的行。
发布于 2014-11-19 17:57:54
正如@yycdev所述,您面临着SQL注入的风险。从读这个开始,通过适当使用保护数据库来重写代码。SQL注入并不有趣,而且会产生许多bug。
https://stackoverflow.com/questions/27023248
复制相似问题