Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Buscar con PHP en MySQL palabras acentuadas

Estas en el tema de Buscar con PHP en MySQL palabras acentuadas en el foro de PHP en Foros del Web. Tengo la siguiente instrucción para buscar dentro de MySQL: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $buscar = "José" ; $consulta = mysql_query ( "SELECT a.llave, ...
  #1 (permalink)  
Antiguo 09/10/2013, 03:32
 
Fecha de Ingreso: enero-2002
Mensajes: 1.137
Antigüedad: 17 años, 10 meses
Puntos: 19
Buscar con PHP en MySQL palabras acentuadas

Tengo la siguiente instrucción para buscar dentro de MySQL:


Código PHP:
Ver original
  1. $buscar = "José";
  2. $consulta = mysql_query("SELECT a.llave, a.nombre
  3. FROM empleados a
  4. WHERE a.nombre LIKE '$buscar%' ", $link) or die ("No ejecutado");

Tengo definida mi tabla con Cotejamiento latin1_general_ci
y en mi programa PHP:

Código HTML:
Ver original
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Y la consulta me regresa los que inician con José pero no muestra los que no tienen acento como: Jose

He buscado y leído muchas ayudas, pero no he podido resolverlo.

Agradeceré ayuda al respecto.
  #2 (permalink)  
Antiguo 09/10/2013, 08:32
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 9 años, 6 meses
Puntos: 95
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Usa expresiones regulares:

SELECT * FROM Personas P WHERE P.Nombre REGEXP 'Jos[eé]';

Lo que hace es que va a seleccionar a todos los campos que contengan Jose o Josek
  #3 (permalink)  
Antiguo 09/10/2013, 09:28
 
Fecha de Ingreso: enero-2002
Mensajes: 1.137
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Interesante respuesta, pero, ¿y como vas a buscar el caso de:

Jose, José, Josè, Josê, Josë,
Jóse, Jôse, Jòse, Jöse
¿... y con las otras vocales que se acentúan, y con las eñes ?

El tipo de búsqueda que deseo debe ser eficiente ya que será utilizada de manera constante y no deseo sobrecargar el servidor.

Gracias
  #4 (permalink)  
Antiguo 09/10/2013, 09:36
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 3 meses
Puntos: 396
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Hola, el uso de expresiones regulares para las búsquedas me parece impropio ya que si las tablas tienen muchos registros el script consumira mucho tiempo procesando la consulta...

Te recomiendo que uses utf8_general_ci personalmente lo uso y no he tenido problemas buscando acentos.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #5 (permalink)  
Antiguo 09/10/2013, 10:36
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 9 años, 6 meses
Puntos: 95
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Cita:
Iniciado por jonni09lo Ver Mensaje
Hola, el uso de expresiones regulares para las búsquedas me parece impropio ya que si las tablas tienen muchos registros el script consumira mucho tiempo procesando la consulta...

Te recomiendo que uses utf8_general_ci personalmente lo uso y no he tenido problemas buscando acentos.

Saludos
Define "muchos" registros, y "mucho tiempo".

Yo he utilizado expresiones regulares en tablas con millones de registros y las consultas se ejecutan en milisegundos, si es cierto que no son tan rápidas como un indice primario, pero que otra alternativa propones?

Si no quieres utilizar expresiones regulares en MySQL, entonces podrias hacer otra columna con el nombre normalizado utilizando solamente caracteres del alfabeto latino (o cualquier alfabeto que quieras) y busca esa columna.

Por ejemplo algo asi:

Nombre, NombreCanonico
José, Jose
Jöse, Jose
Jœsë, Jose

Y cuando busques, utilizas:

Código SQL:
Ver original
  1. SELECT N.Nombre FROM Nombres N WHERE N.NombreCanonico = "Jose";

Este tipo de soluciones las utilizan en Spotify ya que Spotify permite nombre de usuarios con todos los caracteres de UTF8
  #6 (permalink)  
Antiguo 09/10/2013, 10:41
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 3 meses
Puntos: 396
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Cita:
Iniciado por AlanChavez Ver Mensaje
Define "muchos" registros, y "mucho tiempo".

Yo he utilizado expresiones regulares en tablas con millones de registros y las consultas se ejecutan en milisegundos, si es cierto que no son tan rápidas como un indice primario, pero que otra alternativa propones?

Si no quieres utilizar expresiones regulares en MySQL, entonces podrias hacer otra columna con el nombre normalizado utilizando solamente caracteres del alfabeto latino (o cualquier alfabeto que quieras) y busca esa columna.

Por ejemplo puedes las columnas:

Nombre, NombreCanonico
José, Jose
Jöse, Jose
Jœsë, Jose

Y cuando busques, utilizas:

SELECT N.Nombre FROM Nombres N WHERE N.NombreCanonico = "Jose";
Viste mi solución?

Por eso dije que es impropio, porque en vez de reinventar la rueda simplemente con cambiar el COLLATE de la tabla basta y sobra y no hay que dar tantas vueltas.

Incluso con que añada COLLATE utf8_general_ci al final de la consulta no necesita hacer el cambio directamente en la tabla.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #7 (permalink)  
Antiguo 09/10/2013, 10:49
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 9 años, 6 meses
Puntos: 95
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Cita:
Iniciado por jonni09lo Ver Mensaje
Viste mi solución?

Por eso dije que es impropio, porque en vez de reinventar la rueda simplemente con cambiar el COLLATE de la tabla basta y sobra y no hay que dar tantas vueltas.

Incluso con que añada COLLATE utf8_general_ci al final de la consulta no necesita hacer el cambio directamente en la tabla.

Saludos
al utilizar utf8_general_ci sin canonizar tus nombres de usuario o nombres de personas

la cadena de texto:

ᴮᴵᴳᴮᴵᴿᴰ y bigbird pueden ser potencialmente las mismas (dependiendo de como trates las cadenas) por lo tanto tu aplicacion puede ser vulnerable a ataques de elevacion de privilegios.

Asi fue como hackearon Spotify y la solucion que implementaron fue precisamente la que propongo (obviamente mas elaborada).

Última edición por AlanChavez; 09/10/2013 a las 11:00
  #8 (permalink)  
Antiguo 09/10/2013, 11:05
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 3 meses
Puntos: 396
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Buen, me empape del tema de elevación de permisos (aunque encontre fue concerniente a Linux pero se capta la idea)... Puedes proporcionar un ejemplo de como podría afectar en MySql este tipo de ataque?

Si es como dices, estoy totalmente de acuerdo con tus soluciones.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #9 (permalink)  
Antiguo 09/10/2013, 11:16
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 9 años, 6 meses
Puntos: 95
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Cita:
Iniciado por jonni09lo Ver Mensaje
Buen, me empape del tema de elevación de permisos (aunque encontre fue concerniente a Linux pero se capta la idea)... Puedes proporcionar un ejemplo de como podría afectar en MySql este tipo de ataque?

Si es como dices, estoy totalmente de acuerdo con tus soluciones.

Saludos
Bueno el concepto, de elevacion de privilegios se puede aplicar en cualquier aplicacion que implemente un control de usuarios o ACL y tiene que ver con la autentificacion y autorizacion de usuarios.

Que un usuario este autentificado en tu sistema, no significa que este autorizado para hacer ciertas acciones.

Por ejemplo, los usuarios regulares del foro no tienen acceso a herramientas de moderacion (como borrar o cerrar temas). A pesar de que los usuarios regulares esten autentificados, no estan autorizados.

Cuando elevas los privilegios en una aplicacion web, es por ejemplo que yo con mi usuario normal poder accesar al panel de control que cvander tiene acceso, sin tener el nivel de "Admin", por lo tanto eleve mis privilegios.

Por ejemplo, si la siguiente consulta

SELECT * FROM Usuarios U WHERE U.Usuario = "Jose"

Regresa los resultados:
José
Jose

Tu aplicacion puede ser vulnerable a elevacion de privilegios con cadenas como: ádmin, admīn, ädmin, etc..
  #10 (permalink)  
Antiguo 09/10/2013, 12:13
 
Fecha de Ingreso: enero-2002
Mensajes: 1.137
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Cita:
Iniciado por jonni09lo Ver Mensaje
Te recomiendo que uses utf8_general_ci personalmente lo uso y no he tenido problemas buscando acentos.

Saludos
He cambiado mi tabla a utf8_general_ci pero sigue sin mostrar lo que tiene acentos.

¿que estará pasando?
¿Donde puedo leer un ejemplo que explique este caso en particular?

Me sería de mucha utilidad cualquier ayuda.
Gracias
  #11 (permalink)  
Antiguo 09/10/2013, 12:19
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 3 meses
Puntos: 396
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Acuérdate de que si cambias el COLLATE de la tabla, los campos normalmente mantienen el COLLATE anterior y para que lo de utf8_general_ci funciones los campos también deben estar con este COLLATE

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #12 (permalink)  
Antiguo 09/10/2013, 12:25
 
Fecha de Ingreso: enero-2002
Mensajes: 1.137
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Se ha modificado el Cotejamiento de la tabla y de los campos.
Al cambiar el Cotejamiento de la tabla, el cotejamiento de los campos se mantiene, por lo que los he modificado de uno por uno.

Pero sigo sin obtener la consulta de los acentuados.

Gracias
  #13 (permalink)  
Antiguo 10/10/2013, 11:42
 
Fecha de Ingreso: enero-2002
Mensajes: 1.137
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Recordando mi petición:

¿Algun tutorial para búsqueda de palabras acentuadas PHP/MySQL?
Me inclino por la línea de Cotejamiento.

Gracias anticipadas.
  #14 (permalink)  
Antiguo 10/10/2013, 11:52
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 3 meses
Puntos: 396
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Hola te comento, creé una base de datos con latin1_general_ci una tabla con dos campos, luego cambié el COLLATE de la tabla y de los dos campos a utf8_general_ci

Hice las siguientes pruebas

Registro: Jose

Búsqueda por josé y jose y ambos me retornaron el mismo registro

Registro: José

Búsqueda por josé y jose y ambos me retornaron el mismo registro

Así que me parece sumamente extraño que la consulta no te funcione...

Dime que usas mysql_* mysqli_* o PDO para conectarte a la base de datos.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #15 (permalink)  
Antiguo 10/10/2013, 12:12
 
Fecha de Ingreso: enero-2002
Mensajes: 1.137
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Cita:
Iniciado por jonni09lo Ver Mensaje
Hola te comento, creé una base de datos con latin1_general_ci una tabla con dos campos, luego cambié el COLLATE de la tabla y de los dos campos a utf8_general_ci

Hice las siguientes pruebas

Registro: Jose

Búsqueda por josé y jose y ambos me retornaron el mismo registro

Registro: José

Búsqueda por josé y jose y ambos me retornaron el mismo registro

Así que me parece sumamente extraño que la consulta no te funcione...

Dime que usas mysql_* mysqli_* o PDO para conectarte a la base de datos.

Saludos

Lo haré exactamente como indicas. Muchas gracias.
  #16 (permalink)  
Antiguo 11/10/2013, 01:14
 
Fecha de Ingreso: enero-2002
Mensajes: 1.137
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Estimado jonni09lo, ya trabaja perfecto. Para resolverlo hice lo siguiente:

1.- La tabla es: latin1_general_ci
2.- Los campos son: utf8_general_ci
3.- En el <Head> coloqué: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" >

Ahora trabaja perfecto,

Gracias
  #17 (permalink)  
Antiguo 11/10/2013, 08:10
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 3 meses
Puntos: 396
Respuesta: Buscar con PHP en MySQL palabras acentuadas

Me alegro que te haya servido

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.

Etiquetas: html, mysql, palabras, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:09.