Я еще не научился использовать параметризованные запросы (которые по некоторым другим сообщениям на этом сайте – это то, что я обязательно должен сделать первым делом завтра утром), и я хочу получить удар данных формы в запрос, сбежал.
Дважды я столкнулся с этим решением:
$_POST = array_map('mysqli_real_escape_string', $_POST);
Это, как я могу сказать, запускает все переменные в массиве $ _POST через функцию escape. Я видел, что точная строка поддерживается, но когда я добавляю ее к существующему PHP, она создает пустую строку.
У меня создалось впечатление, что mysqli_real_escape_string нужен второй параметр – ссылка / соединение. Это то, что вызывает мою проблему? Данные берутся в базе данных только в том случае, если эта строка удалена, а мои переменные берут их неизменяемые значения из $ _POST.
array_map
возвращает новый массив, если вы перезаписываете $_POST
, лучшим решением будет использование array_walk
.
array_walk($_POST, function(&$string) use ($link) { $string = mysqli_real_escape_string($link, $string); });
Обратите внимание, что $link
должно быть действительным соединением.
Function [ <internal:mysqli> function mysqli_real_escape_string ] { - Parameters [2] { Parameter #0 [ <required> $link ] Parameter #1 [ <required> $string_to_escape ] } }
Вы должны передать значения, спрятанные в другую переменную:
$post = array_map('mysqli_real_escape_string', $_POST);
Или:
foreach($_POST as $k => $v) { $_POST[$k] = mysqli_real_escape_string($v); }
Примечание. Если массив не указан, foreach работает с копией указанного массива, а не с самим массивом.
Тогда да, это ваш ответ:
mysql_real_escape_string()
требует подключения к базе данных, так как использует набор символов базы данных для определения того, что необходимо для экранирования.
Без этого PHP не имеет представления о том, какой набор символов вы используете, и о том, как сбежать.
Здесь очень много:
http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
И все с разными символами.