转义数组中的变量并将转义值分配给原始变量值

时间:2011-11-06 19:28:33

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

在插入数据库之前,我通常只对每个变量使用mysql_real_escape_string,例如:

    $first_name = mysql_real_escape_string($first_name); // Bill
    $last_name  = mysql_real_escape_string($last_name);  // O'Rielly
    $email      = mysql_real_escape_string($email);      // name@domain.com

    $insert = mysql_query("
                  INSERT INTO `users` (first_name, last_name, email)
                  VALUES ('$first_name', '$last_name', '$email')
              ") or die(mysql_error());

但是在某些形式上我可能有20个不同的变量我想逃避,所以我希望有一种方法可以使用数组,通过函数运行它来逃避每个。然后使原始变量($first_name$last_name$email)具有数组中转义字符串的值。我提出了以下内容,但这是我已经得到的。

    $form_array = array($first_name, $last_name, $email);

    print_r($form_array);
    echo("<br />".$last_name."<br />");

    function cleanInput($array) {
        return array_map('mysql_real_escape_string', $array);
    }

    $clean_array = cleanInput($form_array); 

    print_r($clean_array);
    echo("<br />".$clean_array[1]."<br />");

其中输出以下内容:

    Array ( [0] => Bill [1] => O'Rielly [2] => name@domain.com ) 
    O'Rielly
    Array ( [0] => Bill [1] => O\'Rielly [2] => name@domain.com ) 
    O\'Rielly

所以,我们可以看到它正在逃避,但我对整个制作感到困惑$first_name的值为$clean_array[0]$last_name的值为{{1}等等。

我当然知道我可以写:

$clean_array[1]

但它有点使得在那里拥有这个数组/函数毫无意义,因为我可能只是单独地逃避每个变量/字符串我是如何完成的。所以我希望有一种方法可以在函数中进行某种循环,以根据数组中的内容动态地执行此操作。

因为在将来进行验证时我可以

  • 将所有$ _POST数据分配给变量
  • 将变量放入数组
  • 通过该函数运行数组,所有原始的$ _POST变量现在都具有函数中的转义值
  • 使用开头提到的插入方法,使用变量的原始名称 $first_name = $clean_array[0]; $last_name = $clean_array[1]; $first_name等。

而不是:

$last_name

这可能吗?

更新

来自hakre关于 $insert = mysql_query(" INSERT INTO `users` (first_name, last_name, email) VALUES ('$clean_array[0]', '$clean_array[1]', '$clean_array[2]') ") or die(mysql_error()); compact函数的帖子,我现在提出以下内容:

extract

其中输出以下详细信息:

之前:

名字:比尔

姓氏:O'Rielly

电子邮件:name@domain.com

后:

名字:比尔

姓氏:O \'Rielly

电子邮件:name@domain.com

我已尝试将 $array = compact(array("first_name", "last_name", "email")); echo("<strong>Before:</strong><br />First Name: ".$first_name."<br />Last Name: ".$last_name."<br />Email: ".$email."<br /><br />"); extract(array_map('mysql_real_escape_string', $array), EXTR_OVERWRITE); echo("<strong>After:</strong><br />First Name: ".$first_name."<br />Last Name: ".$last_name."<br />Email: ".$email.""); 放入函数中,但它的工作方式不同?

extract

我确定我必须返回提取功能,但我尝试了一些不同的东西,它要么不提供任何输出,要么 function cleanInput($array) { $clean_array = extract(array_map('mysql_real_escape_string', $array), EXTR_OVERWRITE); return $clean_array; } $array = compact(array("first_name", "last_name", "email")); echo("<strong>Before:</strong><br />First Name: ".$first_name."<br />Last Name: ".$last_name."<br />Email: ".$email."<br /><br />"); cleanInput($array); echo("<strong>After:</strong><br />First Name: ".$first_name."<br />Last Name: ".$last_name."<br />Email: ".$email.""); 只是打印未转义的值。

2 个答案:

答案 0 :(得分:2)

您可能对compactextract感兴趣。两者都允许您将变量作为数组处理。数组很舒服,因为您可以对所有值重复单个操作。

示例:

$vars = array('first_name', 'last_name', 'email');

$first_name = $last_name = $email = 'just some init value';

$array = compact($vars);

foreach($array as &$value)
    $value = str_shuffle($value);
unset($value);

extract($array);

printf("First: %s; Last: %s; Email: %s", $first_name, $last_name, $email); 

输出:

First:  sjivus enta metluoi; Last: i evounes tliuat smj; Email: tleetnumav siuijo s 

答案 1 :(得分:1)

function dbSet($fields, $source = array()) {
  $set = '';
  if (!$source) $source = &$_POST;

  foreach ($fields as $field) {
    if (isset($source[$field])) {
      $set.="`$field`='".mysql_real_escape_string($source[$field])."', ";
    }
  }
  return substr($set, 0, -2); 
}

这段代码称为一个函数。虽然只有极少数PHP用户对它们有所了解,但功能却非常强大。它可以使您的代码简短易读,并节省您的打字时间。

因此,在配置文件中使用此功能,您必须输入

$fields = explode(" ","name surname lastname address zip fax phone");
$query  = "INSERT INTO table SET ".dbSet($fields);

注意$ fileds数组。我希望这是不言自明的

嗯,经过评论中的一些澄清后,我可以延长答案。

摆脱不断逃避的最好方法就是摆脱它。创建自己的或使用一些现有的DB抽象库,它将为您完成所有转义。

说一个检查现有用户名的代码看起来像是

$username_exists=$db->getOne("SELECT id FROM users WHERE name=?",$_POST['name']);
if ($username_exists) // do stuff.

其中$ _POST ['name']将通过使用本机预准备语句或正确的转义/转换/白名单来正确格式化。

因此,根本不需要关心手动逃逸 这也是我最初发布的功能的确切点。