0

この関数は、ユーザー ID で検索するため機能します。

private void showList_Click(object sender, EventArgs e)
{
   int id = 0;
   for (int i = 0; i <= sqlClient.Count("UserList"); i++)
   {
      Dictionary<string, string> dik = sqlClient.Select("UserList", "userid = " + id);

      var lines = dik.Select(kv => kv.Key + ": " + kv.Value.ToString());
      userList.AppendText(string.Join(Environment.NewLine, lines));
      userList.AppendText(Environment.NewLine);
      userList.AppendText("--------------------------------------");
      id++;
   }
}

メールで検索しているため、この機能は機能しません。

private void login_Click(object sender, EventArgs e)
{
   string email = lemail.Text;
   Dictionary<string, string> dik = sqlClient.Select("UserList", "firstname = " + email);
   var lines = dik.Select(kv => kv.Key + ": " + kv.Value.ToString());
   logged.AppendText(string.Join(Environment.NewLine, lines));
}

これは、ログイン ボタンをクリックしたときに表示されるエラー メッセージです。

SQL 構文にエラーがあります。1行目の「@aol.com」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください

データベースで検索した電子メールは、引用符なしで「aces@aol.com」でした。@ 記号が特殊文字であることはわかっているため、@ 記号が競合を引き起こしているというエラー メッセージが表示されましたが、どのフレーズを検索すればよいかわかりません。

また、呼び出されている関数は次のとおりです。

public Dictionary<string, string> Select(string table, string WHERE)
{
   //This methods selects from the database, it retrieves data from it.
   //You must make a dictionary to use this since it both saves the column
   //and the value. i.e. "age" and "33" so you can easily search for values.

   //Example: SELECT * FROM names WHERE name='John Smith'
   // This example would retrieve all data about the entry with the name "John Smith"

   //Code = Dictionary<string, string> myDictionary = Select("names", "name='John Smith'");
   //This code creates a dictionary and fills it with info from the database.

   string query = "SELECT * FROM " + table + " WHERE " + WHERE + "";

   Dictionary<string, string> selectResult = new Dictionary<string, string>();

   if (this.Open())
   {
      MySqlCommand cmd = new MySqlCommand(query, conn);
      MySqlDataReader dataReader = cmd.ExecuteReader();

      try
      {
         while (dataReader.Read())
         {
            for (int i = 0; i < dataReader.FieldCount; i++)
            {
               selectResult.Add(dataReader.GetName(i).ToString(), dataReader.GetValue(i).ToString());
            }
         }
         dataReader.Close();
      }
      catch { }
      this.Close();
      return selectResult;
   }
   else
   {
      return selectResult;
   }
}

私のデータベーステーブルは「UserList」と呼ばれています

フィールドの順序は次のとおりです。

ユーザーID、電子メール、パスワード、姓、名

どんな助けでも大歓迎です。このサイトは素晴らしいです!

4

2 に答える 2

0

編集:スティーブはそれを正しく理解しました。一重引用符を見逃しましたが、ファーストネームフィールドではなく、メールフィールドで検索する必要があることは間違いありません.

あなたのメール アドレスは名フィールドに保存されますか?

それをあなたのメールフィールドに変更してください

private void login_Click(object sender, EventArgs e)
{
    string email = lemail.Text;
    Dictionary<string, string> dik = sqlClient.Select("UserList", "YOUR_EMAIL_FIELD = " + email);
    var lines = dik.Select(kv => kv.Key + ": " + kv.Value.ToString());
    logged.AppendText(string.Join(Environment.NewLine, lines));
}

また、SQL インジェクションとパラメーター化されたクエリの使用について調べてください。

于 2013-10-29T21:57:51.957 に答える
0

問題は、文字列値を一重引用符で囲んでいないことが原因だと思います。
このように、メールの値を単純に引用符で囲むことをお勧めします

Dictionary<string, string> dik = sqlClient.Select("UserList", 
                                                  "firstname = '" + email + "'");

しかし、これは実際にはあなたの問題に対する悪い解決策です。

実際の変更は、実行するクエリのパラメーター リストを渡すことであり、文字列の引用符と SQL インジェクションの脆弱性による混乱をすべて回避する必要があります。

ただし、これには Select メソッドと呼び出し方法を変更する必要があります

public Dictionary<string, string> Select(string table, string WHERE, MySqlParameter[] prms)
{

   string query = "SELECT * FROM " + table + " WHERE " + WHERE + "";

   Dictionary<string, string> selectResult = new Dictionary<string, string>();

   if (this.Open())
   {
      MySqlCommand cmd = new MySqlCommand(query, conn);
      cmd.Parameters.AddRange(prms);
      MySqlDataReader dataReader = cmd.ExecuteReader();
      try
      {
          ......
      }
      catch { }
      this.Close();
      return selectResult;
   }
   else
   {
      return selectResult;
   }
}  

そして、呼び出しは

 List<MySqlParameter> prms = new List<MySqlParameter>()
 MySqlParameter p = new MySqlParameter("@mail", SqlDbType.VarChar).Value = lemail.Text;
 prms.Add(p);
 Dictionary<string, string> dik = sqlClient.Select("UserList", "firstname = @mail", prms.ToArray());

現在の例外とは関係ありませんが、コードには他にも重要なポイントがあります。

1) この sqlClient.Count がテーブルのレコードをカウントする場合、次の行

for (int i = 0; i <= sqlClient.Count("UserList"); i++)

必要以上に 1 つの要素をループします。ただi < sqlClient.Count

2) Select メソッドでは例外を飲み込みますが、これは非常に悪いことです。なぜなら、この重要なメソッドのすべての失敗は決して知られないからです。

于 2013-10-29T22:03:34.623 に答える