Обычно я просто использую 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 о функциях compact
и extract
я пришел к следующему:
$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."");
Который выводит следующие детали, как я хотел бы:
До:
Имя: Билл
Фамилия: О’Райли
Электронная почта: имя@домен.com
После:
Имя: Билл
Фамилия: О'Райли
Электронная почта: имя@домен.com
Я пытался поместить 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
просто печатает неэкранированное значение.
compact
иextract
, и у меня есть рабочий пример, но не на 100%, как я хочу, я обновил свой вопрос тем, что у меня есть до сих пор, не могли бы вы посмотреть, и не могли бы вы дать мне немного больше информации о том, куда идти отсюда? +1 за то, что показал мне эти две функции! 07.11.2011