在插入数据库之前,我通常只对每个变量使用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]
但它有点使得在那里拥有这个数组/函数毫无意义,因为我可能只是单独地逃避每个变量/字符串我是如何完成的。所以我希望有一种方法可以在函数中进行某种循环,以根据数组中的内容动态地执行此操作。
因为在将来进行验证时我可以
$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."");
只是打印未转义的值。
答案 0 :(得分:2)
您可能对compact
和extract
感兴趣。两者都允许您将变量作为数组处理。数组很舒服,因为您可以对所有值重复单个操作。
示例:
$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']将通过使用本机预准备语句或正确的转义/转换/白名单来正确格式化。
因此,根本不需要关心手动逃逸 这也是我最初发布的功能的确切点。