Рецепт №117. Из книги «128 рецептов php»
Перейти к оглавлению
В предыдущих рецептах происходила запись данных в таблицу БД в таком виде, каком они есть. Так делать можно только в том случае, если данные генерируются на сервере. Но если нужно записать данные, которые отчасти или полностью пришли с клиента, например, по средствам POST или GET запроса, то осуществлять запись без экранирования данных нельзя. Поскольку это может привести к созданию «дыры» в коде, через которую будет очень просто взломать или навредить работе базе данных или всего сайта.
Экранировать данные можно несколькими способами, если данные имеют числовое значение, то их нужно привести к числовому виду – целому числу или числу с плавающей точки, с помощью функций int или float. А если данные имеют строковый тип, то экранировать их нужно функцией mysql_real_escape_string.
Пример:
define("HOST", "localhost"); define("USER", "root"); define("PASSWORD", ""); define("DB_NAME", "test_db"); //подключение к MySql $db_connect = mysql_connect(HOST, USER, PASSWORD, TRUE); if (!$db_connect) { die('Ошибка подключения: ' . mysql_error()); } // выбор базы данных mysql_selectdb(DB_NAME, $db_connect); // устанавливаем кодировку mysql_set_charset("utf8"); // получаем данные из POST запроса // имя $first_name = $_POST['first_name']; // фамилия $last_name = $_POST['last_name']; // возраст $age = $_POST['age']; // экранируем данные // строки $first_name = mysql_real_escape_string($first_name); $last_name = mysql_real_escape_string($last_name); // число $age = (int)$age; // создание записи в таблице $result = mysql_query(" INSERT INTO `tbl_users` (`f_name`, `l_name`, `age`) VALUES ('{$first_name}', '{$last_name}', {$age}) ");
Нужно бы указать что не для всех версий PHP и начиная с 5.3 поддерживаться не будет…