รบกวนสอบถามเรื่องการใส่พาสเวิดเข้าระบบ
กระทู้เก่าบอร์ด อ.Yeadram

 6,239   22
URL.หัวข้อ / URL
รบกวนสอบถามเรื่องการใส่พาสเวิดเข้าระบบ

รบกวนสอบถามเกี่ยวกับการบันทึกข้อมูลครับ คือประมาณว่าถ้าจะเปิดฟอร์มลงบัญชีก็จะต้องให้คนที่คีย์ข้อมูลใส่พาสเวิดของตัวเองทุกครั้งที่เปิดฟอร์มครั้งแรกจนกว่าจะมีการปิดฟอร์ม แล้วอยากให้มีการบันทึกด้วยครับ ว่าไอดีของคนที่คีย์ข้อมูลเข้าไปได้คีย์ข้อมูลเรดคอร์ดไหนบ้าง เพื่อที่จะได้ตรวจสอบได้ว่าไอดีไหนได้ทำอะไรบ้างในฐานข้อมูล ผมต้องขออภัยด้วยนะครับถ้าใช้ภาษาที่ผิดเพราะผมเป็นมือใหม่น่ะครับ รบกวนผู้รู้ช่วยอธิบายด้วยนะครับ ขอขอบพระคุณอย่างสูงครับ

22 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R06823
1) สร้างตาราง tbLogin (usn, pws)
2) กรอกข้อมูลของแต่ละ user ลงไป
3) ที่ตารางหลักของข้อมูลบัญขีของคุณ ให้สร้างฟิลด์เพิ่มเติม 1 ฟิลด์
   - ชื่อ ent_by
   - ชนิดข้อมูลให้เหมือนกับ ฟิลด์ tbLogin.usn
   - ไม่ต้องตั้งค่า default value
4) ที่ฟอร์มกรอกข้อมูลของคุณให้เพิ่ม textbox ไว้1ตัว ชื่อ txUsn วางไว้ในจุดเด่นๆ ก็ดี
5) ที่ฟอร์มเดียวกันนี้ เพิ่ม textbox อีก 1 ตัว
    - ชื่อ txEnt_by
    - ผูกค่ากับฟิลด์ ent_by (bound field)
    - ตั้งค่า default value ว่า =[txUsn]


เขียนโค้ดใส่เหตุการณ์เมื่อเปิดฟอร์ม
private sub form_open(cancel as integer)
dim usname, uspwd as string
usname=inputbox("กรอกชื่อผู้ใช้")
cancel=isnull(usname)

uspwd=inputbox("กรอกรหัสผ่าน")
cancel=isnull(uspwd)

if dcount("usn","tbLogin","[usn] ='" & trim(usname) & "' AND [pws] = '" & trim(uspwd) &"'")=1 then
txUsn=usname
else
cancel=true
end if
End sub

คิดว่าน่าจะเป็นวิธีที่ทำได้ง่ายๆ นะครับ แต่เวลาไปใช้งานจริง อาจจะเจอ จุดรั่ว ช่องโหว่อีกเยอะหน่อย ต้องค่อย ๆ หาวิธีปรับปรุงต่อยอดเพิ่มเติมครับ ที่แนะนำวิธีนี้ไป เพราะเพื่อให้เข้าใจตามได้ง่ายๆ ครับ มันจะต้องสัมพันธ์กันทั้งสามส่วน (เป็นอย่างน้อย) คือ ตาราง, ฟอร์ม, เหตุการณ์
2 @R06825
ขอบคุณ คุณ yeadram มากครับ เดี๋ยวผมจะลองทำตามขั้นตอนดูนะครับ
3 @R06832
รบกวนสอบถามด้วยนะครับ คือผมทำตามขั้นตอนถึงข้อที่ 5 ตรง
- ผูกค่ากับฟิลด์ ent_by (bound field)
- ตั้งค่า default value ว่า =[txUsn
ผมหาไม่เจอครับเพราะ Access 2003 ของผมเป็นภาษาไทยครับ ไม่ทราบว่าจะใส่ตรงไหน แล้วรบกวนอีกเรื่องนึงคือ ตรง usname=inputbox("กรอกชื่อผู้ใช้")
กับ uspwd=inputbox("กรอกรหัสผ่าน") ผมต้องใส่รหัสคนคีย์ในวงเล็บหรือว่าลงแค่ uspwd=inputbox เท่านั้นครับ ต้องขอโทษด้วยนะครับเพราะผมเป็นมือใหม่ ไม่ทราบจริงๆครับ ยังไงก็ขอรบกวนด้วยนะครับ ขอบคุณมากครับ
4 @R06833
- คำว่า Default value ถ้าเป็นเมนูภาษาไทย มันจะเขียนว่า ค่าเริ่มต้น ครับ
- ในส่วนของโค้ด คำสั่ง inputbox ไม่ต้องปรับเปลี่ยนอะไรครับ คำที่อยู่ในวงเล็บมันจะโชว์ที่หน้าจอครับ ให้โชว์คำนั้นไปก่อนครับ ถ้าคุณเห็นมันในตอนทดสอบแล้วอยากจะเปลี่ยนคำใหม่ ค่อยว่ากันใหม่ครับ
   คือมันเป็นคำ ที่ไว้สื่อสารกับผู้ใช้ครับว่า "โปรแกรมของเราต้องการให้ผู้ใช้ทำอะไรต่อไป ในขั้นตอนนั้น"
5 @R06835
ขอบคุณมากๆเลยครับ เดี่ยวผมจะทำตามคำแนะนำครับผม ขอบคุณครับ
6 @R06836
รบกวนด้วยนะครับ คือผมทำตามขั้นตอนแล้วครับพอคีย์ชื่อ กับ พาสเสิดเข้าไปมันขึ้นว่า Run-time ereor '3078' ครับผม แล้วขึ้นมาว่า

Private Sub form_open(cancel As Integer)
Dim usname, uspwd As String
usname = InputBox("¡ÃÍ¡ª×èͼÙéãªé")
cancel = IsNull(usname)

uspwd = InputBox("¡ÃÍ¡ÃËÑʼèÒ¹")
cancel = IsNull(uspwd)

If DCount("usn", "tbLogin", "[usn] ='" & Trim(usname) & "' AND [pws] = '" & Trim(uspwd) & "'") = 1 Then
txUsn = usname
Else
cancel = True
End If
End Sub

ตรง If DCount("usn", "tbLogin", "[usn] ='" & Trim(usname) & "' AND [pws] = '" & Trim(uspwd) & "'") = 1 Then

ขึ้นมาเป็นสีเหลืองครับ ไม่ทราบว่าผมผิดตรงไหนหรือเปลาครับ ผมก๊อบตัวอย่างใส่ลงไปเลยครับผม รบกวนด้วยนะครับ ขอบคุณครับ
7 @R06845
-tbLogin.usn เก็บข้อมูลเป็นข้อความหรือตัวเลขครับ
-ผมไม่ทราบว่า error ตัวนี้มันหมายถึงอะไร สงสัยคงประมาณว่าข้อมูลในการเปรียบเทียบผิดประเภท งั้นลองปรับเปลี่ยนแถวๆ เงื่อนไขดูครับ (จริงๆ แล้วไม่อยากปรับเลย อย่างนั้นน่าจะปลอดภัยกว่า

แบบที่ 1 เปลี่ยนตัวเปรียบเทียบ
If DCount("usn", "tbLogin", "[usn] Like '" & Trim(usname) & "' AND [pws] Like '" & Trim(uspwd) & "'") = 1 Then

แบบที่ 2 ลองเอา trim() ออก
If DCount("usn", "tbLogin", "[usn] ='" & usname & "' AND [pws] = '" & uspwd & "'") = 1 Then

แบบที่ 3 เปลี่ยนตัวเปรียบเทียบด้วย เอา trim() ออกด้วย
If DCount("usn", "tbLogin", "[usn] Like '" & usname & "' AND [pws] = '" & uspwd & "'") = 1 Then

แบบที่ 4 สันนิษฐานว่า Dcount ไปเจอ null แล้วไม่นับจำนวนออกมา
If not isnull(DLookup("usn", "tbLogin", "[usn] ='" & Trim(usname) & "' AND [pws] = '" & Trim(uspwd) & "'")) Then


ลองเปลี่ยนหาดูนะครับ แนะนำให้ลอง 4, 1, 2 ,3
วิธีที่ 2 กับ 3 เอาไว้ท้ายๆ เลยครับ เพราะการทำระบบล็อกอิน ไม่ควรใช้ operation Like ครับ (มันมีจุดรั่วให้ Hack กันได้)
8 @R06851
สวัสดียามเช้าครับคุณ yeadram เมื่อวานเย็นต้องขอโทษด้วยครับพอดีกลับบ้านเลยทำค้างไว้ไม่ได้ทำตามวิธีของคุณต่อครับ ตอนนี้ปัญหาได้แก้เรีบยร้อยแล้วครับ เพราะผมไปพิมพ์ชื่อ tb ผิดน่ะครับเลยขึ้น Eror ต้องต้องขอโทษด้วยครับที่ผมไม่ดูให้ดีก่อนและต้องขอขอบคุณมากครับ

วันนี้ผมมีเรื่องต้องรบกวน คุณ yeadram อีกครับ
1. คือพอคีย์เข้าไปแล้วมันไม่ยอมเข้าไปอยู่ที่ tb เก็บข้อมูลน่ะครับ ผมทำปุ่มเซฟจากเครื่องมือของ Access แล้วก้ไม่เข้าน่ะครับ ลองลบข้อมูลออกเหลือแต่ tb เปล่าๆ พอกลับมาดูที่ Form ก็ยังมีข้อมูลค้างอยู่เลยครับ ไม่ทราบว่าผมต้องปรับเปลี่ยนตรงไหนหรือเปล่า
2. ตรง textbox txUsn กับ txEnt_by และ ent_by ที่สร้างขึ้นสามารถซ่อนไว้ได้ไหมครับหรือถ้าซ่อนแล้วจะทำให้มันหาค่าไม่เจอครับ
3. ถ้าผมจะขอปรับเปลี่ยนการล็อคอินโดยการสร้าง Form ขึ้นมาเป็นช่องสี่เหลี่ยมเล็กๆ คล้ายๆ Popup ให้มีช่อง
- Username
- Password
- แล้วมีปุ่ม ตกลง กับ ยกเลิก
การทำงานอยากให้คีย์ได้ 3 ครั้งถ้าคีย์ผิดมันจะไม่สามารถเข้าได้ ไม่ทราบว่าอย่างนี้ผมต้องใช้มาโครในการทำได้ไหมครับหรือว่าต้องเขี้ยนโค๊ดขึ้นมาอย่างเดียวครับ ขอความกรุณาด้วยนะครับ ขอบคุณมากครับ
9 @R06855
ขอโทครับลืมไป ถ้าอยากจะให้ Password เวลาคีย์ให้เห็นเป็น ****** จะได้ไหมครับ ขอบคุณครับ
10 @R06856
ทำได้แล้วครับในข้อ 1 ผมแก้ปัญหาได้แล้วครับ
11 @R06864
ทำไปเรื่อยๆ ลองหาไปเรื่อยๆ เดี๋ยวก็ได้ครับ ถ้าเราเข้าใจมันแล้วจะค่อยๆ ได้ทีละหน่อย

บางทีหาตามกระทู้เก่าๆ หรือ help หรือ Google ก็จะค้นได้ แต่บ่อยครั้งครับ ที่เราหาไม่เจอ ไม่ได้หมายความว่ามันไม่มีคำอธิบายนะครับ เพียงแค่เราไม่รู้ว่าจะใช้ คีย์เวอร์ด อะไรไปหามากกว่า
คือเรายังไม่ค่อยทราบว่า ที่ทำๆ อยู่เนี่ย หรือที่เราต้องการเนี่ย มันเรียกว่าอะไร เราก็เลยไม่รู้ว่าจะค้นหาอะไร

ข้อ1 ทำได้แล้ว ข้าม!
ข้อ2 ถ้าคิดจะทำวิธีข้อ3 ข้อนี้ก็ข้าม!
ข้อ3 ทำเป็นฟอร์มรับข้อมูล ได้ครับทำได้เลย
-ถ้าล็อกอินผ่าน ก็ให้เปิดฟอร์มบัญชี ถ้าไม่ผ่าน ก็ไม่ให้ใช้ฟอร์มบัญชี หรืออาจจะสั่งปิดโปรแกรมไปเลยก็ได้
- ปุ่มกด ยกเลิก มีไว้ปิดฟอร์ม
- ปุ่มกด ตกลง เมื่อกดก็ทำการตรวจสอบ เงื่อนไข dcount() ที่ให้ไปนั่นแหละครับ ถ้าไม่ผ่าน 3 ครั้งก็ให้กดปุ่มยกเลิก

sub ปุ่มยกเลิก
docmd.close acform, me.name
end sub

sub ปุ่มตกลง
static keyTime as integer
keyTime = keyTime +1

if dcount(.....)=1 then
keytime=0
docmd.openform "ชื่อฟอร์มบัญชี",,, txUsn
docmd.close acform, me.name
end if
if keytime=>3 then docmd.close acform, me.name
end sub


สำหรับคำถามสุดท้าย กล่องข้อความที่อยากให้เป็น *
สามารถกำหนดได้ที่คุณสมบัติของ textbox ในมุมมองออกแบบได้เลยครับ
มองหา input mask ครับ
12 @R06868
ขอบคุณมากๆเลยครับที่คอยแนะนำผม ผมจะพยายามหาวิธีและทำตามคำแนะนำครับ ขอบคุณมากครับ
13 @R06871
ต้องขอโทษด้วยนะครับ ต้องขอรบกวนอีกแล้วครับ ผมพยายามทำแล้วแต่ไม่ได้จริงๆครับ ผมพยายามใส่โค๊ดหลายวิธีแล้วครับ รายละเอียดนะครับ

ฟอร์มและตารางที่ผมทำเป็นแนวทางชื่อฟอร์ม "001" เป็นฟอร์มใส่ข้อมูลของสินค้า โดยทำตามคำแนะนำของคุณ yeadram คือ

1) สร้างตาราง tbLogin (usn, pws)
2) กรอกข้อมูลของแต่ละ user ลงไป
3) ที่ตารางหลักของข้อมูลบัญขีของคุณ ให้สร้างฟิลด์เพิ่มเติม 1 ฟิลด์
   - ชื่อ ent_by
   - ชนิดข้อมูลให้เหมือนกับ ฟิลด์ tbLogin.usn
   - ไม่ต้องตั้งค่า default value
4) ที่ฟอร์มกรอกข้อมูลของคุณให้เพิ่ม textbox ไว้1ตัว ชื่อ txUsn วางไว้ในจุดเด่นๆ ก็ดี
5) ที่ฟอร์มเดียวกันนี้ เพิ่ม textbox อีก 1 ตัว
    - ชื่อ txEnt_by
    - ผูกค่ากับฟิลด์ ent_by (bound field)
    - ตั้งค่า default value ว่า =[txUsn

ผมทำตามทุกขั้นตอนเลยครับ พอผมทำเรียบร้อยแล้วผมก็สร้างฟอร์มขึ้นมาหนึ่งฟอร์ม ชื่อฟอร์ม FmLogin
ในฟอร์มจะมีรายละเอียดดังนี้ครับ

- ช่องใส่ Username โดยตั้งชื่อว่า txUsn
- ช่องใส่ Password โดยตั้งชื่อว่า txEnt_by
- ปุ่มตกลง โดยตั้งชื่อว่า btAssent
- ปุ่มยกเลิก โดยใช้ชื่อว่า btCancle

เมื่อสร้างเสร็จแล้วผมก็ใส่โค๊ดตามคำแนะนำครับคือใส่โค๊ด

sub ปุ่มยกเลิก
docmd.close acform, me.name
end sub

sub ปุ่มตกลง
static keyTime as integer
keyTime = keyTime +1

แล้วผมก็ใส่โค๊ด

if dcount("usn","tbLogin","[usn] ='" & trim(usname) & "' AND [pws] = '" & trim(uspwd) &"'")=1 then
txUsn=usname
else
cancel=true
end if

keytime=0
docmd.openform "001",,, txUsn
docmd.close acform, me.name
end if
if keytime=>3 then docmd.close acform, me.name
end sub

ลงไปในปุ่มตกลงอย่างนี้ถูกไหมครับ ถ้าถูกแล้วผมใส่โค๊ดผิดตรงไหนหรือเปล่าครับ เพราะมันไม่สำเร็จเลยจริงๆครับ ผมต้องขอโทษด้วยนะครับที่รบกวนบ่อย แต่ผมพยายามหลายรอบแล้วแต่ไม่ได้จริงๆ ต้องขอความกรุณาด้วยนะครับ ขอบคุณครับ

14 @R06872
อีกเรื่องนึงครับ คือ Access 2003 ของผมเป็นภาษไทยครับ ไม่ทราบว่าผมต้องใส่หรือลงในชื่องไหน รบกวนด้วยนะครับผม
15 @R06873
ต้องการทำให้ textbox มีรูปแบบการป้อนข้อมูลแบบ พาสเวอร์ด (ซ่อนอักขระ ขณะป้อน)

-เปิดฟอร์มในมุมมองออกแบบ
-คลิ๊กขวาที่ textbox ที่ต้องการ เลือก properties (คุณสมบัติ)
-ในไดอะล็อกซ์คุณสมบัติที่โผล่ขึ้นมาให้เลื่อนไปที่แท็บ Data
-กำหนดคุณสมบัติในช่องรายการที่ 2 (Access 2000-2002-2003)
-ชื่อรายการว่า "Input mask" "รูปแบบการป้อนข้อมูล"
-ให้เขียนในช่องว่างนั้นว่า Password
เสร็จครับ
16 @R06874
ขอบคุณมากครับ จากกระทู้ที่ (R06871) ผมทำถูกต้องแล้วใช่ไหมครับ คือว่าผลที่ออกมามันไม่ยอมเปิดเข้าฟอร์ม 001 ครับมันขึ้นว่า นิพจผิดพลาด ประมาณนี้ครับ ผมต้องแก้ที่จุดไหนบ้างครับ รบกวนด้วยครับ
17 @R06875
ได้แล้วครับ พยายามอยู่ครึ่งวันในที่สุดก็ทำได้แล้วครับ ตอนนี้พอคีย์ข้อมูลก็สามารถเปิดฟอร์มได้แล้วครับ

ตอนนี้อยากรบกวนสอบถามอีก 3 เรื่องครับ

1 ไม่ว่าเราจะคีย์ข้อมูลอะไรเข้าไปที่ไม่ตรงกับ usn และ pws ในเทเบิล TbLogin มันก็สามารถเปิดฟอร์มได้หมดเลยครับ
2 ถ้าไม่ใส่ข้อมูลอะไรเลยมันจะขึ้นฟ้องว่า

Run-time error '2498'
นิพจน์ที่คุณป้อนเป็นชนิดข้อมูลที่ไม่ถูกต้องสำหรับอาร์กิวเมนต์ใดอาร์กิวเมนต์หนึ่ง

โค๊ดที่ขึ้นมาเป็นแบบนี้ครับ

Private Sub btAssent_Click()
Static keyTime As Integer
keyTime = keyTime + 1

If DCount("usn", "tbLogin", "[usn] ='" & Trim(usname) & "' AND [pws] = '" & Trim(uspwd) & "'") = 1 Then
txUsn = usname
Else
keyTime = 0
DoCmd.OpenForm "001", , , txUsn ***
DoCmd.Close acForm, Me.Name
End If
If keyTime >= 3 Then DoCmd.Close acForm, Me.Name
End Sub

ตรงช่อง DoCmd.OpenForm "001", , , txUsn ***   ขึ้นสีเหลืองขึ้นมาครับ

3 ตรงฟิล ent_by ที่สร้างขึ้นมาเพื่อบันทึกว่าใครเป็นคนคีย์ข้อมูล ไม่เข้าไปเซฟไว้ที่เทเบิลครับ

ผมขอโทษจริงๆนะครับที่ถามบ่อยๆ ผมได้พยายามทำหลายครั้งแล้วครับ พอแก้ไขได้อย่างนึงก็มีปัญหาเกิดขึ้นมาอีก ทำให้ผมต้องรบกวนบ่อยๆ ต้องขอความกรุณาด้วยนะครับ
18 @R06878
ข้อ 1 และข้อ 2 ทำได้แล้วครับผม เหลือแต่ข้อ 3 อย่างเดียวครับ ไม่ทราบว่าต้องเขียนโค๊ดอย่างไรให้ตรง ent_by บันทึกข้อมูลไปอยู่ที่เทเบิลครับ รบกวนสอบถามด้วยครับ
19 @R06896
ไม่ทราบว่าผมต้องเขียนโค๊ดหรือต้องผูกข้อมูลอย่างไรครับ เพื่อนที่จะให้รายชื่อที่พิมพ์เข้าไปในฟอร์มล็อคอิน เช่น Usname "admin" Password "1234" พอพิมพ์ถูกแล้วเข้าหน้าฟอร์มที่ต้องการ อันนี้ทำได้แล้วครับด้วยความกรุณาของคุณ yeadram ที่ช่วยแนะนำผมมาตลอด ตอนนี้เหลือแต่ให้นำชื่อที่คีย์ตรงชอ่ง Usname คือ "admin" หรือชื่ออื่นๆที่ได้ตั้งไว้ ไปบันทึกไว้ในเทเบิลที่มีฟิลด์รองรับอยู่แล้ว ไม่ทราบว่าต้องทำอย่างไรครับ ขอความกรุณาด้วยครับ ผมพยายามลองผูกข้อมูลหรือปรับเปลี่ยนโค๊ดแล้วแต่ไม่สาสารถทำได้จริงๆครับ รบกวนสอบถามด้วยครับ
20 @R06901
เรามีการรับส่งข้อมูลกันระหว่างสองฟอร์ม คือฟอร์มล็อกอิน ก่อนจะปิดตัวเอง ก็สั่งเปิดฟอร์มบัญชีขึ้นมา พร้อมทั้งส่งข้อมูลไปด้วย โดยส่งไปในคำสั่งเปิดฟอร์มที่อาร์กิวเมนต์สุดท้าย (openargs)
-------------------------------------------------------------

ต้นทาง::::::::::
* ผมนึกว่าคุณเข้าใจผมก็เลยรวบๆ ให้สั้น พอประมาณให้ทราบว่า ให้ระบุค่าไปในอากิวเมนต์สุดท้ายครับ
จริงๆ ถ้าคุณจะเอาให้หมดให้ครับ คำสั่งในการเปิดฟอร์มครั้งนี้มันต้อง อย่างนี้ครับ
docmd.OpenForm "001",,,,,,txUsn (มีคอมม่า 6 ตัว)
-------------------------------------------------------------------------------

ปลายทาง::::::::::::::
ในฟอร์มบัญชีของคุณ (001)
ต้องเขียนโค้ดให้รับค่า อาร์กิวเมนต์ ซึ่งเราได้ส่งมาจากฟอร์มล็อกอินด้วยครับ (อันนี้ยังไม่ได้บอกไปแต่ต้น ต้องของอภัยครับ)

Private Sub Form_Open(Cancel As Integer)
Cancel = (IsNull(Me.OpenArgs))
ชื่อเท็กซ์บ็อกซ์ที่จะพักข้อมูลuser = me.openargs
End Sub
-------------------------------------------------------------------------------
สรุปคือในคำสั่งเปิดฟอร์ม เราจะส่งข้อมูลชื่อ user เข้าไปด้วย (ที่อาร์กิวเมนต์สุดท้าย)
และในฟอร์มปลายทางเราก็กำหนดในเหตุการณ์แรกๆ เลยครับ ให้ตรวจหา อาร์กิวร์เมนต์ ถ้าไม่เจอก็ไม่อนุญาตให้เปิดฟอร์ม (อาจเป็นเพราะฟอร์มถูกสั่งให้เปิดจากที่อื่นๆ ที่ไม่ใช่จากฟอร์มล็อกอิน ซึ่งเราไม่อนุญาต)
แต่ถ้าเจอข้อมูลในอาร์กิวร์เมนต์ ก็สันนิษฐานได้เลยว่า เป็นข้อมูล "ชื่อผู้ใช้" ที่เราส่งมาจากฟอร์มล็อกอิน เราก็เอาข้อมูลนี้ไปใช้งานได้เลย พร้อมทั้งอนุญาตให้เปิดฟอร์มทำงานได้ตามปกติ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3377s