foreach循环导致POST为NULL mysql_real_eescape_string


foreach loop causing POST to be NULL mysql_real_escape_string

这是一个小片段,它是使用PHP和数据库构建的,目的是为了简化和测试,这里是一个文本示例。

这个想法是表单将提交,然后PHP将处理结果。然而,为了安全起见,我尝试在每个帖子中使用mysql_real_eescape_string(也许有更好的方法?(

无论如何,问题就在这里。当我保持foreach循环时,两个post数组变量qty[]和optname[]都返回为NULL(出于测试目的,通过var_export($_post(输出(。这是输出WITH foreach mysql_real_eescape_string循环的内容:

array (
  'update' => 'Yes',
  'qty' => NULL,
  'optname' => NULL,
)

如果我删除foreach循环,一切都很好,这就是我得到的,也是php处理结果所需要的,这就是foreach mysql_real_eescape_string循环注释掉的结果:

array (
  'update' => 'Yes',
  'qty' => 
  array (
    1 => '2',
    2 => '2',
    3 => '2',
    4 => '2',
  ),
  'optname' => 
  array (
    1 => '1|4',
    2 => '1|4',
    3 => '1|4',
    4 => '1|4',
  ),
)

但是,在sql查询发生之前,不会对数据进行检查/清理。如何使用循环检查每个post变量,但保持post变量不变??

以下是可以粘贴到任何本地主机并进行测试的代码。

<?php
foreach ($_POST as $key=>$value) { $_POST[$key] = mysql_real_escape_string($value); }
echo '<pre>';
var_export($_POST);
echo '</pre>';  
?>
<form name="updateQty" id="updateQty" method="post" />
  <input type="hidden" name="update" id="update" value="Yes" />
  <input type="text" name="qty[1]" id="qty[]" class="field" value="2" />
  <input type="hidden" name="optname[1]" id="optname[]" value="1|4" />
  <input type="text" name="qty[2]" id="qty[]" class="field" value="2" />
  <input type="hidden" name="optname[2]" id="optname[]" value="1|4" />
  <input type="text" name="qty[3]" id="qty[]" class="field" value="2" />
  <input type="hidden" name="optname[3]" id="optname[]" value="1|4" />
  <input type="text" name="qty[4]" id="qty[]" class="field" value="2" />
  <input type="hidden" name="optname[4]" id="optname[]" value="1|4" />
  <input type="submit">
</form>

谢谢!

我正在尝试使用mysql_real_eescape_string进行安全

这就是你做错的地方此功能与安全性无关
事实上,您真正想做的是恢复一个已经被弃用和删除的magic quotes功能,在不确保数据安全的情况下破坏数据。

至少你必须这样使用这个功能

$var = "'".mysql_real_escape_string($value)."'"; 

向转义值添加引号(当然,同时从查询中删除引号(。并且您必须在查询构建之前完成它,而不是在其他任何地方。

foreach ($_POST as $key=>$value) {
    if(is_array($value)){
        foreach ($value as $k => $v) {
            $_POST[$key][$k] = mysql_real_escape_string($v); 
        }
    } else {
        $_POST[$key] = mysql_real_escape_string($value); 
    }
}

在您的情况下,POST值是数组,因此您也必须循环它们。。

正如@hjpotter92评论的那样,使用旧的mysql函数是不好的。它们在未来的版本中不起作用。。。

一种更简单的方法(未经测试(是尝试array_walk_recursive()

function MyEscape( &$string, $key ) {
    if( !is_array($string) )
        $string = mysql_real_escape_string( $string );
}
array_walk_recursive($_POST, 'MyEscape');