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 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“@aol.com”附近使用正确的语法

我在数据库中搜索的电子邮件是“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”

按顺序排列的字段如下:

用户名、电子邮件、密码、姓氏、名字

任何帮助将不胜感激。这个网站太棒了!

4

2 回答 2

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++)

循环超过一个元素。只是i < sqlClient.Count

2) 在 Select 方法中,你吞下了异常,这真的很糟糕,因为这个关键方法中的每一次失败都永远不会被知道。

于 2013-10-29T22:03:34.623 回答
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 回答