Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Diferencía entre mayúsculas y minúsculas (https://www.clubdelphi.com/foros/showthread.php?t=90464)

abelantonio 15-06-2016 17:26:10

Diferencía entre mayúsculas y minúsculas
 
Buen dia Colegas!!

Solicitando de su ayuda....soy nuevo en el foro y estoy iniciando a programar en delphi...soy novato.

Les cuento tengo un programa al cual se accede al sistema por medio de un login, ya lo tengo funcionando, el problema que tengo es que no diferencía entre mayúsculas y minúsculas (es decir uso un password almacenado como "Hola", pero si escribo todo con mayúscula o minúscula aún me permite acceso, quisiera saber como puedo hacer para que el password lo escriba exactamente como se almaceno), uso una BD MySQL ¿Alguna sugerencia? De ante mano agradezco su ayuda.


Este es el codigo de mi login:
Código Delphi [-]
procedure TFormLogin.txtPassKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
  begin
  FMCorp.qry_login.Close;
  FMCorp.qry_login.SQL.Clear;
  FMCorp.qry_login.SQL.Add('Select usuario, contrasenia, NombreUsuario, NivelUsuario from login where usuario='+QuotedStr(txtUsuario.Text)+ 'and Contrasenia= '+QuotedStr(txtPass.Text));
  FMCorp.qry_login.Open;

  Nivel := FMCorp.qry_login.FieldByName('Nivel').AsString;
  showmessage('El nivel del usuario es '+inttostr(Nivel));

    if (txtUsuario.Text = '') and (txtPass.Text = '') then
      begin
        ShowMessage ( 'Campos Vacios' );
      end
    else

      if (FMCorp.qry_login.Eof) then
        begin
          MessageBox(Handle, 'Usuario y Contraseña Invalido!', 'LoyalCorp', MB_ICONINFORMATION+MB_OK);
          txtUsuario.Clear;
          txtPass.Clear;
          txtUsuario.SetFocus;
          Exit;
        end
      else
        begin
          FormLogin.Enabled := false;

          Case Nivel of

              0:
              begin
              MenuCorp.FMCorp.imgCompra.enabled := false;
              MenuCorp.FMCorp.imgEmpresa.enabled := true;
              MenuCorp.FMCorp.imgRecursos.enabled:= true;
              end;
              1:
              begin
              MenuCorp.FMCorp.imgCompra.enabled :=true;
              MenuCorp.FMCorp.imgEmpresa.enabled := true;
              MenuCorp.FMCorp.imgRecursos.enabled := true;
              end;
              2:
              begin
              MenuCorp.FMCorp.imgCompra.enabled :=true;
              MenuCorp.FMCorp.imgEmpresa.enabled := true;
              MenuCorp.FMCorp.imgRecursos.enabled := false;
              end;
              3:
              begin
              MenuCorp.FMCorp.imgCompra.enabled :=true;
              MenuCorp.FMCorp.imgEmpresa.enabled := true;
              MenuCorp.FMCorp.imgRecursos.enabled := true;
              end;
           else
            ShowMessage ( 'no tiene privilegios' );
          end;

           FMCorp.Visible := true;
        end;
  end;

AgustinOrtu 15-06-2016 17:50:08

Los query no suelen ser case-sensitive por defecto y MySQL no es la excepción. Debes convertir los string usando collates.

Fuente

Casimiro Notevi 15-06-2016 18:34:10

Cita:

Empezado por abelantonio (Mensaje 506199)
Buen dia Colegas!!

Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)

Y recuerda poner los tags al código fuente, ejemplo:



Gracias :)

abelantonio 15-06-2016 18:47:25

como convertiria los strings a collates? la verdad aun no domino delphi estoy iniciando...les agradeceria su ayuda :)

roman 15-06-2016 18:48:28

Aunque la búsqueda puede ser insensible a mayúsculas y minúsculas, dependiendo del collate usado, los valores almacenados en la base se regresan tal como fueron capturados. Entonces, en lugar de buscar un usuario con nombre de usuario y contraseña determinada, puedes simplemente buscarlo por nombre de usuario y comparar las contraseñas en tu código delphi. Algo así:

Código Delphi [-]
FMCorp.qry_login.SQL.Add('Select usuario, contrasenia, NombreUsuario, NivelUsuario from login where usuario=' + QuotedStr(txtUsuario.Text));
FMCorp.qry_login.Open;

if FMCorp.qry_login.FieldByName('contrasenia').AsString = txtPass.Text then
begin
    // La contraseña es correcta
end;

LineComment Saludos

bitbow 15-06-2016 19:08:58

What, en que momento sucedio esto? Ok, basicamente esto es configuración de tu base de datos o tabla, esto no deberia de ser necesario ya que por logica "ABC" no es igual "abc", sunpogo que en algún punto los estandares SQL se orientaron menos a la logica y mas a las necesidades comunes tratando de facilitar las consultas "upper(campo) no veo mayor problema pero bueno".

El tema en distintas bases de datos es la definición de la base o las tablas definiendo el "COLLATE", puede variar dependiendo de la base de datos y ya en las cosultas se puede aplicar la sentencia si queremos o no distinguir mayusculas y minusculas.

Tomado de desarrollo web.

Código SQL [-]
 -- distinguir mayusculas, minusculas y acentos mysql
-- MySQL >> 
select * from tabla WHERE campo COLLATE utf8_bin ='UnTexto'


Saludos.

abelantonio 15-06-2016 19:26:31

si me funciono tu ayuda #roman para acceder....pero el detalle es que no es sensible a mayusculas y minusculas y eso es lo que quiero realizar...alguna idea? ando un poco deshubicado con esto de la sensibilidad de mayusculas y minusculas. se los agradeceria mucho en verdad :)

AgustinOrtu 15-06-2016 19:45:13

Podes comparar los string usando la funcion AnsiCompareStr

abelantonio 15-06-2016 20:31:44

Comienzan
// comparar dos cadenas obviamente diferentes
CompareStrings ( "Hola", "mundo"); // comparar cadenas idénticas CompareStrings ( 'Hola 2 tú "," Hola 2 le'); // Las letras mayúsculas siguen minúsculas en Delphi CompareStrings ( 'ABC', 'abc'); // Todas las cartas siguen los números en Delphi CompareStrings ( 'abc', '123'); fin; // Compara dos cadenas, y mostrar que es más grande que los otros TForm1.CompareStrings procedimiento ( cadena1 const, string2: string); var resultado: Integer; comience // Compara algunas cadenas resultado: = AnsiCompareStr (cadena1, cadena2); si el resultado <0 entonces ShowMessage (cadena1 + '<' + cadena2); si el resultado = 0 entonces ShowMessage (cadena1 + '=' + cadena2); si el resultado> 0 entonces ShowMessage (cadena1 + '>' + cadena2); fin;


No entendi como aplicarlo al codigo del login y que sea sensible a las mayusculas y minusculas...no hubico como compararlos...alguien podria ayudarme.

if FMCorp.qry_login.FieldByName('contrasenia').AsString = txtPass.Text then
begin
MessageBox(Handle, 'La contraseña es correcta!', 'LoyalCorp', MB_ICONINFORMATION+MB_OK);

este codigo no funciona para la sensibilidad de mayusculas y minusculas.

bitbow 15-06-2016 20:36:49

Te puse un ejemplo de cómo hacerlo en el query, si el query no te devuelve registros es que no coincide la contraseña.

Saludos.

ecfisa 15-06-2016 20:37:10

Hola abelantonio.

Revisa esta sugerencia

Saludos y gracias por tu colaboración :)


La franja horaria es GMT +2. Ahora son las 19:00:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi