#php
#php
Вопрос:
Я отправляю приведенное ниже значение endcodeURI javascript через jquery в PHP-скрипт, там я использую urldecode и сохраняю значение в базе данных, но символ ‘>’ не сохраняется.
testid=174742228amp;VI-42=zdddfsdsdf%3Edsdfsdfs%3Efsdfsdfsamp;
------ ----------- ----- ----- ------------------------------ ------
| id | testid | sec | qid | ans | img |
------ ----------- ----- ----- ------------------------------ ------
| 6510 | 174742228 | VI | 42 | zdddfsdsdf dsdfsdfs fsdfsdfs | NULL |
------ ----------- ----- ----- ------------------------------ ------
foreach ($_POST as $k => $v) {
$flds = explode("-", $k);
if (count($flds) == 3) {
$datai = array($flds[0], $flds[1], $flds[2], $testid, urldecode(mysql_escape_string($v)));
$resi = $dbh->prepare("INSERT INTO result (sec, img, qid, testid, ans) VALUES (?, ?, ?, ?, ?)");
$resi->execute($datai);
} else {
$data = array($flds[0], $flds[1], $testid, urldecode(mysql_escape_string($v)));
$res = $dbh->prepare("INSERT INTO result (sec, qid, testid, ans) VALUES (?, ?, ?, ?)");
$res->execute($data);
}
}
Заранее спасибо
Комментарии:
1. 1. Какой ваш sql-запрос хранит данные? 2. какой тип столбца имеет
ans
?2. Можете ли вы показать код для создания запроса? Возможно, ошибка кроется именно в этом.
3. Вероятно, нужно показать код о том, как вы его вставляете, и как вы его urldecoding, чтобы помочь найти проблему.
4.
foreach ($_POST as $k => $v) { $flds = explode("-", $k); if (count($flds) == 3) { $datai = array($flds[0], $flds[1], $flds[2], $testid, urldecode(mysql_escape_string($v))); $resi = $dbh->prepare("INSERT INTO result (sec, img, qid, testid, ans) VALUES (?, ?, ?, ?, ?)"); $resi->execute($datai); } else { $data = array($flds[0], $flds[1], $testid, urldecode(mysql_escape_string($v))); $res = $dbh->prepare("INSERT INTO result (sec, qid, testid, ans) VALUES (?, ?, ?, ?)"); $res->execute($data); } }
5. Пожалуйста, отредактируйте свой вопрос вместо публикации кода в качестве комментария. 🙂
Ответ №1:
Я не знаю, решит ли что-нибудь из этого вашу проблему, но в вашем коде есть несколько проблем:
mysql_escape_string
не рекомендуется, вам следует использовать mysql_real_escape_string.- Вы должны перед экранированием urldecode (например:
mysql_real_escape_string(urldecode($str));
). - Вам даже не нужно ничего экранировать. Вы используете подготовленные инструкции (скорее всего, PDO из синтаксиса). PDO автоматически экранирует значения с помощью заполнителей для вас.
- Возможно, выполняется двойное декодирование. Если отправленная вами строка запроса отправляется непосредственно на PHP в качестве тела запроса, она автоматически декодируется. Следовательно, вы можете urldecoding уже декодированный URL.
- Факты, на которые вы ссылаетесь
$testid
напрямую (вместо$_POST['test_id']
), заставляют меня думать, что вы, возможно, используете register_globals. Возможно, это не так, но просто чтобы убедиться.
В остальном код выглядит нормально и не должен приводить к исчезновению >
символов. Проверьте тип вашего столбца MySQL и / или попробуйте var_dumping $_POST и проверьте, что у вас там есть.
Комментарии:
1. Большое спасибо. Я попробовал var_dump,
>
символы отсутствуют. В чем может быть проблема? Я вижу, что ajax отправляет правильные закодированные данные в php-скриптtestid=723006807amp;VI-28=adads>asdasda>Asdasd>Asdasda>asdasdaamp;
Ответ №2:
Попробуйте изменить порядок urldecode(mysql_escape_string($v))
. Вы удаляете данные до того, как они будут преобразованы в то, что на самом деле поступает в базу данных.