【问题标题】:Checkbox Array Values in $_REQUEST but not $_POST$_REQUEST 但不是 $_POST 中的复选框数组值
【发布时间】:2011-03-28 23:01:59
【问题描述】:

由于某种原因,我的复选框数组值没有显示在 $_POST 中。

例如:

<form method="post" action="">
    <input type="checkbox" name="cb[]" value="1">
    <input type="checkbox" name="cb[]" checked="checked" value="2">
    <input type="checkbox" name="cb[]" value="3">
    <input type="checkbox" name="cb[]" checked="checked" value="4">
    <input type="checkbox" name="cb[]" checked="checked" value="5">
    <input type="checkbox" name="cb[]" value="6">
    ...
    <input type="checkbox" name="cb[]" checked="checked" value="26">
    <input type="checkbox" name="cb[]" value="27">
    <input type="submit" value="insanitizer"/>
</form>

提交时:

<?php
print_r($_POST); //Because print_r($_POST['cb']); gives ''

Array (
   [category] =>
)

print_r($_REQUEST['cb']);  //Showing the correct array name was used

Array
(
    [0] => 2
    [1] => 4
    [2] => 5
    [3] => 26
)
?>

我很高兴我至少可以在这里获得复选框数据,但我还有一个问题:

Wtf?

【问题讨论】:

  • 你在使用任何框架吗?
  • Smarty,apc...他们算吗?

标签: php post webforms checkbox request


【解决方案1】:

嘟嘟嘟……

作为一般初始化的一部分,我通过以下方式运行 $_POST 和 $_GET:

<?php
if(sizeof($_POST) > 0){
    foreach($_POST as $key => $value){
        $_POST[$key] = $this->_db->realEscapeString($value);
    }
}
if(sizeof($_GET) > 0){
    foreach($_GET as $key => $value){
        $_GET[$key] = $this->_db->realEscapeString($value);
    }
} 
?>

这似乎会破坏任何阵列...

上面替换为:

<?php
...
if(sizeof($_GET) > 0){
        $this->initDbCleanArray($_GET);
    }
}
...

private function initDbCleanArray($a)
{
    if(sizeof($a) > 0){
        foreach($a as $key => $value){
            if(is_array($a[$key])){
                $this->initDbCleanArray($a[$key]);
            }
            else{
                $a[$key] = $this->_db->realEscapeString($value);
            }
        }
    }
}
?>

realEscapeString = mysql_real_escape_string

...$_POST['cb'] 还活着!

【讨论】:

  • 他们不应该核爆你的阵列。
  • 尽管如此,他们做到了?我把上面的代码注释掉了,walaa,cb数组出现在$_POST...
  • 最佳实践是在字符串插入数据库之前立即转义字符串,而不是之前。防止此类事情发生。
  • 我知道这是最佳实践。我以为我一开始就可以逃避它,以防止“忘记逃避数据库字符串”的灾难......
  • @Scott Saunders 我在最后一天重构了我的代码,以便在我的 DB 包装器中使用 PDO,而不是我继承的废话。好多了,没有更多的霰弹枪逃逸:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多