我正在尝试创建一个允许我评估数据库受限区域的登录凭据的函数。
这是我的代码:
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
答案 0 :(得分:2)
如果没有更多信息,很难确切地看到问题所在。但我们可以推理它。该软件告诉您$ user始终为空。这意味着
doc('credentials.xml')/credenziali/utente[./user = $login]
计算空序列。如果是我的代码,我现在检查以下内容:
utente
的元素会有一个名为user
的孩子,我问自己。难道不是username
或者其他什么吗?但是,嘿,它是你的XML,不是我的,你称之为你喜欢的东西。我只是告诉你我正在关注。)如果所有这些问题的答案都是肯定的,那么你就会遇到一个非常有趣且具有挑战性的问题,也许还有一个针对你的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()。