2017-10-30 4 views
0

sqliteを使用してユーザー名パスワードプログラムを作成しています。ユーザー名がデータベースに存在するかどうかをチェックしたいのですが、このユーザー名の行IDを探したい場合は、ユーザー名入力された、私はどのようにデータベースの単語のrowidを見つけるために知っている 'Word'。変数のROWIDを見つけるには? sqlite3

def sign_in(): 
    usernameask = input("What is your username?") 
    passwordask = input("What is your password?") 
    c.execute("SELECT username FROM stuffToPlot") 
    names = {name[0] for name in c.fetchall()} 
    if usernameask in names: 
     print("Yes") 
     c.execute("SELECT password FROM stuffToPlot") 
     passs = {name[0] for name in c.fetchall()} 
     if passwordask in passs: 
      print("yes,pass") 
      t = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = 'usernameask' ") 
      rowid = t.fetchall() 
      for r in rowid: 
       print(r) 
     else: 
      print("No,pass" 

私はそれがt = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = 'usernameask' ")'usernameask'ウィッヒが現在のように、それを探して交換したいと言う場所で探しています:どのように私はので、私はここで、変数 で単語を置き換えることができます私のコードがあるされていることを確認しますデータベース内の単語を変数に変換します。どうすればいい? エラーはありません。データベース内に「usernameask」という単語の位置が見つかりません。

答えて

1

パラメータ化クエリをとしたいとします。データの移動先となるプレースホルダをクエリに配置し、データとクエリをまとめてデータベースドライバに残します。

パラメータ化クエリを使用すると、攻撃者はあなたが当初の予想よりも多くのコマンドに置くことによって、あなたのデータベースクエリ「を増やす」ことができ、一般的なセキュリティの落とし穴、SQLインジェクション攻撃を、避けましょう。クエリパラメータは、データがコマンドとしてではなく、データとして扱われることを常に保証します。

パラメータ化されたクエリの場合は、通常のように高速です。データベースを複数回使用するとクエリを解析する必要がなくなり、クエリプランを再利用することができます。

sqlite3データベースライブラリは、位置パラメータに?を使用します。 (usernameask,)がタプルであることに注意してください

t = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = ?", (usernameask,)) 

:あなたのコードからのデータを使用する必要があり、これまで?を入れて、cursor.execute()に2つ目の引数に(タプルやリストのように)順番にパラメータ値を置きます1つの要素で[usernameask]も使用できます。

WHERE username =フィルタで参照される文字列値usernameaskを使用して、SELECTクエリを実行します。運転手があなたの値を適切に引用してくれます。

あなたはまた、という名前パラメータを使用することができ、値に、マッピング名をこれらは、(あなたがあなた自身の名前を選ぶことができます):parametername、の形を取り、その後、あなたはcursor.execute()に2つ目の引数に辞書を使用します。

t = c.execute(
    "SELECT rowid, FROM stuffToPlot WHERE username = :username", 
    {'username': usernameask}) 

ここでプレースホルダの名前はusernameであり、ディクショナリはusernameaskの値にマップします。

+0

ありがとう、これらはうまくいきました。私はパスワードを返すだけで、何らかの理由であなたが返す '( 'Sam'、 'Sam'、 'Sam')'私はfetchone()を試してみましたが、それはうまく動作しませんでした。どのようにすればpassowordだけを返すのでしょうか、私はそれをより効率的にするために少し更新しました。更新されたものは本文@Ghostly –

+0

@SamboyT:申し訳ありませんが、私はそれをロールバックしなければなりませんでした。あなたが求めた質問に答えました。スタックオーバーフローは将来の訪問者にも質問と回答を生成することによって機能します。今、新しい質問があります。 –

+0

@SamboyT: 'password、*'を選択したので、まずパスワード列を追加してから、* all *列を追加します。パスワード( '*'をドロップ)を選択し、その行から単一の要素を取り出してください: 'password = c.fetchone()[0]';これは最初に一致する行を取り出し、1つの列だけ取り出し、その1つの列の結果を行から取り出して変数に代入します。 –

関連する問題