首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php中看似相同的sql查询,但其中一个会插入额外的行。

php中看似相同的sql查询,但其中一个会插入额外的行。
EN

Stack Overflow用户
提问于 2014-11-19 17:33:06
回答 2查看 70关注 0票数 0

我以两种方式生成以下查询,但使用相同的函数插入数据库:

在person值(‘、'john’、'smith‘、'new york’、'NY‘、’123456‘)中插入;

下面的方法导致正确的插入,sql数据库中没有额外的空行。

代码语言:javascript
复制
foreach($_POST as $item) 
$statement .= "'$item', ";

$size = count($statement);
$statement = substr($statement, 0, $size-3);
$statement .= ");";

下面的代码应该生成一个与上面的查询相同的查询(它们的响应是相同的),但是当我使用它时,在正确的数据行之后,一个额外的空白行(带有id)被插入到数据库中。所以每次插入两行。

代码语言:javascript
复制
$mytest = "INSERT INTO person VALUES('','$_POST[name]', '$_POST[address]','$_POST[city]', '$_POST[state]', '$_POST[zip]');";

因为我需要对表单中发布的项运行验证,并且需要在将其存储到数据库之前执行一些操作,所以我需要能够使用第二个查询方法。

我不明白这两个人怎么会不同。我使用完全相同的函数连接并插入数据库,所以问题不存在。

下面是我的插入函数,以供参考:

代码语言:javascript
复制
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     
    }

感谢您在这方面的任何现场/帮助。

EN

回答 2

Stack Overflow用户

发布于 2014-11-19 17:52:03

在查询中直接使用$_POST会让您发现很多不好的事情,这只是错误的做法。在进入数据库之前,您至少应该做些事情来清理数据。

通常情况下,$_POST变量可以包含其他值,具体取决于浏览器、表单提交。你试过在你的前额做空/空检查吗?

!~伪码不用于生产~!

代码语言:javascript
复制
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很可能包含正在放入查询中的空数据,并导致添加的行。

票数 1
EN

Stack Overflow用户

发布于 2014-11-19 17:57:54

正如@yycdev所述,您面临着SQL注入的风险。从读这个开始,通过适当使用保护数据库来重写代码。SQL注入并不有趣,而且会产生许多bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27023248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档