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()}"

しかし、正しい認証情報 (credentials.xml ファイルで入手可能) を入力したにもかかわらず、常に「login_error」ページ (つまり、ユーザー オブジェクトが常に空) にリダイレクトされる理由がわかりません。

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の子を持つのuserか、私は自問します。そうすべきではないusernameでしょうか? しかし、ねえ、それはあなたの XML であり、私のものではありません。あなたは好きなように物事を呼びます。気をつけます。)
  • その場合、$login の値と同じ文字列値を持つユーザー要素はありますか?

これらすべての質問に対する答えが「はい」の場合は、非常に興味深く、やりがいのある問題を抱えており、XQuery エンジンのバグ レポートである可能性があります。

もし私が賭けなければならないとしたら、私より何も知らなくても、最初の 2 つの質問に賭けるでしょう。 (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 に答える