Оператор переключения CFScript выдает ошибку при передаче строки? - PullRequest
0 голосов
/ 11 сентября 2010

Обновление:

Спасибо, Бен, я решил скопировать URL-адрес в другую структуру и изменить его с помощью StructUpdate ().Вот код, если кому-то интересно (специфично для моего приложения, но вы можете редактировать строки с комментариями, чтобы получить полезную функцию).

function rebuildURL(key, value)
{
 var URLstring = "";
 var VarCount = 0;
 var tmpURL = duplicate(URL);
 var VarSeparator = "";
 structUpdate(tmpURL, arguments.key, arguments.value);
 for (key in tmpURL)
 {
  if (tmpURL[key] neq "" and tmpURL[key] neq "10000" and tmpURL[key] neq "1") `<!--- remove the tmpURL[key] neq "10000" and "1"--->`
  {
   if (VarCount neq 0)
   {
    VarSeparator = "&";
   }
   else
   {
    VarSeparator = "";
   }
   URLstring = URLstring & VarSeparator & "#Lcase(key)#" & "=#Lcase(tmpURL[key])#";
   VarCount = VarCount + 1;
  }

 }
 structClear(tmpURL); `<!---not sure if this is necessary, but probably can't hurt unless you are processing thousands of links --->`
 return(URLstring);
}

Еще раз спасибо!Скотт


Привет, ребята,

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

Сложные типы объектов не могут быть преобразованы в простые значения.

Выражение запросило переменную или промежуточный результат выражения в качестве простого значения, однако результат не может быть преобразован в простое значение,Простыми значениями являются строки, числа, логические значения и значения даты / времени.Запросы, массивы и COM-объекты являются примерами сложных значений.Наиболее вероятной причиной ошибки является то, что вы пытаетесь использовать сложное значение как простое.Например, вы можете пытаться использовать переменную запроса в теге cfif.

Ошибка произошла в C: \ ColdFusion8 \ wwwroot \ pascalnew \ turbos.cfm: строка 8 Вызывается из C: \ ColdFusion8 \ wwwroot\ pascalnew \ turbos.cfm: строка 108 Вызывается из C: \ ColdFusion8 \ wwwroot \ pascalnew \ turbos.cfm: строка 93 Вызывается из C: \ ColdFusion8 \ wwwroot \ pascalnew \ turbos.cfm: строка 1 Вызывается из C: \ ColdFusion8 \wwwroot \ pascalnew \ turbos.cfm: строка 1

6 :  URLvar = "#URL#";
7 :  switch(param)
8 :  {
9 :   case 'mfr':
10 :   {

Вот мой код функции:

<cfscript>
function SetURL(param, paramval)
{
 URLvar = "#URL#";
 switch(param)
 {
  case 'mfr':
  {
   IF (URLvar contains "mfr") 
   {
    REReplaceNoCase(URLvar, "mfr=^[^\&]", "mfr=#paramval#", "All");
   }
   break;
  }
 }
 return(URLvar);
}
</cfscript>

Вот то, с чем я его тестировал:

<cfset urlvar = SetUrl("mfr", "edwards")>
<cfdump var="#urlvar#">

Как "MFR" комплексная переменная ??

Спасибо, Скотт

1 Ответ

1 голос
/ 11 сентября 2010

Когда вы используете CFScript, некоторые версии сообщают о начале блока в виде строки с ошибкой.

Когда вы присваиваете "# URL #" для URLVar, вы создаете указатель на область URL.Затем вы пытаетесь использовать оператор содержимого на нем.Содержит, однако, сравнивает только два простых значения.

Итак, ваша попытка сослаться на сложное значение как скаляр на самом деле приходит сюда:

IF (URLvar contains "mfr") 
{
    REReplaceNoCase(URLvar, "mfr=^[^\&]", "mfr=#paramval#", "All");
}

На догадку, вы пытаетесь посмотретьв самом URL, а не в области URL.Вы можете собрать это из частей области CGI, включая SERVER_NAME, SCRIPT_NAME и QUERY_STRING (или вы можете посмотреть на нужную вам отдельную часть).

Добавлено: Если вы хотите знатьесли переменная передается в URL, я думаю, что вы думаете об этом.Допустим, у вас есть paramval и paramval для его замены.Вы можете сделать это следующим образом:

function paramReplace(param, paramVal, scope)
{
    if(structkeyexists(arguments.scope, arguments.param))
    {
        arguments.scope[arguments.param] = arguments.paramVal;
    }
}
paramReplace("mfr", "fred", URL);

Это просто использует structKeyExists, чтобы выяснить, существует ли эта переменная в соответствующей области видимости, а затем заменяет значение, если оно существует.Если вам нужно перестроить фактическую строку запроса, вы можете сделать это позже.Это позволяет избежать сценариев, когда вы получаете неверные данные, если строка запроса содержит что-то вроде «zone = mfr».

Я не проверял это - это не так - поэтому может потребоваться настройка, но это должноНачните.

...