从使用foreach创建的数组中排除一些$ _POST

时间:2014-03-01 10:38:18

标签: php arrays

目标是清理从表单收集的$ _POST数据,但是在这种形式中我有一个带日期(d / m / Y)的输入字段,我需要在将其保存到数据库之前使用preg_replace()。此外,我有一个欧元值(1.000,00)的输入,我还需要使用preg_replace来修改该值。

PHP代码的第一部分是:

 $filterType = array(  // set up an array that will hold specific flags needed for PHP's filter_var() function.
'string' => FILTER_SANITIZE_STRING, //Strip tags, optionally strip or encode special characters
'integer' => FILTER_VALIDATE_INT,   //Validate value as integer, optionally from the specified range
);


$post = array(); // sets up a new array to add sanitized $_POST data

foreach($_POST as $key => $value) { //Enter the loop.

    $filter = $filterType[gettype($value)]; // $filter uses PHP's gettype() function to return the $value's type<br>
                                            //  and compare it to the $filterType array for the necessary flags to use in the filter_var() function.

    $value = filter_var($value, $filter);  // $value is the sanitized value that you want to save to the new array

    $post[$key] = $value;  //  take the original key and sanitized value and append it to the new array.

} //  exit loop

这里我需要从$ post数组$ _POST ['orderdate']和$ _POST ['ordervalue']中排除这样做:

$orderDate = preg_replace("#([0-9]{2})(/)([0-9]{2})(/)([0-9]{4})#","\\5-\\3-\\1",$_POST['orderdate'],;
$orderValue = preg_replace("/(,)/", "/(\.)/", $_POST['ordervalue'], ;

$bindValues = array( //  set up a second array that will hold my specific values 
'orderdate' => $orderDate,
'ordervalue' => $orderValue, 
);


$bindValues = array_merge($bindValues, $post); //  merge both arrays

然后将$ bindValues数组插入db:

$items = implode(',', array_keys($bindValues));
$values = implode(',:', array_keys($bindValues));

$table = 'orders' ;

$stmt = $dbh->prepare("INSERT INTO $table ($items) VALUES (:$values)");

foreach($bindValues as $key => $value) {
    $stmt->bindValue(':' . $key, $value, PDO::PARAM_STR);
}

$stmt->execute();

$stmt->free_result();

这就是全部:)

2 个答案:

答案 0 :(得分:1)

您尝试编写的此功能毫无意义

与许多其他PHP用户一样,您非常希望无处不在地编写代码。

您的过滤器都不会按预期工作,也绝不会有任何好处。更不用说在入口点批量“消毒”的整体想法被证明是不可靠和有害的

因此,最好摆脱它,只需手动验证您的自定义字段,然后将数据传递给DB。然后格式,而不是根据它将要使用的媒介“清理”它。

同时在查询中允许SQL注入。

答案 1 :(得分:0)

使用if围绕foreach的内部。

foreach($_POST as $key => $value) {
    if ($key != 'orderdate' && $key != 'orderValue') {
        // your code
    }
}