0

我正在尝试创建一个函数,允许我评估数据库受限区域的登录凭据。

这是我的代码:

declare function local:check() as xs:string {

let $login :=  request:get-parameter("username",'')
let $password :=  request:get-parameter("password",'')

let $user := doc('credentials.xml')/credenziali/utente[./user = $login]

return (
    if (not(empty($user))) then concat('staff.xq',$login,' ',$password)
    else concat('login_error.xq',$login,' ',$password)
)    
};

此函数在以下位置调用:

form name="login" method="post" action="{local:check()}"

但我不明白为什么我总是被重定向到页面''login_error''(即用户对象总是空的),尽管我输入了正确的凭据(在文件credentials.xml 中可用)。

Credentials.xml 包含:

<credenziali> <utente id="1"> <user>admin</user> <password>admin</password> </utente> </credenziali>

我在屏幕的相应输入文本框中设置了 username=admin 和 password=admin

4

1 回答 1

2

如果没有更多信息,很难确切地看出这里的问题所在。但我们可以推理。该软件告诉您 $user 始终为空。这意味着

doc('credentials.xml')/credenziali/utente[./user = $login]

评估为空序列。如果是我的代码,我现在要检查以下内容:

  • $login 有值吗?
  • doc('credentials.xml') 是空的吗?
  • 如果非空,它是否有一个名为 credenziali 的最外层元素?
  • 如果是这样,credenziali 是否有孩子(或:一个孩子)命名为 utente?
  • 如果是这样,utente 是否有一个名为 user 的孩子?(我问自己,为什么一个名为的元素utente会有一个名为我注意了。)userusername
  • 如果是这样,是否有任何用户元素具有与 $login 的值相同的字符串值?

如果所有这些问题的答案都是肯定的,那么您遇到了一个非常有趣且具有挑战性的问题,并且可能是您的 XQuery 引擎的错误报告。

如果我必须打赌,而我不知道任何事情,我会在前两个问题上打赌——因为它们涉及与环境的交互,这是 (a) 非标准化的,(b) 通常会因考虑因素而变得复杂似乎无关紧要,(c) 库创建者通常很难很好地记录(因为他们不知道他们需要了解的有关您的环境的所有内容),因此 (d) 通常没有特别好的记录,因此 (e) 错误易于。我发现反复试验有很大帮助。

[后记]

你问如何检查 $login 和 $user 是否被正确初始化。这里没有规则或限制。调试 XQuery 很像调试任何其他编程语言。你需要想办法让代码中发生的事情在你的屏幕上可见,这样你就可以找出哪里出了问题。一些可能性:

  • 暂时用类似的东西替换变量的初始化

    let $login :=  "Paolo",
        $password :=  "Francesca"
        $usersdoc := <credenziali> 
                       <utente id="1"> 
                         <user>Paolo</user> 
                         <password>Francesca</password> 
                       </utente> 
                     </credenziali>
     let $user := $usersdoc//utente[./user = $login]
    

    确保这有效。(如果没有,你的问题出在其他地方。)然后用原始代码替换 $login 的初始化,看看它是否仍然有效。如果是,则替换 $password 的初始化,看看它是否仍然有效。如果是,则替换 $usersdoc 的初始化,然后替换 $user。

  • 删除条件并无条件地返回一些允许您查看 $login 值的值。(例如

    let $login :=  request:get-parameter("username",'')
    let $password :=  request:get-parameter("password",'')
    
    let $user := doc('credentials.xml')
                   /credenziali/utente
                   [./user = $login]
    
    return concat('staff.xq...',$login,'...',$password)
    

    我猜你的登录函数返回的字符串是用户将被重定向到的 URI——如果是这样,你是否应该在“staff.xq”和登录 ID 之间没有斜杠或其他东西?如果不是用户被重定向到的 URI,您可能需要调整调用者中的内容,以便查看 $login 和 $password 发出的值。

  • 如果您的 XQuery 引擎产生了您可以检查的日志,请使用 trace()。

于 2013-02-08T21:34:38.447 回答