Проблема с PHP urldecode

#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:

Я не знаю, решит ли что-нибудь из этого вашу проблему, но в вашем коде есть несколько проблем:

  1. mysql_escape_string не рекомендуется, вам следует использовать mysql_real_escape_string.
  2. Вы должны перед экранированием urldecode (например: mysql_real_escape_string(urldecode($str)); ).
  3. Вам даже не нужно ничего экранировать. Вы используете подготовленные инструкции (скорее всего, PDO из синтаксиса). PDO автоматически экранирует значения с помощью заполнителей для вас.
  4. Возможно, выполняется двойное декодирование. Если отправленная вами строка запроса отправляется непосредственно на PHP в качестве тела запроса, она автоматически декодируется. Следовательно, вы можете urldecoding уже декодированный URL.
  5. Факты, на которые вы ссылаетесь $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)) . Вы удаляете данные до того, как они будут преобразованы в то, что на самом деле поступает в базу данных.