2016-11-27 9 views
0

私は、「NT」とそれに続く既存の学生IDの最後の6桁のパスワード(NT123456など)のみを許可するように、パスワードの検証方法を試行しています。 。ユーザーは最初のページに姓とパスワードを入力し、クエリを実行します。レコード数が0より大きい場合は、そこからポータルにリダイレクトされます。そうでない場合は、間違っていると言われますが、それは現在重要ではありません。データベースからのパスワードの生成と検証

私が使用しているフォームはこちらです:

<cfquery name="qry1" datasource="grantme"> 
SELECT 'NT' + RIGHT(StudentID, 6) AS Passwords, Lname 
FROM Classmates 
WHERE Passwords = form.password; 
</cfquery> 
<cfoutput query="qry1"> 
#qry1.RecordCount# 
</cfoutput> 

しかし、私は次のようなエラーレポート取得しています:

Error Executing Database Query. 
[Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2. 

The error occurred in G:\InetPub2\wwwroot\student\A00507999\PortalPage.cfm: line 9 

7 : 
8 : <body> 
9 : <cfquery name="qry1" datasource="grantme"> 
10 : SELECT 'NT' + RIGHT(StudentID, 6) AS Passwords, Lname 
11 : FROM Classmates 

VENDORERRORCODE  -3010 
SQLSTATE  07002 
SQL  SELECT 'NT' + RIGHT(StudentID, 6) AS Passwords, Lname FROM Classmates WHERE Passwords = form.password; 
DATASOURCE grantme 
をここにフォーム情報を送信

<cfform name="form" action="PortalPage.cfm"> 
<cfinput type="Text" name="password" maxlength="8"> 
<cfinput type="submit" name="submit" value="Submit"> 
</cfform> 

これを解決するにはどうすればよいですか?私はフォーマットを正しくすることができないようですが、ロジックがそこにあるようです。

+0

DBから2つの値を取得していますが、受信するのは1つだけです。 – FDavidov

+0

WHERE句を削除すると値を表示できるので問題はありませんが、WHERE句が必要です。 – shrimppunk

+0

私の言葉がはっきりしていないと思います...あなたは 'パスワード、Lname'を選択しています...何ですか?これらのTWO値を受け取る必要がある変数を指定する必要はありませんか? – FDavidov

答えて

0

これにより、クエリが機能するはずです。比較は、varchar列と文字列の間で行われます。文字列は一重引用符で区切る必要があります。ポンド記号も必要です。

<cfquery name="qry1" datasource="grantme"> 
SELECT 'NT' + RIGHT(StudentID, 6) AS Passwords, Lname 
FROM Classmates 
WHERE Passwords = '#form.password#'; 
</cfquery> 

SQLインジェクション攻撃から保護するために、これがクエリを書き込むための最良の方法です。

<cfquery name="qry1" datasource="grantme"> 
SELECT 'NT' + RIGHT(StudentID, 6) AS Passwords, Lname 
FROM Classmates 
WHERE Passwords = <cfqueryparam value="#form.password#" cfsqltype="CF_SQL_VARCHAR">; 
</cfquery> 
関連する問題