PHP在数组上使用implode来格式化sql insert

时间:2013-08-14 15:05:47

标签: php mysql

我试图将一个数组内存到一个sql语句中。我的问题是,值是如何在字符串和日期等周围引用值的最佳方法,而不是围绕int值?

CNC中 下面的新代码,问题我是hainv使用反引号而不是引用值,感谢Mark Ba​​ker,就准备停止sql注入的语句而言,下面的代码是否足够?列名由代码设置,所有的vaules都是myslqi_real_escape'ed。

    $HardwareDistribution["HardwareID"]=mysqli_real_escape_string($con,$_POST["HardwareID"]);
    $HardwareDistribution["UserID"]=mysqli_real_escape_string($con,$_POST["UserID"]);
    $HardwareDistribution["DateGiven"]=mysqli_real_escape_string($con,$_POST["DateGiven"]);
    $HardwareDistribution["ConditionGiven"]=mysqli_real_escape_string($con,$_POST["ConditionGiven"]);
    $SQL_AssignHardware="INSERT INTO HardwareDistribution (`".implode("`,`",array_keys($HardwareDistribution))."`) VALUES ('".implode("','",array_values($HardwareDistribution))."')";
    mysqli_query($con,$SQL_AssignHardware);

3 个答案:

答案 0 :(得分:0)

使用is_int()

foreach($HardwareDistribution as $value) {
    if(is_int($value)) {
        //execute your query here
    }
    else {
        //execute your query with quotations here
    }
}

此外,正如其他人所建议的那样,您可能需要查看prepared statements以阻止SQL injection

答案 1 :(得分:0)

在将数据加载到数组中时,可以在需要引号的值周围添加引号。如上所述,您可能还想查看prepared statements

答案 2 :(得分:0)

最好的方法是使用已定义的列名称和值的持有者来创建MySQL语句。如果查询是动态的,那么你应该 - 在非常租约 - 允许列名称的“白名单”,这样你的数据库就不会受到大规模分配攻击的影响。