PHP:检查在preg_replace

时间:2019-06-13 12:28:54

标签: php post preg-replace sanitization

我有一个包含十几个字段的基本表单(例如3个):

<input type="text" name="user_first_name" class="form-control" pattern="[A-Za-z-]+" required />
<input type="text" name="user_last_name" class="form-control" pattern="[A-Za-z-]+" required />
<input type="tel"  name="user_phone" class="form-control" />
...

只有电话号码可以为空,姓氏和名字是必填项,并且只能包含字母和破折号(技术限制是由旧的ERP施加给我的)

我创建了一个函数来清理我的所有字段,如下所示:

public function sanitizeInfo($user_first_name, $user_last_name, $user_phone) {

    $user_first_name  = preg_replace('/[^A-Za-z-]/', '', $user_first_name);
    $user_last_name   = preg_replace('/[^A-Za-z-]/', '', $user_last_name);
    $user_phone       = (isset($user_phone) and !empty($user_phone)) ? preg_replace('/[^A-Za-z0-9+-.)(]/', '', $user_phone) : NULL;

    $array = array(
      "first_name" => $user_first_name,
      "last_name"  => $user_last_name,
      "phone"      => $user_phone
    );

    return $array;
  }

在我的PHP脚本中,我首先进行了检查:

$fields = array('user_first_name', 'user_last_name');
$error = FALSE; 

foreach ($fields as $fieldname) { 
  if(!isset($_POST[$fieldname]) or empty($_POST[$fieldname])) {
    $error = TRUE; 
    $message = 'err';
  }
}

if (error === TRUE) {
  echo "Error !"
} else {
  $info = sanitizeInfo($_POST['user_first_name'], $_POST['user_last_name'], $_POST['user_phone']);
  ...
  ** QUERY **
}

我想在将其发送到数据库之前检查字段是否为空(只有电话号码可以为NULL)

但是现在的问题是我不知道我的非必需字段是否存在,尤其是我的sanatizeInfo函数存在问题,因为它允许将空字段放入数据库中

示例: 用户输入“ !!-”作为名字,sanitizeInfo函数返回“”,因为preg_replace删除了这些字符

如何避免这种情况?

1 个答案:

答案 0 :(得分:0)

您需要做的就是在检查空白字段之前调用函数sanitizeInfo,并用简单的foreach函数替换array_search循环。

这可以实现如下:

$fields = array('user_first_name', 'user_last_name');
$error  = FALSE;

$values = sanitizeInfo($fields[0], $fields[1], @$fields[2]);
$arSear = array_search('', $values);
if ($arSear !== FALSE && $arSear != 'phone'){
  $error   = TRUE;
  $message = 'The field `'.$arSear.'` is empty.';
}

if ($error) {
  echo 'Error: '. $message;
} else {
  // QUERY ....
}

出于一致性考虑,我建议始终在php中使用&&||,而不是ANDOR。这将防止有关优先级的任何绊倒。 'AND' vs '&&' as operator