mysql_real_escape_string和implode()

时间:2014-04-27 02:05:54

标签: php mysql mysql-real-escape-string

if (array_key_exists('submit', $_POST)) {   
    foreach ($_POST as $key => $value) {
        ${$key} = mysql_real_escape_string($value); 
        $imp_1 = implode("' '", array_keys($lunch_days)); 
        $imp_2 = implode("' '", array_keys($dinner_days));  
        $imp_3 = implode("' '",$hours_dinner);
        $imp_4 = implode("' '",$hours_lunch);}
        $sql = "INSERT INTO local_eats(..., ...., ...etc.. etc..) VALUES('$...', '$....', '$...', etc.. etc..)";

我的问题是,自从我将mysql_real_escape_string()函数添加到我的所有$_post变量后,我无法插入我的四个内爆变量,例如$imp_1$imp_2,{ {1}},$imp_3

1 个答案:

答案 0 :(得分:0)

首先,我对您的设计提出了一些建议:

  • 任意将$ _POST键转换为变量是一个坏主意,如果你有一个$ isAdmin变量并且有人将$ isAdmin作为post参数传递,该变量将被设置
  • 根据提供的查询参数任意定义架构/查询是一个坏主意,如果你有一个is_admin列,他们可以将其作为查询参数传递并设置该字段。
  • 通过PDO而不是mysql_real_escape_string
  • 使用预准备语句会更好

我的建议是使用这样的东西:

if (array_key_exists('submit', $_POST)) {  
    $days = array(
        'monday',
        'tuesday',
        ... etc...
    );

    $sth = $dbh->prepare('INSERT INTO local_eats(lunch_monday, lunch_tuesday, ... dinner_monday, ..., open_dinner_monday, etc.) VALUES(:lunch_monday, :lunch_tuesday, ...etc)');

    foreach($days as $day) {
        if(isset($_POST['lunch_days'][$day])) {
            $sth->bindParam(':lunch_' . $day, 1, PDO::PARAM_INT);   
        } else {
            $sth->bindParam(':lunch_' . $day, 0, PDO::PARAM_INT);       
        }
        // Do the above for the other "groups" of fields
    }

    $sth->execute();
}

这样只能设置某些字段,并且您不会动态创建任何变量。如果您的大多数参赛作品不太可能每天都开放,我也会考虑更改您的架构以设置单独的日期表。