Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Problema con caracteres especiales como primer caracter de las búsquedas.

Estas en el tema de Problema con caracteres especiales como primer caracter de las búsquedas. en el foro de Mysql en Foros del Web. Hola a todos, Tengo un problema para realizar algunas búsquedas en MySql que no se muy bien como arreglar, la única forma que me ha ...
  #1 (permalink)  
Antiguo 29/12/2010, 06:35
 
Fecha de Ingreso: junio-2008
Mensajes: 145
Antigüedad: 15 años, 10 meses
Puntos: 0
Problema con caracteres especiales como primer caracter de las búsquedas.

Hola a todos,

Tengo un problema para realizar algunas búsquedas en MySql que no se muy bien como arreglar, la única forma que me ha funcionado hasta ahora es demasiado compleja y depende más de PHP que de MySql así que imagino que debe haber una forma más sencilla de hacerlo directamente en MySql.

El problema que tengo es el siguiente tengo una base de datos de películas y una búsqueda alfanúmerica en PHP, cuando el título de las películas empieza por un número o por una letra ambas búsquedas funcionan perfecamente pero a veces el título empieza por un signo de interrogación, paréntesis, etc y tengo que "parchearlo". En la búsqueda alfabética es relativamente fácil y sólo tengo que hacer algunos apaños como variables de PHP pero en la búsqueda númerica me saldrían muchísimas más líneas de código por lo que me imagino que habrá alguna forma mejor de solucionarlo.


El código actual es el siguiente y me encuentra todas las películas que comienzen por 0,1,2,3,4,5,6,7,8 o 9:

$sql = "Select * from peliculas WHERE Titulo RLIKE '^[0-9].*' ";

Lo que yo quiero es que me busque no sólo las que comienzen por esos números sino las que comienzen por (, ¿, " o ¡ y justo después venga cualquiera de esos números pero no encuentro una forma limpia de hacerlo. La única que se me había ocurrido hasta ahora era crear variables en PHP con los valores posibles: (0, (1, etc y encadenar las consultas usando OR pero tiene que haber una manera mejor, esta es la única manera que se me ha ocurrido hasta ahora y que funciona.

$parentesis = chr(40);
$n1 = $parentesis."1";
$sql = "Select * from peliculas WHERE Titulo like '" .$n1. "%' OR Titulo RLIKE '^[0-9].*' ";

Si podéis ayudarme o darme alguna pista de como hacerlo de forma más fácil os lo agradecería mucho.
  #2 (permalink)  
Antiguo 29/12/2010, 15:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Problema con caracteres especiales como primer caracter de las búsquedas.

Prueba con expresiones regulares como esta (que buscará los registros cuya cadena de texto empiece por interrogación y esté seguido de uno o varios números):
SELECT campo FROM tutabla WHERE campo REGEXP '^\\?[0-9]*'

acuérdate de que para buscar caracteres usados por regexp, es el caso de ( y ?, debes anteponer una doble contrabarra. Haz algunas pruebas.
  #3 (permalink)  
Antiguo 30/12/2010, 05:23
 
Fecha de Ingreso: junio-2008
Mensajes: 145
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con caracteres especiales como primer caracter de las búsquedas.

Muchas gracias por responder jurena, he intentado hacerlo como tu me has dicho o eso creo pero los resultados han sido algo extraños.

He probado a buscar películas que comiencen por un signo de interrogación "¿" y justo después vaya un número del 0 al 9 y me ha encontrado no sólo las películas cuyo título comenzaba por interrogación y el siguiente caracter era un número sino también películas que tienen un caracter no numérico después del "¿", es decir es como si la prioridad fuera el "¿" y me ignorase lo que sigue después. Esta es la forma en la que lo he escrito.

SELECT * FROM peliculas WHERE Titulo REGEXP '^\\¿[0-9]*' ";

Después he intentado que me encontrase las películas que comenzasen por "(" y un número pero me ha dado el siguiente error: "Got error 'parentheses not balanced' from regexp" y no se como arreglarlo. Estos es lo que he escrito:

SELECT * FROM peliculas WHERE Titulo REGEXP '^\\([0-9]*' ";

He intentado "equilibrar" los paréntesis poniendo el paréntesis de cierre después del corchete o después del asterisco pero me encuentra todos los archivos de la base de datos. Esto es lo que he intentado:

SELECT * FROM peliculas WHERE Titulo REGEXP '^\\([0-9])*' ";
SELECT * FROM peliculas WHERE Titulo REGEXP '^\\([0-9]*)' ";

Además el problema que hay es que yo no se en que parte del título de la película se va a cerrar el parentésis por ejemplo en "(500) días juntos" se cierrar justo después de los números pero en otros casos podría ocupar todo el título yo que se, la verdad es que parece bastante complicado.

Se que esto tiene que ver igual más con PHP pero ¿crees que sería posible introducir las variables con el valor de "¿", "(" o "¡" justo antes del [0-9] de manera limpia? Quizás de esa forma podríamos evitar que MySql tomara estos valores de la forma que los toma. Es decir ¿podría meter una variable $interrogante justo antes del [0-9]?

He intentado esto pero no me muestra ningún resultado:

SELECT * FROM peliculas WHERE Titulo REGEXP '^\\'".$parentesis."[0-9]*)' ";
  #4 (permalink)  
Antiguo 30/12/2010, 11:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Problema con caracteres especiales como primer caracter de las búsquedas.

llevas razón, y la explicación es que usé el asterisco tras la referencia al número para indicar ningún número o cualquier cantidad de números. Verás que esto de abajo busca en tu tabla un título que comienza por paréntesis y luego un número. A mí me funciona; compruébalo tú. Debes hacer las consultas sólo de manera directa en la base y comprobar que eso funciona. Luego vendrán los problemas de sintaxis de PHP, que deberás resolver en el foro de PHP. También allí te orientarán sobre lo que quieres. De todas formas, haz primero algunas pruebas.

SELECT * FROM peliculas WHERE Titulo REGEXP '^\\([0-9]{1}'

Primero debes aprender a usar la sintaxis de las expresiones regulares en la base.
  #5 (permalink)  
Antiguo 31/12/2010, 08:15
 
Fecha de Ingreso: junio-2008
Mensajes: 145
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con caracteres especiales como primer caracter de las búsquedas.

Hola de nuevo jurena, gracias por tu paciencia y por tu explicación del funcionamiento del * y los corchetes con el número en esa posición, lo he probado de nuevo tanto para titulos que empiezan con paréntesis y número como con títulos que empiezan con signo de interrogación y número y aunque con la interrogación funciona perfectamente con paréntesis me sigue mostrando el error "Got error 'parentheses not balanced' from regexp".

La versión de PHP que tengo es la 5.3.1 y la versión de MySql la 5.1.41 no se si esto puede tener algo que ver.

He intentado buscar sobre ese error específico en Internet pero aún no he conseguido encontrar nada que me sirva.

Sobre lo que debo de aprendar a usar primero las expresiones regulares e ir poco a poco probando las cosas tienes razón, últimamente he estado más metido en temas de diseño web que de programación y bases de datos y lo tengo todo un poco olvidado, poco a poco me voy acordando de cosas.

He ido a la web oficial de MySql y he visto la versión en Pdf del manual así que intentaré mirar a fondo la parte de REGEXP a ver si veo que es lo que falla.

Estas son las sentencias que he probado hasta ahora:

SELECT * FROM peliculas WHERE Titulo REGEXP '^\\([0-9]{1}'

Me da el error antes mencionado. El problema parece estar en el paréntesis de apertura ya que he probado a buscar todas las películas que comiencen por "(" usando esta consulta:

SELECT * FROM peliculas WHERE Titulo REGEXP '^('

Y me da el mismo error "Got error 'parentheses not balanced' from regexp".
Sin embargo si uso el paréntesis de cierre ")" funciona perfectamente.
La consulta que me dijiste usando el signo de interrogación de apertura:

SELECT * FROM peliculas WHERE Titulo REGEXP '^\\¿[0-9]{1}'

también funciona perfectamente, me encuentra solamenta las películas cuyo primer caracter es "¿" y el siguiente un número.


Bueno de momento estas son las pruebas que he realizado, esta tarde y mañana andaré liado así que sólo me queda desearte a ti y a todos los demás miembros de forosdelweb un feliz año nuevo.


¡Espero que después de Nochevieja se me ocurra alguna forma de arreglarlo!
  #6 (permalink)  
Antiguo 31/12/2010, 08:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Problema con caracteres especiales como primer caracter de las búsquedas.

Yo estoy usando
SELECT * FROM tutabla WHERE dato REGEXP '^\\([0-9]{1}'
en MySQL Query Browser y me localiza los títulos que comienzan por (1, por poner un ejemplo.
Dinos con qué buscas y si lo estás probando directamente en la base o a través de PHP.
  #7 (permalink)  
Antiguo 31/12/2010, 09:58
 
Fecha de Ingreso: junio-2008
Mensajes: 145
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con caracteres especiales como primer caracter de las búsquedas.

Estoy haciendo la consulta en un archivo de php llamado "buscarporletra.php". En la parte superior del archivo recojo el valor de la variable letra en estos casos "0", compruebo si existen variables de sesión, cuantas páginas de resultados hay en que página estoy, etc.

Estoy usando XAMPP para Windows, estos son los datos que me da el readme:

Apache Friends XAMPP (Basis Package) version 1.7.3

+ Apache 2.2.14 (IPV6 enabled)
+ MySQL 5.1.41 (Community Server) with PBXT engine 1.0.09-rc
+ PHP 5.3.1 (PEAR, Mail_Mime, MDB2, Zend)

Actualmente lo que hago es iniciar Apache y MySql y probar en local, usando los archivos de PHP, desde index.php pulso en el hipervínculo que busca las películas que comienzan por un número es decir el enlace que me lleva a "buscarporletra.php?letra=0" capturo la letra, le aplico un htmlentities y meto su valor en una variable de sesión:

Código PHP:
$letra htmlentities($letra);
$_SESSION["letra"] = $letra
Después realizo la conexión a la base de datos de las películas y si el valor de la variable $letra es "0" ejecuto la búsqueda que he hecho arriba:

Código PHP:
$conectar mysql_connect("localhost","root","") or die("Problemas en la conexion");
mysql_select_db("peliculas"$conectar) or  die("Problemas en la selección de la base de datos");

if (
$letra == "0" ){
$sql "SELECT * FROM peliculas WHERE Titulo REGEXP '^\\([0-9]{1}' ";
... 
He probado a hacerlo sin el htmlentities pero tampoco funciona.
  #8 (permalink)  
Antiguo 31/12/2010, 10:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Problema con caracteres especiales como primer caracter de las búsquedas.

Me huele a problema con las contrabarras. Pero por qué no realizas la consulta en el búsquedas del Xamp directamente y no a través del archivo PhP tuyo. Intenta lanzar la consulta como te he dicho, pero en ese consultas del PHPMyAdmin, y luego nos dices si funciona o no.
  #9 (permalink)  
Antiguo 31/12/2010, 10:54
 
Fecha de Ingreso: junio-2008
Mensajes: 145
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con caracteres especiales como primer caracter de las búsquedas.

Hola otra vez lo he probado tal cual en phpMyadmin

SELECT * FROM peliculas WHERE Titulo REGEXP '^\\([0-9]{1}'

y funciona perfectamente me encuentra la película sin darme ningún error así que como tú dices el problema debe ser de las contrabarras. ¿Quizás debería preguntarlo en el foro de PHP para intentar encontrar alguna forma de "parchaerlo" mediante PHP?

Etiquetas: caracteres, especiales, primer
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 01:29.