2011-11-06 43 views
0

我通常只是插入到我的数据库之前使用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);  // [email protected] 

    $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] => [email protected]) 
    O'Rielly 
    Array ([0] => Bill [1] => O\'Rielly [2] => [email protected]) 
    O\'Rielly 

所以,我们可以看到,它的逃逸正确,但我和整个制作$first_name难倒有$clean_array[0]值,$last_name具有的价值$clean_array[1]

我当然知道我可以只写:

$first_name = $clean_array[0]; 
    $last_name = $clean_array[1]; 

但它有点让这个数组/函数根本没有意义,因为我可能只是分别将每个变量/字符串转义出来,我总是这样做。所以我希望有一种方法可以在函数中做某种循环,根据数组中的内容动态地执行此操作。

因为当谈到在未来做验证我只能

  • 全部分配$ _ POST数据到变量
  • 把它们放在变量数组
  • 运行通过功能的阵列和所有原始的$ _POST变量现在都有函数的转义值
  • 使用开头提到的插入方法,使用变量的原始名称$first_name$last_name等。

相反则:

$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()); 

这可能吗?

更新

从hakre的有关compactextract功能后,我现在已经想出了以下内容:

$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.""); 

,它输出以下细节如何,我想他们:

之前:

名字:

比尔

姓:O'Rielly

电子邮件:[email protected]

后:

名字:

比尔

姓: O'Rielly

Email:[email protected]

我试过把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.""); 

我敢肯定,我一定要退回提取功能,但我已经尝试了一些不同的东西,它要么不给任何输出或$last_name只是打印转义值。

回答

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 
+0

只是通过这些文档快速阅读,因为我现在有点忙,但这看起来像我以后!一旦我以后陷入困境,我会再次联系,谢谢! – Joe

+0

hakre,我用'compact'和'extract'做了一个小提琴,我有一个工作的例子,但不是100%我想要它,我已经用我目前所得到的更新了我的问题,你能看一看,如果你能让我更深入了解从哪里出发?为了向我展示这两个功能+1! – Joe

+0

你使用它是错误的,因为函数有它自己的变量表。紧凑和提取提供了一些基本的变量处理功能。你应该明智地使用它们,让它们做你想做的事。我并不是说这些解决了你的问题或者你完全面对的设计问题。 – hakre

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阵列。我希望这是不言而喻的,虽然

那么,经过一些澄清的意见,我可以延长我的答案。

摆脱不断逃跑的最佳方式是摆脱它。要么创建你自己的,要么使用一些现有的数据库抽象库,它将为你做所有的转义。

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

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

其中,$ _ POST [“名”]将被正确格式化,或者通过利用本地准备的语句或适当的转义/铸造/白名单。

所以,根本不需要关心手动转义。
这也是我首先发布的函数的确切点。

+0

那岂不是做什么矿已经呢?除了你插入它稍微不同的数据库?对不起,如果我误解了它!它只是我想让每个变量都通过该函数,但返回的变量的原始名称下的转义值。因为我希望能够继续并单独对每个变量执行其他检查,这就是为什么我要将它们分开的原因。 – Joe

+0

转义后您无法进行任何检查。转义应该是将数据插入数据库之前的最后一个操作。 –

+0

对不起,我应该解释一下,我的意思是我想做一些查询来检查邮件是否已被其他成员使用,诸如此类的事情,这就是为什么我需要以某种方式将它们分开的原因。因为我不想像首字母和姓氏一样检查它们,因为它们可能是重复的,但是电子邮件,用户名等不能。那么肯定为我的电子邮件检查查询它需要在手之前逃脱? – Joe