Я использую $_SERVER['QUERY_STRING']
вместо $_GET
, чтобы получить все мои параметры.Однако $_SERVER['QUERY_STRING']
кодирует строку самостоятельно.Таким образом, если пользователь отправляет закодированную строку, он снова кодируется с помощью $_SERVER['QUERY_STRING']
.Это означает, что я должен выполнить urldecode
дважды.
Кодированная строка: https://www.example.com/test.php?info1234=3177%3B315961%3B317451%3B315511&info3598=121618%3B136803%3B13830%3B20532
Если вы используете ссылку выше для отправки через сам URL.То есть, вы помещаете параметр в себя, вы получаете строку (что я и хочу):
https://www.example.com/test.php?info1234=3177;315961;317451;315511&info3598=121618;136803;13830;20532
Однако, если вы отправляете через форму, вы получаете дважды закодированную строку.Поэтому, когда вы декодируете, он декодирует только один раз, и вам нужно снова запустить urldecode
, чтобы полностью его декодировать:
https://www.example.com/test.php?info1234=3177%3B315961%3B317451%3B315511&info3598=121618%3B136803%3B13830%3B20532
Как я могу убедиться, что получаю декодированную строку (я нехочу запустить urldecode
дважды на строке, поскольку это усложняет мое время O(2n)
. Я хочу попробовать сохранить его на O(1)
или, по крайней мере, O(n)
. Я знаю, используя urldecode
означает n
каждый раз.
<?php
$a = urldecode($_SERVER['QUERY_STRING']);
$b = urldecode($a);
if(strpos($a, "%") != false) {
echo "We had to decode twice<br>";
echo $a . "<br><br>Then to:<br>" . $b;
} else {
echo "Only decoded once!!<br>";
echo $a;
}
?>
<form action="test.php" method="get">
myurl: <input type="text" name="myurl"><br>
<input type="submit" value="Submit">
</form>
Метод 1:
localhost/test.php?https://www.example.com/test.php?info1234=3177%3B315961%3B317451%3B315511&info3598=121618%3B136803%3B13830%3B20532
- Это декодирует один раз
Метод 2:
- Перейти к
localhost/test.php
- Отправить эту ссылку через форму
https://www.example.com/test.php?info1234=3177%3B315961%3B317451%3B315511&info3598=121618%3B136803%3B13830%3B20532
- Это декодируетдважды
Вы увидите 2 разных выхода