Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] recuperar valores con acento en la primera letra

Estas en el tema de recuperar valores con acento en la primera letra en el foro de PHP en Foros del Web. Hola, Estoy intentanto crear una página con una lista alfabética, de tal forma que cuando el usuario pincha en una letra obtiene todos los valores ...
  #1 (permalink)  
Antiguo 31/08/2015, 05:50
 
Fecha de Ingreso: agosto-2015
Mensajes: 21
Antigüedad: 9 años, 3 meses
Puntos: 1
recuperar valores con acento en la primera letra

Hola,

Estoy intentanto crear una página con una lista alfabética, de tal forma que cuando el usuario pincha en una letra obtiene todos los valores que empiezan por esa letra. Es decir, algo así:

A B C D E F G ...

(al pinchar en la A aparecería algo del tipo:)

Abelardo
Ana
Aníbal
...

El problema me surge con valores que empiezan por acento (por ejemplo: Álvaro), pues éstos no me aparecen en la lista.

El código que he creado es el siguiente:

Código PHP:
Ver original
  1. <?php
  2.                     //conexión con mi base de datos
  3.                                         include 'connection.php';
  4.                     doDB();
  5.                    
  6.                                         //lista alfabética
  7.                     $display_block = "<p align=\"center\">
  8.                         <a href=\"search_by_title.php?letter=A\"> A </a>
  9.                         <a href=\"search_by_title.php?letter=B\"> B </a>
  10.                         <a href=\"search_by_title.php?letter=C\"> C </a>
  11.                         <a href=\"search_by_title.php?letter=D\"> D </a>
  12.                         <a href=\"search_by_title.php?letter=E\"> E </a>
  13.                         <a href=\"search_by_title.php?letter=F\"> F </a>
  14.                         <a href=\"search_by_title.php?letter=G\"> G </a>
  15.                         <a href=\"search_by_title.php?letter=H\"> H </a>
  16.                         <a href=\"search_by_title.php?letter=I\"> I </a>
  17.                         <a href=\"search_by_title.php?letter=J\"> J </a>
  18.                         <a href=\"search_by_title.php?letter=K\"> K </a>
  19.                         <a href=\"search_by_title.php?letter=L\"> L </a>
  20.                         <a href=\"search_by_title.php?letter=M\"> M </a>
  21.                         <a href=\"search_by_title.php?letter=N\"> N </a>
  22.                         <a href=\"search_by_title.php?letter=O\"> O </a>
  23.                         <a href=\"search_by_title.php?letter=P\"> P </a>
  24.                         <a href=\"search_by_title.php?letter=Q\"> Q </a>
  25.                         <a href=\"search_by_title.php?letter=R\"> R </a>
  26.                         <a href=\"search_by_title.php?letter=S\"> S </a>
  27.                         <a href=\"search_by_title.php?letter=T\"> T </a>
  28.                         <a href=\"search_by_title.php?letter=U\"> U </a>
  29.                         <a href=\"search_by_title.php?letter=V\"> V </a>
  30.                         <a href=\"search_by_title.php?letter=X\"> X </a>
  31.                         <a href=\"search_by_title.php?letter=Z\"> Z </a>
  32.                         </p>";
  33.                    
  34.                     if ($_GET) {
  35.                    
  36.                     $letter = $_GET['letter'];
  37.                     $get_songs_sql = "SELECT song_title FROM songs WHERE song_title REGEXP '^$letter'";
  38.                     $get_songs_res = mysqli_query($mysqli, $get_songs_sql) or die (mysqli_error($mysqli));
  39.                     $number_of_results = mysqli_num_rows($get_songs_res);
  40.                    
  41.                     $display_block .= "<p style=\"font-size:15px\"><em>Se encontraron ".$number_of_results." resultados:</em></p>";
  42.        
  43.                         while ($song_info = mysqli_fetch_array($get_songs_res)) {
  44.                             $song_title = $song_info['song_title'];
  45.                             $display_block .= "$song_title<br/>";
  46.                            
  47.                         }
  48.                        
  49.                         mysqli_free_result($get_songs_res);
  50.                        
  51.                         }
  52.                    
  53.                     echo $display_block;
  54.                    
  55.                     mysqli_close($mysqli);
  56.        
  57.                 ?>

He decidido preguntar en el foro de Mysql (y no en el de PHP) porque entiendo que la solución estaría editando de alguna forma la parte de consulta SQL (en concreto, la expresión regular):

Código PHP:
Ver original
  1. $get_songs_sql = "SELECT song_title FROM songs WHERE song_title REGEXP '^$letter'";

Mis disculpas si no es así.

Alguna sugerencia?
  #2 (permalink)  
Antiguo 31/08/2015, 05:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: recuperar valores con acento en la primera letra

Cita:
He decidido preguntar en el foro de Mysql (y no en el de PHP) porque entiendo que la solución estaría editando de alguna forma la parte de consulta SQL (en concreto, la expresión regular):
Error: El resultado de la consulta en MySQL está fuertemente atado al manejo de charset que hagas desde PHP, ya que MYSQL sólo puede controlar lo que tiene almacenado, pero si las cadenas a buscar llgan corruptas desde PHP por un inadecuado manejo del CHARSET, MySQL no lo pude solucionar.

Este tema es un tema recurrente. Se ha tratado muchísimas veces en ambos foros y el 99% de las veces los problemas están del lado de PHP.

Por otro lado, si te fijas en las reglas de los foros de BBDD, no se permite poner codigo de programación en los foros de BBDD. Sólo se tratan temas estrictamente de SQL (que no los hay en tu query, es correcta) y Administracion de BBDD. Programación es OFF TOPIC.

Movido a PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 31/08/2015, 07:10
 
Fecha de Ingreso: agosto-2015
Mensajes: 21
Antigüedad: 9 años, 3 meses
Puntos: 1
Respuesta: recuperar valores con acento en la primera letra

Ok. Mis disculpas y tomo nota para la próxima vez.
  #4 (permalink)  
Antiguo 31/08/2015, 08:26
Avatar de Fleon  
Fecha de Ingreso: febrero-2010
Mensajes: 138
Antigüedad: 14 años, 10 meses
Puntos: 3
Respuesta: recuperar valores con acento en la primera letra

Prueba de la siguiente manera:

Código PHP:
Ver original
  1. $acentos = array(
  2.   'a' => 'a|á',
  3.   'e' => 'e|é',
  4.   'i' => 'i|í',
  5.   'o' => 'o|ó',
  6.   'u' => 'u|ú',
  7. );
  8.  
  9. $letter = in_array($_GET['letter'],array_keys($acentos)) ? $acentos[$_GET['letter']]: $_GET['letter'];
  10.  
  11. //Más abajo tu código...

Saludos.
  #5 (permalink)  
Antiguo 31/08/2015, 13:04
 
Fecha de Ingreso: agosto-2015
Mensajes: 21
Antigüedad: 9 años, 3 meses
Puntos: 1
Respuesta: recuperar valores con acento en la primera letra

Gracias, Fleon. Funciona perfectamente.

Para poderlo aplicar en el futuro, me gustaría poder entender bien tu propuesta. Comprendo la creación del array y he consultado en el manual PHP las funciones in_array y array_keys, pero aún así no acabo de entender del todo la lógica que está detrás del código:

Código PHP:
Ver original
  1. $letter = in_array($_GET['letter'],array_keys($acentos)) ? $acentos[$_GET['letter']]: $_GET['letter'];
  #6 (permalink)  
Antiguo 31/08/2015, 14:50
Avatar de Fleon  
Fecha de Ingreso: febrero-2010
Mensajes: 138
Antigüedad: 14 años, 10 meses
Puntos: 3
Respuesta: recuperar valores con acento en la primera letra

Pues sencillo:

in_array, lo que hace es verificar si un valor dado está dentro de un array especificado,
array_keys, quiere decir que solo trabaje con las claves del array, asi no busca tanto en las claves como valores, en seudónimo:

busco $_GET en las claves del array $acentos, si es verdadero pues devuelvo el valor del array con la clave que coincide con $_GET de lo contrario me devuelva $_GET, que en este caso serían los números, consonantes y caractere especiales, el código anterior equivale:

Código PHP:
Ver original
  1. http://www.pagina.com/index.php?letter=b
  2.  
  3. //$_GET['letter'] = 'b';
  4.  
  5. $letter = in_array('b',array('a','e','i','o','u')) ? $acentos['b'] : 'b'; //como b no esta en el array simplemente devolvemos la letra b
  6.  
  7. http://www.pagina.com/index.php?letter=i
  8.  
  9. //$_GET['letter'] = 'i';
  10.  
  11. $letter = in_array('i',array('a','e','i','o','u')) ? $acentos['i'] : 'i'; //como i sí está en el array entonces devolvemos el valor de la clave "i" que es 'i|í' que en expresiones regulares significa que buscará tanto como i sin tilde que con tilde.

Espero te sea de aclaracón,

Saludos.
  #7 (permalink)  
Antiguo 31/08/2015, 15:14
Avatar de Fleon  
Fecha de Ingreso: febrero-2010
Mensajes: 138
Antigüedad: 14 años, 10 meses
Puntos: 3
Respuesta: recuperar valores con acento en la primera letra

También podemos ampliar el array acento incluyendo los caracteres especiales de HTML por si las moscas:

Código PHP:
Ver original
  1. $acentos = array(
  2.   'a' => 'a|á|&atilde;',
  3.   'e' => 'e|é|&etilde;',
  4.   'i' => 'i|í|&itilde;',
  5.   'o' => 'o|ó|&otilde;',
  6.   'u' => 'u|ú|&utilde;',
  7. )
;

Saludos.
  #8 (permalink)  
Antiguo 01/09/2015, 01:50
 
Fecha de Ingreso: agosto-2015
Mensajes: 21
Antigüedad: 9 años, 3 meses
Puntos: 1
Respuesta: recuperar valores con acento en la primera letra

Muchas gracias de nuevo. Me ha quedado clarísimo!

Etiquetas: letra, mysql, primera, select, sql
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 14:01.