2017-06-06 60 views
0

トークンが存在するかどうかを確認します。私はこれを行うと私はこれを得る エラー: 'where句'の 'WhatEverTokenIType'列が不明である トークンが存在しない。私はそれを以下のようにコンソールに出力したい。C#Mysqlエラートークンが存在するかどうか確認してください。

public static async Task RedeemToken(CommandEventArgs e, string Token) { 

     try { 
      var Channel = e.Server.FindChannels("tokens").FirstOrDefault(); 
      var User = e.User; 

      string Connection = "datasource=myip;port=3306;database=somedb;username=someuser;password=somepass;"; 
      string Query = "SELECT * FROM Tokens WHERE token = " + Token; 

      MySqlConnection conn = new MySqlConnection(Connection); 
      MySqlCommand cmd = new MySqlCommand(Query, conn); 
      MySqlDataReader reader = null; 

      conn.Open(); 
      reader = cmd.ExecuteReader(); 
      int tokenExist = (int)cmd.ExecuteScalar(); 
      if (tokenExist > 0) { 
       Console.WriteLine("Token Exist"); 
      } else { 
       Console.WriteLine("Token Doesn't Exist"); 
      } 
      while (reader.Read()) { 
      } 
      conn.Close(); 
     } catch (Exception ex) { 
      Console.WriteLine(ex.Message); 
     } 
    } 
+0

あなたにはSQLインジェクションの脆弱性があります。 – SLaks

答えて

1

あなたのSQLはSELECT * FROM Tokens WHERE token = someTokenようなものになるだろう - それは列名、ない値としてsomeTokenの治療です。

動的にSQLを構築するのではなく、パラメータ化されたSQLを使用する必要があります。

// Include the parameter name (@token) in the SQL... 
string query = "SELECT * FROM Tokens WHERE token = @token"; 

// Then populate the parameter *value* in the parameter collection. 
// Change the parameter type to match the token column, obviously. 
cmd.Parameters.Add("@token", MySqlDbType.VarChar).Value = token; 

また、あなたべき:あなたの近くの接続を確保するために

  • 使用using文、パラメータ、ローカル変数などで始まるなど、適切
  • フォロー.NETとC#の命名規則を、コマンド小文字
  • asyncメソッド内で非同期呼び出しを使用する - 現在、呼び出し元のメソッドは、クエリの実行中にブロックされます。
  • コードでExecuteScalar()を呼び出していない - すでにExecuteReader()を呼び出していますが、クエリでスカラー値が返されないため、なぜ呼び出すのですか?
+0

大丈夫、オブジェクト参照がオブジェクトのインスタンスに設定されていません。 – Clearout

+0

@Clearout:それ以上の情報がなくても、私ができることは、https://stackoverflow.com/questions/4660142 –

関連する問題