Для каждого по ссылке или значению - PullRequest
0 голосов
/ 28 марта 2019

У меня есть следующий код:

dim key
for each key in Request.Querystring
  'do something
  key = sanitized_param(key)
next

Мой вопрос к вам, знаток классического asp, классическая asp или asp передают переменные как ссылки (память) или по значению?Попытка выяснить, очищаю ли я ключевую переменную и передаю ли она себе, является ли она «живой» для этого цикла, или новое значение передается в исходную строку QueryString?

1 Ответ

2 голосов
/ 28 марта 2019

Request.QueryString извлекает параметры строки запроса по значению из заголовков страницы.

Вы можете вносить изменения в строку запроса только после ее получения с помощью Request.QueryString, но вы не можете вносить изменения непосредственно в Request.QueryString, поскольку он доступен только для чтения (если вы могли бы внести изменения, вы, вероятно, использовали бы * 1006). *, но это недопустимая команда ответа).

Полагаю, вы пытаетесь очистить все строки запроса за один раз? Это не действительно возможно или действительно необходимо. Вы обычно очищаете строку запроса, как и когда вы ее запрашиваете:

Response.Write(sanitized_param(Request.QueryString("myQS")))

Или сначала назначить строку запроса переменной, а затем очистить ее:

Dim myQS

myQS = Request.QueryString("myQS")
myQS = sanitized_param(myQS)

' or

myQS = sanitized_param(Request.QueryString("myQS"))

Как только строка запроса назначена переменной и подвергнута дезинфекции, вы можете ссылаться на эту переменную так часто, как вам нравится, без необходимости снова передавать ее в функцию sanitize.

Кроме того, ваш пример кода не имеет особого смысла. Значение key в вашем цикле for each ссылается только на имена строк вашего запроса, а не на их значения. Если бы Response.QueryString была действительной командой ASP, вы бы сделали:

Response.QueryString(key) = sanitized_param(Request.QueryString(key))

Но опять же, это невозможно.

<ч />

РЕДАКТИРОВАТЬ: Это решение может быть то, что вы ищете:

Создайте объект словаря, назовите его, например, «QueryString». Переберите все строки запроса и добавьте очищенную версию в объект словаря.

Dim QueryString : Set QueryString = Server.CreateObject("Scripting.Dictionary")

For Each Item In Request.QueryString
    QueryString.Add Item,sanitized_param(Request.QueryString(Item))
next

Теперь, чтобы получить очищенную версию строки запроса, просто используйте:

QueryString.Item("query_string_name")

Или для оригинальной неанизированной версии вы все равно можете использовать:

Request.QueryString("query_string_name")

Как и Request.QueryString, объект словаря простителен и не вернет ошибку, если вы запросите несуществующую строку запроса.

<ч />

Вы также можете создать функцию для извлечения очищенных строк запроса, например:

Function SanitizedQS(ByVal qsName)
    SanitizedQS = sanitized_param(Request.QueryString(qsName))
End Function

И вместо использования Request.QueryString("query_string_name") просто используйте SanitizedQS("query_string_name").

...