使用xQuery登录示例

时间:2013-02-08 14:05:19

标签: html xml xhtml xquery

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

这是我的代码:

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

1 个答案:

答案 0 :(得分:2)

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

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

计算空序列。如果是我的代码,我现在检查以下内容:

  • $ login是否有值?
  • doc(&#39; credentials.xml&#39;)是空的吗?
  • 如果非空,它是否有一个名为credenziali的最外层元素?
  • 如果是这样,credenziali是否有孩子(或:孩子)名为utente?
  • 如果是这样,utente是否有一个名为user的孩子? (为什么一个名为utente的元素会有一个名为user的孩子,我问自己。难道不是username或者其他什么吗?但是,嘿,它是你的XML,不是我的,你称之为你喜欢的东西。我只是告诉你我正在关注。)
  • 如果是这样,那么任何用户元素的字符串值是否与$ 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 - 如果是这样的话,您是否应该在&#之间没有斜杠? 39; staff.xq&#39;和登录ID?如果它不是用户被重定向到的URI,则可能需要调整调用者中的内容,以便您可以查看为$ login和$ password发出的值。

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